diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..aeefafe1226 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,54 @@ +* text=auto + +*.bat text +*.c text +*.cpp text +*.css text +*.ewp text +*.gdb text +*.h text +*.hex text +*.html text +*.htm text +*.icf text +*.inf text +*.ini text +*.ino text +*.java text +*.js text +*.mk text +*.ld text +*.lds text +*.pde text +*.pl text +*.po text +*.prefs text +*.project text +*.properties text +*.py text +*.s text +*.S text +*.sh text +*.svd text +*.svg text +*.txt text +*.uvproj text +*.uvopt text +*.xml text + +*.a binary +*.bmp binary +*.bz2 binary +*.dll binary +*.exe binary +*.ico binary +*.gz binary +*.jar binary +*.jpg binary +*.lib binary +*.o binary +*.pdf binary +*.png binary +*.so binary +*.tgz binary +*.zip binary diff --git a/.project b/.project index 0b76a40ba80..666006c4305 100644 --- a/.project +++ b/.project @@ -1,17 +1,17 @@ - - - processing-head - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - + + + processing-head + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/app/.classpath_vista b/app/.classpath_vista index c7ec5acb94c..8337a62a818 100644 --- a/app/.classpath_vista +++ b/app/.classpath_vista @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/app/.project b/app/.project index 69a82c3d004..78e91ccbbfa 100644 --- a/app/.project +++ b/app/.project @@ -1,17 +1,17 @@ - - - processing - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - + + + processing + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/app/src/processing/app/i18n/Resources_hu.po b/app/src/processing/app/i18n/Resources_hu.po index d4a7b41eb09..472f4cb9ee0 100644 --- a/app/src/processing/app/i18n/Resources_hu.po +++ b/app/src/processing/app/i18n/Resources_hu.po @@ -1,278 +1,278 @@ -# Hungarian translations for PACKAGE package. -# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Robert Cseh , 2012. -# +# Hungarian translations for PACKAGE package. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Robert Cseh , 2012. +# msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: Robert Cseh\n" -"POT-Creation-Date: 2012-04-03 10:24-0400\n" -"PO-Revision-Date: 2012-04-11 23:15-0400\n" -"Last-Translator: Robert Cseh \n" -"Language-Team: Hungarian\n" -"Language: hu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: Robert Cseh\n" +"POT-Creation-Date: 2012-04-03 10:24-0400\n" +"PO-Revision-Date: 2012-04-11 23:15-0400\n" +"Last-Translator: Robert Cseh \n" +"Language-Team: Hungarian\n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: Editor.java:366 msgid "No files were added to the sketch." -msgstr "Nem lett file hozzáadva a Sketch-hez." +msgstr "Nem lett file hozzáadva a Sketch-hez." #: Editor.java:369 Sketch.java:996 msgid "One file added to the sketch." -msgstr "Egy file a Sketch-hez hozzáadásra került." +msgstr "Egy file a Sketch-hez hozzáadásra került." #: Editor.java:373 #, java-format msgid "{0} files added to the sketch." -msgstr "{0} file a Sketch-hez hozzáadásra került." +msgstr "{0} file a Sketch-hez hozzáadásra került." #: Editor.java:484 msgid "File" -msgstr "File" +msgstr "File" #: Editor.java:486 EditorToolbar.java:41 msgid "New" -msgstr "Új" +msgstr "Új" #: Editor.java:494 Base.java:903 msgid "Open..." -msgstr "Megnyit..." +msgstr "Megnyit..." #: Editor.java:503 msgid "Sketchbook" -msgstr "SketchBook" +msgstr "SketchBook" #: Editor.java:509 msgid "Examples" -msgstr "Minták" +msgstr "Minták" #: Editor.java:514 Editor.java:1977 msgid "Close" -msgstr "Kilépés" +msgstr "Kilépés" #: Editor.java:522 Editor.java:2017 Editor.java:2421 EditorToolbar.java:41 #: EditorToolbar.java:46 msgid "Save" -msgstr "Mentés" +msgstr "Mentés" #: Editor.java:530 msgid "Save As..." -msgstr "Mentés másként..." +msgstr "Mentés másként..." #: Editor.java:538 EditorToolbar.java:41 msgid "Upload" -msgstr "Feltöltés" +msgstr "Feltöltés" #: Editor.java:546 EditorToolbar.java:46 msgid "Upload Using Programmer" -msgstr "Feltöltés programozóval" +msgstr "Feltöltés programozóval" #: Editor.java:556 msgid "Page Setup" -msgstr "Oldalbeállítás" +msgstr "Oldalbeállítás" #: Editor.java:564 msgid "Print" -msgstr "Nyomtatás" +msgstr "Nyomtatás" #: Editor.java:576 Preferences.java:279 msgid "Preferences" -msgstr "Beállítások" +msgstr "Beállítások" #: Editor.java:586 Base.java:782 msgid "Quit" -msgstr "Kilépés" +msgstr "Kilépés" #: Editor.java:600 msgid "Sketch" -msgstr "Sketch" +msgstr "Sketch" #: Editor.java:602 msgid "Verify / Compile" -msgstr "Ellenőrzés / Fordítás" +msgstr "Ellenőrzés / Fordítás" #: Editor.java:629 msgid "Import Library..." -msgstr "Függvény importálás..." +msgstr "Függvény importálás..." #: Editor.java:634 msgid "Show Sketch Folder" -msgstr "Sketch mappa mutatása" +msgstr "Sketch mappa mutatása" #: Editor.java:643 msgid "Add File..." -msgstr "File hozzáadása..." +msgstr "File hozzáadása..." #: Editor.java:656 msgid "Tools" -msgstr "Eszközök" +msgstr "Eszközök" #: Editor.java:662 EditorToolbar.java:41 EditorToolbar.java:46 msgid "Serial Monitor" -msgstr "Soros monitor" +msgstr "Soros monitor" #: Editor.java:682 msgid "Board" -msgstr "Alappanel" +msgstr "Alappanel" #: Editor.java:690 msgid "Serial Port" -msgstr "Soros port" +msgstr "Soros port" #: Editor.java:695 msgid "Programmer" -msgstr "Programozó" +msgstr "Programozó" #: Editor.java:699 msgid "Burn Bootloader" -msgstr "Bootloader beégetése" +msgstr "Bootloader beégetése" #: Editor.java:923 msgid "serialMenu is null" -msgstr "Üres a serialMenü" +msgstr "Üres a serialMenü" #: Editor.java:927 Editor.java:934 msgid "name is null" -msgstr "a név: üres(nincs megadva)" +msgstr "a név: üres(nincs megadva)" #: Editor.java:986 msgid "error retrieving port list" -msgstr "hiba a portlista lekérésekor" +msgstr "hiba a portlista lekérésekor" #: Editor.java:1002 msgid "Help" -msgstr "Súgó" +msgstr "Súgó" #: Editor.java:1041 msgid "Getting Started" -msgstr "Első lépések" +msgstr "Első lépések" #: Editor.java:1049 msgid "Environment" -msgstr "Környezet" +msgstr "Környezet" #: Editor.java:1057 msgid "Troubleshooting" -msgstr "Hibaelhárítás" +msgstr "Hibaelhárítás" #: Editor.java:1065 msgid "Reference" -msgstr "Referencia" +msgstr "Referencia" #: Editor.java:1073 Editor.java:2728 msgid "Find in Reference" -msgstr "Keresés a Referenciák közt" +msgstr "Keresés a Referenciák közt" #: Editor.java:1083 msgid "Frequently Asked Questions" -msgstr "Gyakran Ismételt Kérdések" +msgstr "Gyakran Ismételt Kérdések" #: Editor.java:1091 msgid "Visit Arduino.cc" -msgstr "arduino.cc honlap megnyitása" +msgstr "arduino.cc honlap megnyitása" #: Editor.java:1094 msgid "http://arduino.cc/" -msgstr "http://arduino.cc/" +msgstr "http://arduino.cc/" #: Editor.java:1102 msgid "About Arduino" -msgstr "Arduino névjegye" +msgstr "Arduino névjegye" #: Editor.java:1116 msgid "Edit" -msgstr "Szerkesztés" +msgstr "Szerkesztés" #: Editor.java:1119 Editor.java:1341 msgid "Undo" -msgstr "Mégse" +msgstr "Mégse" #: Editor.java:1124 Editor.java:1126 Editor.java:1376 msgid "Redo" -msgstr "Mégis" +msgstr "Mégis" #: Editor.java:1135 Editor.java:2652 msgid "Cut" -msgstr "Kivágás" +msgstr "Kivágás" #: Editor.java:1143 Editor.java:2660 msgid "Copy" -msgstr "Másolás" +msgstr "Másolás" #: Editor.java:1151 Editor.java:2668 msgid "Copy for Forum" -msgstr "Másolás a Fórumhoz" +msgstr "Másolás a Fórumhoz" #: Editor.java:1163 Editor.java:2676 msgid "Copy as HTML" -msgstr "Másolás HTML-ként" +msgstr "Másolás HTML-ként" #: Editor.java:1175 Editor.java:2684 msgid "Paste" -msgstr "Beillesztés" +msgstr "Beillesztés" #: Editor.java:1184 Editor.java:2692 msgid "Select All" -msgstr "Minden kijelölése" +msgstr "Minden kijelölése" #: Editor.java:1194 Editor.java:2702 msgid "Comment/Uncomment" -msgstr "Megjegyzés/Mégsem" +msgstr "Megjegyzés/Mégsem" #: Editor.java:1202 Editor.java:2710 msgid "Increase Indent" -msgstr "Behúzás növelése" +msgstr "Behúzás növelése" #: Editor.java:1210 Editor.java:2718 msgid "Decrease Indent" -msgstr "Behúzás csökkentése" +msgstr "Behúzás csökkentése" #: Editor.java:1220 msgid "Find..." -msgstr "Keresés..." +msgstr "Keresés..." #: Editor.java:1235 msgid "Find Next" -msgstr "Következő keresése" +msgstr "Következő keresése" #: Editor.java:1245 msgid "Find Previous" -msgstr "Előző keresése" +msgstr "Előző keresése" #: Editor.java:1255 msgid "Use Selection For Find" -msgstr "Kiválasztás használata kereséshez" +msgstr "Kiválasztás használata kereséshez" #: Editor.java:1816 msgid "First select a word to find in the reference." -msgstr "Először egy szót kell választani a Referenciák közti kereséshez." +msgstr "Először egy szót kell választani a Referenciák közti kereséshez." #: Editor.java:1823 #, java-format msgid "No reference available for \"{0}\"" -msgstr "Referencia nem található a {0} bejegyzéshez" +msgstr "Referencia nem található a {0} bejegyzéshez" #: Editor.java:1826 #, java-format msgid "{0}.html" -msgstr "{0}.html" +msgstr "{0}.html" #: Editor.java:1843 Sketch.java:1647 msgid "Compiling sketch..." -msgstr "Sketch fordítása..." +msgstr "Sketch fordítása..." #: Editor.java:1864 Editor.java:1881 msgid "Done compiling." -msgstr "Fordítás kész." +msgstr "Fordítás kész." #: Editor.java:1973 #, java-format msgid "Save changes to \"{0}\"? " -msgstr "Mentés a {0} állományba? " +msgstr "Mentés a {0} állományba? " #: Editor.java:2006 msgid "" @@ -280,36 +280,36 @@ msgid "" "{ font: 11pt \"Lucida Grande\"; margin-top: 8px } Do you " "want to save changes to this sketch
before closing?

If you don't " "save, your changes will be lost." -msgstr "" -" Változtatás " -"mentése a kilépés előtt a Sketch-be?

Mentés nékül a változtatások elvesznek." +msgstr "" +" Változtatás " +"mentése a kilépés előtt a Sketch-be?

Mentés nékül a változtatások elvesznek." #: Editor.java:2017 Editor.java:2098 Editor.java:2418 Sketch.java:589 #: Sketch.java:741 Sketch.java:1046 Preferences.java:78 msgid "Cancel" -msgstr "Mégse" +msgstr "Mégse" #: Editor.java:2017 msgid "Don't Save" -msgstr "Nincs mentés" +msgstr "Nincs mentés" #: Editor.java:2089 msgid "Bad file selected" -msgstr "Hibás file lett kiválasztva" +msgstr "Hibás file lett kiválasztva" #: Editor.java:2090 msgid "" "Processing can only open its own sketches\n" "and other files ending in .ino or .pde" -msgstr "" -"Processing csak a saját állományát tudja megnyitni\n" -"vagy az .ino vagy .pde kiterjesztésűeket" +msgstr "" +"Processing csak a saját állományát tudja megnyitni\n" +"vagy az .ino vagy .pde kiterjesztésűeket" #: Editor.java:2098 Editor.java:2418 Sketch.java:589 Sketch.java:741 #: Sketch.java:1046 Preferences.java:79 msgid "OK" -msgstr "OK" +msgstr "OK" #: Editor.java:2100 #, java-format @@ -317,329 +317,329 @@ msgid "" "The file \"{0}\" needs to be inside\n" "a sketch folder named \"{1}\".\n" "Create this folder, move the file, and continue?" -msgstr "" -"A \"{0}\" file-nak a(z) {1} mappán belül kell lennie.\n" -"Mi legyen?\n" -"Mappa létrehozása, file mozgatása és folytatás?" +msgstr "" +"A \"{0}\" file-nak a(z) {1} mappán belül kell lennie.\n" +"Mi legyen?\n" +"Mappa létrehozása, file mozgatása és folytatás?" #: Editor.java:2109 msgid "Moving" -msgstr "Átmozgatás" +msgstr "Átmozgatás" #: Editor.java:2120 Editor.java:2131 Editor.java:2141 Editor.java:2159 #: Sketch.java:479 Sketch.java:485 Sketch.java:500 Sketch.java:507 #: Sketch.java:530 Sketch.java:547 Base.java:1861 Preferences.java:240 msgid "Error" -msgstr "Hiba" +msgstr "Hiba" #: Editor.java:2122 #, java-format msgid "A folder named \"{0}\" already exists. Can't open sketch." -msgstr "A {0} mappa már létezik. Sketch nem nyitható meg." +msgstr "A {0} mappa már létezik. Sketch nem nyitható meg." #: Editor.java:2132 msgid "Could not create the sketch folder." -msgstr "Sketch mappája nem hozható létre." +msgstr "Sketch mappája nem hozható létre." #: Editor.java:2141 msgid "Could not copy to a proper location." -msgstr "Nem másolható a megfelelő helyre." +msgstr "Nem másolható a megfelelő helyre." #: Editor.java:2159 msgid "Could not create the sketch." -msgstr "Sketch nem hozható létre." +msgstr "Sketch nem hozható létre." #: Editor.java:2166 #, java-format msgid "{0} | Arduino {1}" -msgstr "{0} | Arduino {1}" +msgstr "{0} | Arduino {1}" #: Editor.java:2223 Editor.java:2261 msgid "Saving..." -msgstr "Mentés..." +msgstr "Mentés..." #: Editor.java:2228 Editor.java:2264 msgid "Done Saving." -msgstr "Mentés kész." +msgstr "Mentés kész." #: Editor.java:2270 msgid "Save Canceled." -msgstr "Mentés megszakítva." +msgstr "Mentés megszakítva." #: Editor.java:2296 #, java-format msgid "" "Serial port {0} not found.\n" "Retry the upload with another serial port?" -msgstr "" -"{0} soros port nem található.\n" -"Másik soros porton megismételjük?" +msgstr "" +"{0} soros port nem található.\n" +"Másik soros porton megismételjük?" #: Editor.java:2331 msgid "Uploading to I/O Board..." -msgstr "Feltöltés alappanelre..." +msgstr "Feltöltés alappanelre..." #: Editor.java:2348 Editor.java:2384 msgid "Done uploading." -msgstr "Feltöltés kész." +msgstr "Feltöltés kész." #: Editor.java:2356 Editor.java:2392 msgid "Upload canceled." -msgstr "Feltöltés megszakítva." +msgstr "Feltöltés megszakítva." #: Editor.java:2420 msgid "Save changes before export?" -msgstr "Exportálás előtt mentés?" +msgstr "Exportálás előtt mentés?" #: Editor.java:2435 msgid "Export canceled, changes must first be saved." -msgstr "Exportálás megszakítva. Először menteni kell!" +msgstr "Exportálás megszakítva. Először menteni kell!" #: Editor.java:2457 msgid "Burning bootloader to I/O Board (this may take a minute)..." -msgstr "Bootloader égetése (néhány percet vesz igénybe)..." +msgstr "Bootloader égetése (néhány percet vesz igénybe)..." #: Editor.java:2463 msgid "Done burning bootloader." -msgstr "Bootloader égetés kész." +msgstr "Bootloader égetés kész." #: Editor.java:2465 Editor.java:2469 Editor.java:2473 msgid "Error while burning bootloader." -msgstr "Hiba lépett fel a bootloader égetésekor." +msgstr "Hiba lépett fel a bootloader égetésekor." #: Editor.java:2500 msgid "Printing..." -msgstr "Nyomtatás..." +msgstr "Nyomtatás..." #: Editor.java:2517 msgid "Done printing." -msgstr "Nyomtatás kész." +msgstr "Nyomtatás kész." #: Editor.java:2520 msgid "Error while printing." -msgstr "Hiba a nyomtatás során." +msgstr "Hiba a nyomtatás során." #: Editor.java:2524 msgid "Printing canceled." -msgstr "Nyomtatás megszakítva." +msgstr "Nyomtatás megszakítva." #: Editor.java:2572 #, java-format msgid "Bad error line: {0}" -msgstr "Hibás sor: {0}" +msgstr "Hibás sor: {0}" #: Editor.java:2641 msgid "Open URL" -msgstr "URL megnyitása" +msgstr "URL megnyitása" #: UpdateCheck.java:53 msgid "http://www.arduino.cc/latest.txt" -msgstr "http://www.arduino.cc/latest.txt" +msgstr "http://www.arduino.cc/latest.txt" #: UpdateCheck.java:103 msgid "" "A new version of Arduino is available,\n" "would you like to visit the Arduino download page?" -msgstr "" -"Új kiadás jelent meg Arduino-ból,\n" -"megmutassam a letöltési oldalt?" +msgstr "" +"Új kiadás jelent meg Arduino-ból,\n" +"megmutassam a letöltési oldalt?" #: UpdateCheck.java:108 Preferences.java:76 msgid "Yes" -msgstr "Igen" +msgstr "Igen" #: UpdateCheck.java:108 Preferences.java:77 msgid "No" -msgstr "Nem" +msgstr "Nem" #: UpdateCheck.java:111 msgid "Update" -msgstr "Frissítés" +msgstr "Frissítés" #: UpdateCheck.java:118 msgid "http://www.arduino.cc/en/Main/Software" -msgstr "http://www.arduino.cc/en/Main/Software" +msgstr "http://www.arduino.cc/en/Main/Software" #: FindReplace.java:80 msgid "Find:" -msgstr "Keresés:" +msgstr "Keresés:" #: FindReplace.java:81 msgid "Replace with:" -msgstr "Csere erre:" +msgstr "Csere erre:" #: FindReplace.java:96 msgid "Ignore Case" -msgstr "Kisbetű-nagybetű független" +msgstr "Kisbetű-nagybetű független" #: FindReplace.java:105 msgid "Wrap Around" -msgstr "Teljesen szövegben" +msgstr "Teljesen szövegben" #: FindReplace.java:120 FindReplace.java:131 msgid "Replace All" -msgstr "Mindent cserél" +msgstr "Mindent cserél" #: FindReplace.java:121 FindReplace.java:130 Sketch.java:1050 msgid "Replace" -msgstr "Cserél" +msgstr "Cserél" #: FindReplace.java:122 FindReplace.java:129 msgid "Replace & Find" -msgstr "Keres és cserél" +msgstr "Keres és cserél" #: FindReplace.java:123 FindReplace.java:128 msgid "Previous" -msgstr "Előző" +msgstr "Előző" #: FindReplace.java:124 FindReplace.java:127 msgid "Find" -msgstr "Keres" +msgstr "Keres" #: SerialMonitor.java:93 msgid "Send" -msgstr "Küld" +msgstr "Küld" #: SerialMonitor.java:110 msgid "Autoscroll" -msgstr "Autogörgetés" +msgstr "Autogörgetés" #: SerialMonitor.java:112 msgid "No line ending" -msgstr "Nincs sorlezárás" +msgstr "Nincs sorlezárás" #: SerialMonitor.java:112 msgid "Newline" -msgstr "Soremelés" +msgstr "Soremelés" #: SerialMonitor.java:112 msgid "Carriage return" -msgstr "Kocsi-vissza" +msgstr "Kocsi-vissza" #: SerialMonitor.java:112 msgid "Both NL & CR" -msgstr "Soremelés és Kocsi-vissza" +msgstr "Soremelés és Kocsi-vissza" #: SerialMonitor.java:130 SerialMonitor.java:133 msgid " baud" -msgstr " baud" +msgstr " baud" #: Serial.java:147 #, java-format msgid "" "Serial port ''{0}'' already in use. Try quiting any programs that may be " "using it." -msgstr "" -"A {0} soros port használatban van. A programból való" -"kilépés után próbálja újra." +msgstr "" +"A {0} soros port használatban van. A programból való" +"kilépés után próbálja újra." #: Serial.java:154 #, java-format msgid "Error opening serial port ''{0}''." -msgstr "Hiba a {0} soros port megnyitása során." +msgstr "Hiba a {0} soros port megnyitása során." #: Serial.java:167 #, java-format msgid "" "Serial port ''{0}'' not found. Did you select the right one from the Tools > " "Serial Port menu?" -msgstr "" -"A {0} soros port nem található. Választani az Eszközök > " -"Soros port alatt lehetséges." +msgstr "" +"A {0} soros port nem található. Választani az Eszközök > " +"Soros port alatt lehetséges." #: Serial.java:424 #, java-format msgid "" "readBytesUntil() byte buffer is too small for the {0} bytes up to and " "including char {1}" -msgstr "" -"readBytesUntil() byte buffer túl kicsi {0} byte befogadására " -"és ideértve a {1} karaktert" +msgstr "" +"readBytesUntil() byte buffer túl kicsi {0} byte befogadására " +"és ideértve a {1} karaktert" #: Serial.java:567 #, java-format msgid "Error inside Serial.{0}()" -msgstr "Hiba a Serial.{0}()-ban" +msgstr "Hiba a Serial.{0}()-ban" #: tools/AutoFormat.java:91 msgid "Auto Format" -msgstr "Autoformázás" +msgstr "Autoformázás" #: tools/AutoFormat.java:913 tools/format/src/AutoFormat.java:54 msgid "No changes necessary for Auto Format." -msgstr "Nem szükséges semmilyen változtatás autoformázáshoz." +msgstr "Nem szükséges semmilyen változtatás autoformázáshoz." #: tools/AutoFormat.java:919 msgid "Auto Format Canceled: Too many right parentheses." -msgstr "Autoformázás megszakítva: túl sok a záró zárójel." +msgstr "Autoformázás megszakítva: túl sok a záró zárójel." #: tools/AutoFormat.java:922 msgid "Auto Format Canceled: Too many left parentheses." -msgstr "Autoformázás megszakítva: túl sok a nyitó zárójel." +msgstr "Autoformázás megszakítva: túl sok a nyitó zárójel." #: tools/AutoFormat.java:928 msgid "Auto Format Canceled: Too many right curly braces." -msgstr "Autoformázás megszakítva: túl sok záró kapcsos-zárójel." +msgstr "Autoformázás megszakítva: túl sok záró kapcsos-zárójel." #: tools/AutoFormat.java:931 msgid "Auto Format Canceled: Too many left curly braces." -msgstr "Autoformázás megszakítva: túl sok nyitó kapcsos-zárójel." +msgstr "Autoformázás megszakítva: túl sok nyitó kapcsos-zárójel." #: tools/AutoFormat.java:941 msgid "Auto Format finished." -msgstr "Autoformázás befejeződött." +msgstr "Autoformázás befejeződött." #: tools/FixEncoding.java:41 tools/FixEncoding.java:58 #: tools/FixEncoding.java:79 msgid "Fix Encoding & Reload" -msgstr "Betöltéskor autoformázás" +msgstr "Betöltéskor autoformázás" #: tools/FixEncoding.java:57 msgid "Discard all changes and reload sketch?" -msgstr "Módosítások elvetése és Sketch újratöltése?" +msgstr "Módosítások elvetése és Sketch újratöltése?" #: tools/FixEncoding.java:77 msgid "" "An error occurred while trying to fix the file encoding.\n" "Do not attempt to save this sketch as it may overwrite\n" "the old version. Use Open to re-open the sketch and try again.\n" -msgstr "" -"Hiba lépett fel a file fixálása/javítása során.\n" -"Nem javasolt a felülírásos mentés.\n" -"A Sketch újra-megnyitása talán megoldja a problémát.\n" +msgstr "" +"Hiba lépett fel a file fixálása/javítása során.\n" +"Nem javasolt a felülírásos mentés.\n" +"A Sketch újra-megnyitása talán megoldja a problémát.\n" #: tools/Archiver.java:48 msgid "Archive Sketch" -msgstr "Sketch archiválás" +msgstr "Sketch archiválás" #: tools/Archiver.java:59 msgid "yyMMdd" -msgstr "yyMMdd" +msgstr "yyMMdd" #: tools/Archiver.java:74 msgid "Couldn't archive sketch" -msgstr "Sketch nem archiválható" +msgstr "Sketch nem archiválható" #: tools/Archiver.java:75 msgid "" "Archiving the sketch has been canceled because\n" "the sketch couldn't save properly." -msgstr "" -"A Sketch archiválása megszakadt, mivel\n" -"a Sketch pontos mentése nem volt lehetséges." +msgstr "" +"A Sketch archiválása megszakadt, mivel\n" +"a Sketch pontos mentése nem volt lehetséges." #: tools/Archiver.java:109 msgid "Archive sketch as:" -msgstr "Sketch archiválása, mint:" +msgstr "Sketch archiválása, mint:" #: tools/Archiver.java:139 msgid "Archive sketch canceled." -msgstr "Sketch archiválás megszakítva." +msgstr "Sketch archiválás megszakítva." #: SketchCode.java:83 #, java-format msgid "Error while loading code {0}" -msgstr "Hiba a kód betöltése közben: {0}" +msgstr "Hiba a kód betöltése közben: {0}" #: SketchCode.java:258 #, java-format @@ -648,153 +648,153 @@ msgid "" "older version of Processing,you may need to use Tools -> Fix Encoding & " "Reload to updatethe sketch to use UTF-8 encoding. If not, you may need " "todelete the bad characters to get rid of this warning." -msgstr "" -"A {0} nem felismerhető karaktert tartalmaz. Ha a kód régebbi verziójú " -"Processing-gel készült, akkor az Eszközök -> Betöltéskor autoformázás " -"menüpont megoldja az UTF-8 kódolást. Ha mégsem, akkor a hibás karaktert " -"ki kell törölni az állományból." +msgstr "" +"A {0} nem felismerhető karaktert tartalmaz. Ha a kód régebbi verziójú " +"Processing-gel készült, akkor az Eszközök -> Betöltéskor autoformázás " +"menüpont megoldja az UTF-8 kódolást. Ha mégsem, akkor a hibás karaktert " +"ki kell törölni az állományból." #: Sketch.java:278 Sketch.java:307 Sketch.java:581 Sketch.java:970 msgid "Sketch is Read-Only" -msgstr "Sketch csak olvasható" +msgstr "Sketch csak olvasható" #: Sketch.java:279 Sketch.java:308 Sketch.java:582 Sketch.java:971 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save the sketch in another location,\n" "and try again." -msgstr "" -"Néhány file csak olvasható, így más helyre mentés után\n" -"újra meg kell próbálni.\n" -"\n" +msgstr "" +"Néhány file csak olvasható, így más helyre mentés után\n" +"újra meg kell próbálni.\n" +"\n" #: Sketch.java:286 msgid "Name for new file:" -msgstr "Új file neve:" +msgstr "Új file neve:" #: Sketch.java:298 msgid "Sketch is Untitled" -msgstr "A Sketch most Névtelen (Untitled)" +msgstr "A Sketch most Névtelen (Untitled)" #: Sketch.java:299 msgid "" "How about saving the sketch first \n" "before trying to rename it?" -msgstr "" -"A Sketch csak mentés után\n" -"nevezhető át!" +msgstr "" +"A Sketch csak mentés után\n" +"nevezhető át!" #: Sketch.java:359 Sketch.java:366 Sketch.java:377 msgid "Problem with rename" -msgstr "Hiba az átnevezés során" +msgstr "Hiba az átnevezés során" #: Sketch.java:360 msgid "The name cannot start with a period." -msgstr "A név nem kezdődhet periódus-jellel." +msgstr "A név nem kezdődhet periódus-jellel." #: Sketch.java:368 #, java-format msgid "\".{0}\" is not a valid extension." -msgstr "\".{0}\" nem megfelelő kiterjesztés." +msgstr "\".{0}\" nem megfelelő kiterjesztés." #: Sketch.java:378 msgid "" "The main file can't use an extension.\n" "(It may be time for your to graduate to a\n" "\"real\" programming environment)" -msgstr "" -"A fő-file nem tartalmazhat kiterjesztést.\n" -"(Talán itt az idő, hogy megismerje a\n" -"\"valódi\" programozási környezetet)" +msgstr "" +"A fő-file nem tartalmazhat kiterjesztést.\n" +"(Talán itt az idő, hogy megismerje a\n" +"\"valódi\" programozási környezetet)" #: Sketch.java:400 Sketch.java:414 Sketch.java:423 Sketch.java:863 msgid "Nope" -msgstr "Dehogy, nem" +msgstr "Dehogy, nem" #: Sketch.java:402 #, java-format msgid "A file named \"{0}\" already exists in \"{1}\"" -msgstr "A \"{0}\" file már létezik a \"{1}\" mappában!" +msgstr "A \"{0}\" file már létezik a \"{1}\" mappában!" #: Sketch.java:415 msgid "You can't have a .cpp file with the same name as the sketch." -msgstr "Nem lehet azonos néven a .cpp állomány, mint a Sketch." +msgstr "Nem lehet azonos néven a .cpp állomány, mint a Sketch." #: Sketch.java:425 msgid "" "You can't rename the sketch to \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" -"Nem nevezhető át a Sketch, mert létezik a \"{0}\"\n" -"nevű .cpp állomány." +msgstr "" +"Nem nevezhető át a Sketch, mert létezik a \"{0}\"\n" +"nevű .cpp állomány." #: Sketch.java:459 msgid "Cannot Rename" -msgstr "Átnevezési hiba" +msgstr "Átnevezési hiba" #: Sketch.java:461 #, java-format msgid "Sorry, a sketch (or folder) named \"{0}\" already exists." -msgstr "Hiba: Sketch (vagy mappa) már létezik \"{0}\" néven." +msgstr "Hiba: Sketch (vagy mappa) már létezik \"{0}\" néven." #: Sketch.java:479 msgid "Could not rename the sketch. (0)" -msgstr "A Sketch nem nevezhető át: (0)." +msgstr "A Sketch nem nevezhető át: (0)." #: Sketch.java:487 Sketch.java:532 #, java-format msgid "Could not rename \"{0}\" to \"{1}\"" -msgstr "Nem nevezhető át: \"{0}\" -> \"{1}\"" +msgstr "Nem nevezhető át: \"{0}\" -> \"{1}\"" #: Sketch.java:500 msgid "Could not rename the sketch. (1)" -msgstr "Nem nevezhető át a Sketch: (1)" +msgstr "Nem nevezhető át a Sketch: (1)" #: Sketch.java:507 msgid "Could not rename the sketch. (2)" -msgstr "Nem nevezhető át a Sketch: (2)." +msgstr "Nem nevezhető át a Sketch: (2)." #: Sketch.java:544 msgid "createNewFile() returned false" -msgstr "a createNewFile() hibát jelzett" +msgstr "a createNewFile() hibát jelzett" #: Sketch.java:591 msgid "Are you sure you want to delete this sketch?" -msgstr "Tényleg törölni kell a Sketch-et? Biztosan?" +msgstr "Tényleg törölni kell a Sketch-et? Biztosan?" #: Sketch.java:592 #, java-format msgid "Are you sure you want to delete \"{0}\"?" -msgstr "A(z) \"{0}\" állomány tényleg törlésre kerüljön?" +msgstr "A(z) \"{0}\" állomány tényleg törlésre kerüljön?" #: Sketch.java:595 EditorHeader.java:314 msgid "Delete" -msgstr "Törlés" +msgstr "Törlés" #: Sketch.java:620 msgid "Couldn't do it" -msgstr "Nem tudom megtenni" +msgstr "Nem tudom megtenni" #: Sketch.java:621 #, java-format msgid "Could not delete \"{0}\"." -msgstr "Nem törölhető file: \"{0}\"." +msgstr "Nem törölhető file: \"{0}\"." #: Sketch.java:651 msgid "removeCode: internal error.. could not find code" -msgstr "removeCode: belső hiba... Kód nem található" +msgstr "removeCode: belső hiba... Kód nem található" #: Sketch.java:724 msgid "Sketch is read-only" -msgstr "A Sketch csak olvasható" +msgstr "A Sketch csak olvasható" #: Sketch.java:725 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save this sketch to another location." -msgstr "" -"Néhány file csak olvasható, így el kell menteni a\n" -"Sketch-et egy másik mappába." +msgstr "" +"Néhány file csak olvasható, így el kell menteni a\n" +"Sketch-et egy másik mappába." #: Sketch.java:743 msgid "" @@ -805,215 +805,215 @@ msgid "" "disable this in the Preferences dialog.\n" "\n" "Save sketch and update its extension?" -msgstr "" -"Az Arduino 1.0-ban az alappértelmezett kiterjesztés megváltozott\n" -".pde-ről .ino-ra. Az új Sketck-ek (ideértve a Mentés másként... létrehozottakat is)\n" -"már az új kiterjesztést használják. A mentés\n" -"közbeni átnevezés tiltható a Beállítások menüpontban.\n" -"\n" -"Sketch mentése és kiterjesztés frissítése?" +msgstr "" +"Az Arduino 1.0-ban az alappértelmezett kiterjesztés megváltozott\n" +".pde-ről .ino-ra. Az új Sketck-ek (ideértve a Mentés másként... létrehozottakat is)\n" +"már az új kiterjesztést használják. A mentés\n" +"közbeni átnevezés tiltható a Beállítások menüpontban.\n" +"\n" +"Sketch mentése és kiterjesztés frissítése?" #: Sketch.java:750 msgid ".pde -> .ino" -msgstr ".pde -> .ino" +msgstr ".pde -> .ino" #: Sketch.java:829 msgid "Save sketch folder as..." -msgstr "Sketch mentése, mint..." +msgstr "Sketch mentése, mint..." #: Sketch.java:865 msgid "" "You can't save the sketch as \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" -"Sketch nem menthető, mint \"{0}\"\n" -"mert már van ilyen .cpp állomány." +msgstr "" +"Sketch nem menthető, mint \"{0}\"\n" +"mert már van ilyen .cpp állomány." #: Sketch.java:886 msgid "How very Borges of you" -msgstr "Nono!" +msgstr "Nono!" #: Sketch.java:887 msgid "" "You cannot save the sketch into a folder\n" "inside itself. This would go on forever." -msgstr "" -"Sketch nem menthető a mappába.\n" -"Így egy végtelen történetté alakulna." +msgstr "" +"Sketch nem menthető a mappába.\n" +"Így egy végtelen történetté alakulna." #: Sketch.java:979 msgid "Select an image or other data file to copy to your sketch" -msgstr "Kép vagy egyéb adat választása a Sketch-be másoláshoz" +msgstr "Kép vagy egyéb adat választása a Sketch-be másoláshoz" #: Sketch.java:1047 #, java-format msgid "Replace the existing version of {0}?" -msgstr "A meglevő {0} cseréje?" +msgstr "A meglevő {0} cseréje?" #: Sketch.java:1069 Sketch.java:1092 msgid "Error adding file" -msgstr "File hozzáadási hiba" +msgstr "File hozzáadási hiba" #: Sketch.java:1070 #, java-format msgid "Could not delete the existing ''{0}'' file." -msgstr "Nem törölhető a meglevő {0} file." +msgstr "Nem törölhető a meglevő {0} file." #: Sketch.java:1078 msgid "You can't fool me" -msgstr "Ne bolondozzon velem" +msgstr "Ne bolondozzon velem" #: Sketch.java:1079 msgid "" "This file has already been copied to the\n" "location from which where you're trying to add it.\n" "I ain't not doin nuthin'." -msgstr "" -"A file már másolásra került a mappába\n" -"ahonnan hozzá próbálta adni.\n" -"Még mindig nem végrehajtható." +msgstr "" +"A file már másolásra került a mappába\n" +"ahonnan hozzá próbálta adni.\n" +"Még mindig nem végrehajtható." #: Sketch.java:1093 #, java-format msgid "Could not add ''{0}'' to the sketch." -msgstr "A {0} nem adható hozzá a Sketch-hez." +msgstr "A {0} nem adható hozzá a Sketch-hez." #: Sketch.java:1393 Sketch.java:1424 msgid "Build folder disappeared or could not be written" -msgstr "A fordítási mappa elérhetetlen vagy írásvédett." +msgstr "A fordítási mappa elérhetetlen vagy írásvédett." #: Sketch.java:1408 msgid "Could not find main class" -msgstr "A fő programosztály (main class) nem található" +msgstr "A fő programosztály (main class) nem található" #: Sketch.java:1433 #, java-format msgid "Uncaught exception type: {0}" -msgstr "Hibás kivétel típus: {0}" +msgstr "Hibás kivétel típus: {0}" #: Sketch.java:1465 #, java-format msgid "Problem moving {0} to the build folder" -msgstr "Hiba a {0} fordítási mappába mozgatása során" +msgstr "Hiba a {0} fordítási mappába mozgatása során" #: Sketch.java:1661 msgid "Uploading..." -msgstr "Feltöltés..." +msgstr "Feltöltés..." #: Sketch.java:1684 #, java-format msgid "Binary sketch size: {0} bytes (of a {1} byte maximum)" -msgstr "Sketch mérete: {0} byte (maximálisan lehetséges: {1} byte)" +msgstr "Sketch mérete: {0} byte (maximálisan lehetséges: {1} byte)" #: Sketch.java:1689 msgid "Couldn't determine program size: {0}" -msgstr "Nem meghatározható a {0} program mérete" +msgstr "Nem meghatározható a {0} program mérete" #: Sketch.java:1694 msgid "" "Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for " "tips on reducing it." -msgstr "Túl nagy a Sketch: méret csökkentéséhez a http://www.arduino.cc/en/Guide/Troubleshooting#size oldalon találhatóak tippek." +msgstr "Túl nagy a Sketch: méret csökkentéséhez a http://www.arduino.cc/en/Guide/Troubleshooting#size oldalon találhatóak tippek." #: Sketch.java:1754 msgid "Missing the */ from the end of a /* comment */" -msgstr "Hiányzik a megjegyzést záró */ jel" +msgstr "Hiányzik a megjegyzést záró */ jel" #: Sketch.java:1796 msgid "Sketch Disappeared" -msgstr "A Sketch elveszett" +msgstr "A Sketch elveszett" #: Sketch.java:1797 msgid "" "The sketch folder has disappeared.\n" " Will attempt to re-save in the same location,\n" "but anything besides the code will be lost." -msgstr "" -"A Sketch mappája elveszett.\n" -"A Sketch újramentésre kerül,\n" -"a kód egyes részei megsemmisülhettek." +msgstr "" +"A Sketch mappája elveszett.\n" +"A Sketch újramentésre kerül,\n" +"a kód egyes részei megsemmisülhettek." #: Sketch.java:1810 msgid "Could not re-save sketch" -msgstr "Nem lehetséges a Sketch újramentése" +msgstr "Nem lehetséges a Sketch újramentése" #: Sketch.java:1811 msgid "" "Could not properly re-save the sketch. You may be in trouble at this point,\n" "and it might be time to copy and paste your code to another text editor." -msgstr "" -"Tökéletesen nem lehetséges a Sketch újramentése. A megoldás jelen helyzetben, hogy\n" -"a szerkesztőből a kódot kimásolja egy másik szerkesztőprogramba." +msgstr "" +"Tökéletesen nem lehetséges a Sketch újramentése. A megoldás jelen helyzetben, hogy\n" +"a szerkesztőből a kódot kimásolja egy másik szerkesztőprogramba." #: Sketch.java:2060 msgid "" "The sketch name had to be modified. Sketch names can only consist\n" "of ASCII characters and numbers (but cannot start with a number).\n" "They should also be less less than 64 characters long." -msgstr "" -"A Sketch neve módosításra került. Az elnevezése csak\n" -"ASCII betűket, számokat tartalmazhat (de nem kezdődhet számmal).\n" -"Valamint a név hossza nem haladhatja meg a 64 karaktert." +msgstr "" +"A Sketch neve módosításra került. Az elnevezése csak\n" +"ASCII betűket, számokat tartalmazhat (de nem kezdődhet számmal).\n" +"Valamint a név hossza nem haladhatja meg a 64 karaktert." #: debug/Uploader.java:52 msgid "https://developer.berlios.de/bugs/?group_id=3590" -msgstr "https://developer.berlios.de/bugs/?group_id=3590" +msgstr "https://developer.berlios.de/bugs/?group_id=3590" #: debug/Uploader.java:54 debug/Compiler.java:43 #, java-format msgid "Compiler error, please submit this code to {0}" -msgstr "Fordítási hiba, ezt a kódot kérem küldje el a {0} címre" +msgstr "Fordítási hiba, ezt a kódot kérem küldje el a {0} címre" #: debug/Uploader.java:199 #, java-format msgid "" "the selected serial port {0} does not exist or your board is not connected" -msgstr "kiválasztott {0} port nem elérhető vagy az alappanel nincs csatlakoztatva" +msgstr "kiválasztott {0} port nem elérhető vagy az alappanel nincs csatlakoztatva" #: debug/Uploader.java:203 msgid "" "Device is not responding, check the right serial port is selected or RESET " "the board right before exporting" -msgstr "" -"Eszköz nem válaszol: talán hibás port lett kiválasztva, vagy a panel" -"újraindítása szükséges exportálás előtt" +msgstr "" +"Eszköz nem válaszol: talán hibás port lett kiválasztva, vagy a panel" +"újraindítása szükséges exportálás előtt" #: debug/Uploader.java:209 msgid "" "Problem uploading to board. See http://www.arduino.cc/en/Guide/" "Troubleshooting#upload for suggestions." -msgstr "" -"Hiba a feltöltés során. A hiba elhárítása a " -"http://www.arduino.cc/en/Guide/%20oldalon%20a%20Troubleshooting#upload%20alatt%20ker%C3%BClt%20le%C3%ADr%C3%A1sra." +msgstr "" +"Hiba a feltöltés során. A hiba elhárítása a " +"http://www.arduino.cc/en/Guide/%20oldalon%20a%20Troubleshooting#upload%20alatt%20ker%C3%BClt%20le%C3%ADr%C3%A1sra." #: debug/Uploader.java:213 msgid "" "Wrong microcontroller found. Did you select the right board from the Tools " "> Board menu?" -msgstr "" -"Nem megfelelő mikrokontroller lett kiválasztva. Pontosítani az Eszközök " -"> Alappanelek menüben lehet." +msgstr "" +"Nem megfelelő mikrokontroller lett kiválasztva. Pontosítani az Eszközök " +"> Alappanelek menüben lehet." #: debug/Compiler.java:41 msgid "http://code.google.com/p/arduino/issues/list" -msgstr "http://code.google.com/p/arduino/issues/list" +msgstr "http://code.google.com/p/arduino/issues/list" #: debug/Compiler.java:79 msgid "No board selected; please choose a board from the Tools > Board menu." -msgstr "Nincs alappanel kiválasztva. Választani az Eszközök > Alappanel menüből lehet." +msgstr "Nincs alappanel kiválasztva. Választani az Eszközök > Alappanel menüből lehet." #: debug/Compiler.java:422 #, java-format msgid "{0} returned {1}" -msgstr "{0} eredménye {1}" +msgstr "{0} eredménye {1}" #: debug/Compiler.java:426 msgid "Error compiling." -msgstr "Hiba a fordítás során." +msgstr "Hiba a fordítás során." #: debug/Compiler.java:465 msgid "Please import the SPI library from the Sketch > Import Library menu." -msgstr "Az SPI függvények használatához a Sketch > Függvény import alatt az SPI-re van szüksége." +msgstr "Az SPI függvények használatához a Sketch > Függvény import alatt az SPI-re van szüksége." #: debug/Compiler.java:466 msgid "" @@ -1022,15 +1022,15 @@ msgid "" "You appear to be using it or another library that depends on the SPI " "library.\n" "\n" -msgstr "" -"\n" -"Az Arduino-0019 óta az Ethernet függvények kapcsolódnak az SPI függvényekhez.\n" -"Ez így használható, vagy másik függvény alkalmazható az SPI kezelésére.\n" -"\n" +msgstr "" +"\n" +"Az Arduino-0019 óta az Ethernet függvények kapcsolódnak az SPI függvényekhez.\n" +"Ez így használható, vagy másik függvény alkalmazható az SPI kezelésére.\n" +"\n" #: debug/Compiler.java:471 msgid "The 'BYTE' keyword is no longer supported." -msgstr "A 'BYTE' kulcsszó nem támogatott." +msgstr "A 'BYTE' kulcsszó nem támogatott." #: debug/Compiler.java:472 msgid "" @@ -1038,15 +1038,15 @@ msgid "" "As of Arduino 1.0, the 'BYTE' keyword is no longer supported.\n" "Please use Serial.write() instead.\n" "\n" -msgstr "" -"\n" -"Az Arduino 1.0 alatt a 'BYTE' kulcsszó nem támogatott.\n" -"Helyette a Serial.write() használható.\n" -"\n" +msgstr "" +"\n" +"Az Arduino 1.0 alatt a 'BYTE' kulcsszó nem támogatott.\n" +"Helyette a Serial.write() használható.\n" +"\n" #: debug/Compiler.java:477 msgid "The Server class has been renamed EthernetServer." -msgstr "A Server függvényosztály EthernetServer névre hallgat." +msgstr "A Server függvényosztály EthernetServer névre hallgat." #: debug/Compiler.java:478 msgid "" @@ -1054,14 +1054,14 @@ msgid "" "As of Arduino 1.0, the Server class in the Ethernet library has been renamed " "to EthernetServer.\n" "\n" -msgstr "" -"\n" -"Az Arduino 1.0-ban, az Ethernet függvény Server osztálya EthernetServer-re változott.\n" -"\n" +msgstr "" +"\n" +"Az Arduino 1.0-ban, az Ethernet függvény Server osztálya EthernetServer-re változott.\n" +"\n" #: debug/Compiler.java:483 msgid "The Client class has been renamed EthernetClient." -msgstr "A Client osztály új neve: EthernetClient" +msgstr "A Client osztály új neve: EthernetClient" #: debug/Compiler.java:484 msgid "" @@ -1069,14 +1069,14 @@ msgid "" "As of Arduino 1.0, the Client class in the Ethernet library has been renamed " "to EthernetClient.\n" "\n" -msgstr "" -"\n" -"Az Arduino 1.0-ban az Ethernet függvény Client osztály új neve: EthernetClient.\n" -"\n" +msgstr "" +"\n" +"Az Arduino 1.0-ban az Ethernet függvény Client osztály új neve: EthernetClient.\n" +"\n" #: debug/Compiler.java:489 msgid "The Udp class has been renamed EthernetUdp." -msgstr "Az Udp osztály új neve: EthernetUdp." +msgstr "Az Udp osztály új neve: EthernetUdp." #: debug/Compiler.java:490 msgid "" @@ -1084,14 +1084,14 @@ msgid "" "As of Arduino 1.0, the Udp class in the Ethernet library has been renamed to " "EthernetClient.\n" "\n" -msgstr "" -"\n" -"Az Arduino 1.0-ban az Ethernet függvény Udp osztály új neve: EthernetUdp.\n" -"\n" +msgstr "" +"\n" +"Az Arduino 1.0-ban az Ethernet függvény Udp osztály új neve: EthernetUdp.\n" +"\n" #: debug/Compiler.java:495 msgid "Wire.send() has been renamed Wire.write()." -msgstr "A Wire.send() új neve: Wire.write()." +msgstr "A Wire.send() új neve: Wire.write()." #: debug/Compiler.java:496 msgid "" @@ -1099,14 +1099,14 @@ msgid "" "As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for " "consistency with other libraries.\n" "\n" -msgstr "" -"\n" -"Az Arduino 1.0-ban a Wire.send() funkció ún neve: Wire.write(), az egyéb függvényekkel analóg módon.\n" -"\n" +msgstr "" +"\n" +"Az Arduino 1.0-ban a Wire.send() funkció ún neve: Wire.write(), az egyéb függvényekkel analóg módon.\n" +"\n" #: debug/Compiler.java:501 msgid "Wire.receive() has been renamed Wire.read()." -msgstr "A Wire.receive() új neve: Wire.read()." +msgstr "A Wire.receive() új neve: Wire.read()." #: debug/Compiler.java:502 msgid "" @@ -1114,59 +1114,59 @@ msgid "" "As of Arduino 1.0, the Wire.receive() function was renamed to Wire.read() " "for consistency with other libraries.\n" "\n" -msgstr "" -"\n" -"Az Arduino 1.0-ban a Wire.receive() funkció ún neve: Wire.read(), az egyéb függvényekkel analóg módon.\n" -"\n" +msgstr "" +"\n" +"Az Arduino 1.0-ban a Wire.receive() funkció ún neve: Wire.read(), az egyéb függvényekkel analóg módon.\n" +"\n" #: EditorConsole.java:152 msgid "Console Error" -msgstr "Konzol hiba" +msgstr "Konzol hiba" #: EditorConsole.java:153 msgid "" "A problem occurred while trying to open the\n" "files used to store the console output." -msgstr "" -"Hiba lépett fel, miközben a megnyitott file\n" -"a konzolt használta volna." +msgstr "" +"Hiba lépett fel, miközben a megnyitott file\n" +"a konzolt használta volna." #: Base.java:184 msgid "Non-fatal error while setting the Look & Feel." -msgstr "Nem-végzetes hiba a kinézet beállítása során (a program férfi géneket hordoz)." +msgstr "Nem-végzetes hiba a kinézet beállítása során (a program férfi géneket hordoz)." #: Base.java:185 msgid "The error message follows, however Arduino should run fine." -msgstr "A hibaüzenetet követően az Arduino megfelelően működik." +msgstr "A hibaüzenetet követően az Arduino megfelelően működik." #: Base.java:220 msgid "Problem Setting the Platform" -msgstr "A keretrendszer konfigurálása során hiba lépett fel" +msgstr "A keretrendszer konfigurálása során hiba lépett fel" #: Base.java:221 msgid "" "An unknown error occurred while trying to load\n" "platform-specific code for your machine." -msgstr "Rendszerfüggő kód betöltése során\n " -"hiba lépett fel (A hiba az Ön gépében van.)" +msgstr "Rendszerfüggő kód betöltése során\n " +"hiba lépett fel (A hiba az Ön gépében van.)" #: Base.java:232 msgid "Please install JDK 1.5 or later" -msgstr "A futtatáshoz telepített Java 1.5 vagy újabb szoftverkörnyezet szükséges" +msgstr "A futtatáshoz telepített Java 1.5 vagy újabb szoftverkörnyezet szükséges" #: Base.java:233 msgid "" "Arduino requires a full JDK (not just a JRE)\n" "to run. Please install JDK 1.5 or later.\n" "More information can be found in the reference." -msgstr "Az Arduino futtatásához teljes telepítésű JDK (Java Fejlesztői Környezet)" -"szükséges, nem elegendő csak a JRE (Java futtatókörnyezet)" -"A JDK 1.5 vagy újabb szofver telepítése szükséges" -"Bővebb információ a Referenciák közt található." +msgstr "Az Arduino futtatásához teljes telepítésű JDK (Java Fejlesztői Környezet)" +"szükséges, nem elegendő csak a JRE (Java futtatókörnyezet)" +"A JDK 1.5 vagy újabb szofver telepítése szükséges" +"Bővebb információ a Referenciák közt található." #: Base.java:257 msgid "Sketchbook folder disappeared" -msgstr "A SketchBook mappa elérhetetlen" +msgstr "A SketchBook mappa elérhetetlen" #: Base.java:258 msgid "" @@ -1175,59 +1175,59 @@ msgid "" "location, and create a new sketchbook folder if\n" "necessary. Arduino will then stop talking about\n" "himself in the third person." -msgstr "A SketchBook mappa nem érhető el.\n" -"Az alapértelmezett hely lesz kiválasztva, és\n" -"itt létrehozva a sketch mappa." +msgstr "A SketchBook mappa nem érhető el.\n" +"Az alapértelmezett hely lesz kiválasztva, és\n" +"itt létrehozva a sketch mappa." #: Base.java:532 msgid "Time for a Break" -msgstr "Itt az idő szünetet tartani" +msgstr "Itt az idő szünetet tartani" #: Base.java:533 msgid "" "You've reached the limit for auto naming of new sketches\n" "for the day. How about going for a walk instead?" -msgstr "Meghaladtad az egy napra jutó új Sketch-ek létrehozási\n " -"számát. Nem kéne sétálni egyet - pihenésül?" +msgstr "Meghaladtad az egy napra jutó új Sketch-ek létrehozási\n " +"számát. Nem kéne sétálni egyet - pihenésül?" #: Base.java:537 msgid "Sunshine" -msgstr "Napfény" +msgstr "Napfény" #: Base.java:538 msgid "No really, time for some fresh air for you." -msgstr "Hoppá, itt az idő levegőznöd egyet." +msgstr "Hoppá, itt az idő levegőznöd egyet." #: Base.java:633 msgid "Open an Arduino sketch..." -msgstr "Arduino Sketch megnyitása..." +msgstr "Arduino Sketch megnyitása..." #: Base.java:772 msgid "" " Are you " "sure you want to Quit?

Closing the last open sketch will quit Arduino." -msgstr "" -" Biztosan ki akarsz lépni?

Az utolsó Sketch bezárásával az Arduino kilép." +msgstr "" +" Biztosan ki akarsz lépni?

Az utolsó Sketch bezárásával az Arduino kilép." #: Base.java:970 msgid "Contributed" -msgstr "Hozzáadás" +msgstr "Hozzáadás" #: Base.java:1095 msgid "Sketch Does Not Exist" -msgstr "Sketch nem megnyitható" +msgstr "Sketch nem megnyitható" #: Base.java:1096 msgid "" "The selected sketch no longer exists.\n" "You may need to restart Arduino to update\n" "the sketchbook menu." -msgstr "" -"A kiválasztott Sketch nem érhető el.\n" -"A SketchBook menü frissítéséhez az Arduino\n" -"újraindítása szükséges." +msgstr "" +"A kiválasztott Sketch nem érhető el.\n" +"A SketchBook menü frissítéséhez az Arduino\n" +"újraindítása szükséges." #: Base.java:1125 #, java-format @@ -1237,16 +1237,16 @@ msgid "" "(ASCII-only with no spaces, and it cannot start with a number).\n" "To get rid of this message, remove the sketch from\n" "{1}" -msgstr "" -"A \"{0}\" Sketch nem használható.\n" -"A Sketch neve csak angol abc betűit, számokat\n" -"tartalmazhat, szóköz nélkül és az első betűje nem lehet szám.\n" -"A hibás Sketch-et távolítsd el\n" -"a(z) {1} mappából!" +msgstr "" +"A \"{0}\" Sketch nem használható.\n" +"A Sketch neve csak angol abc betűit, számokat\n" +"tartalmazhat, szóköz nélkül és az első betűje nem lehet szám.\n" +"A hibás Sketch-et távolítsd el\n" +"a(z) {1} mappából!" #: Base.java:1132 msgid "Ignoring sketch with bad name" -msgstr "Hibás Sketch név kihagyása" +msgstr "Hibás Sketch név kihagyása" #: Base.java:1202 #, java-format @@ -1254,193 +1254,193 @@ msgid "" "The library \"{0}\" cannot be used.\n" "Library names must contain only basic letters and numbers.\n" "(ASCII only and no spaces, and it cannot start with a number)" -msgstr "" -"A \"{0}\" könyvtár nem használható.\n" -"A neve az angol abc betűit és számokat tartalmazhat\n" -"(szóköz nem lehet benne és nem kezdődhet számmal)." +msgstr "" +"A \"{0}\" könyvtár nem használható.\n" +"A neve az angol abc betűit és számokat tartalmazhat\n" +"(szóköz nem lehet benne és nem kezdődhet számmal)." #: Base.java:1207 msgid "Ignoring bad library name" -msgstr "Hibás könyvtárnév kihagyása" +msgstr "Hibás könyvtárnév kihagyása" #: Base.java:1432 msgid "Problem getting data folder" -msgstr "Probléma a könyvtár elérésekor" +msgstr "Probléma a könyvtár elérésekor" #: Base.java:1433 msgid "Error getting the Arduino data folder." -msgstr "Hiba az Arduino data könyvtár elérésekor." +msgstr "Hiba az Arduino data könyvtár elérésekor." #: Base.java:1440 msgid "Settings issues" -msgstr "Kimenetek beállítása" +msgstr "Kimenetek beállítása" #: Base.java:1441 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your settings." -msgstr "" -"Arduino nem futtatható, mert nem hozható létre\n" -"a felhasználói beállítások mappája." +msgstr "" +"Arduino nem futtatható, mert nem hozható létre\n" +"a felhasználói beállítások mappája." #: Base.java:1602 msgid "You forgot your sketchbook" -msgstr "Felejtsd el a SketchBook-ot" +msgstr "Felejtsd el a SketchBook-ot" #: Base.java:1603 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your sketchbook." -msgstr "" -"Arduino nem futtatható, mert nem hozható létre\n" -"a felhasználói Sketch mentések mappája." +msgstr "" +"Arduino nem futtatható, mert nem hozható létre\n" +"a felhasználói Sketch mentések mappája." #: Base.java:1623 msgid "Select (or create new) folder for sketches..." -msgstr "Válassz (vagy hozz létre) mappát a Sketch-eknek..." +msgstr "Válassz (vagy hozz létre) mappát a Sketch-eknek..." #: Base.java:1647 msgid "Problem Opening URL" -msgstr "Hiba az URL megnyitásakor" +msgstr "Hiba az URL megnyitásakor" #: Base.java:1648 #, java-format msgid "" "Could not open the URL\n" "{0}" -msgstr "" -"Nem nyitható meg az URL:\n" -"{0}" +msgstr "" +"Nem nyitható meg az URL:\n" +"{0}" #: Base.java:1671 msgid "Problem Opening Folder" -msgstr "Hiba a mappa megnyitásakor" +msgstr "Hiba a mappa megnyitásakor" #: Base.java:1672 #, java-format msgid "" "Could not open the folder\n" "{0}" -msgstr "" -"Nem nyitható meg a mappa:\n" -"{0}" +msgstr "" +"Nem nyitható meg a mappa:\n" +"{0}" #: Base.java:1785 msgid "Guide_MacOSX.html" -msgstr "Guide_MacOSX.html" +msgstr "Guide_MacOSX.html" #: Base.java:1787 msgid "Guide_Windows.html" -msgstr "Guide_Windows.html" +msgstr "Guide_Windows.html" #: Base.java:1789 msgid "http://www.arduino.cc/playground/Learning/Linux" -msgstr "http://www.arduino.cc/playground/Learning/Linux" +msgstr "http://www.arduino.cc/playground/Learning/Linux" #: Base.java:1794 msgid "index.html" -msgstr "index.html" +msgstr "index.html" #: Base.java:1799 msgid "Guide_Environment.html" -msgstr "Guide_Environment.html" +msgstr "Guide_Environment.html" #: Base.java:1804 msgid "environment" -msgstr "környezet" +msgstr "környezet" #: Base.java:1804 msgid "platforms.html" -msgstr "platforms.html" +msgstr "platforms.html" #: Base.java:1809 msgid "Guide_Troubleshooting.html" -msgstr "Guide_Troubleshooting.html" +msgstr "Guide_Troubleshooting.html" #: Base.java:1814 msgid "FAQ.html" -msgstr "FAQ.html" +msgstr "FAQ.html" #: Base.java:1826 msgid "Message" -msgstr "Üzenet" +msgstr "Üzenet" #: Base.java:1842 msgid "Warning" -msgstr "Figyelmeztetés" +msgstr "Figyelmeztetés" #: Base.java:2196 #, java-format msgid "Could not remove old version of {0}" -msgstr "Nem törölhető a {0} régi verziója" +msgstr "Nem törölhető a {0} régi verziója" #: Base.java:2206 #, java-format msgid "Could not replace {0}" -msgstr "Nem cserélhető: {0}" +msgstr "Nem cserélhető: {0}" #: Base.java:2247 Base.java:2270 #, java-format msgid "Could not delete {0}" -msgstr "Nem törölhető: {0}" +msgstr "Nem törölhető: {0}" #: EditorHeader.java:292 msgid "New Tab" -msgstr "Új fül" +msgstr "Új fül" #: EditorHeader.java:300 msgid "Rename" -msgstr "Átnevezés" +msgstr "Átnevezés" #: EditorHeader.java:326 msgid "Previous Tab" -msgstr "Előző fül" +msgstr "Előző fül" #: EditorHeader.java:340 msgid "Next Tab" -msgstr "Következő fül" +msgstr "Következő fül" #: EditorToolbar.java:41 EditorToolbar.java:46 msgid "Verify" -msgstr "Ellenőrzés" +msgstr "Ellenőrzés" #: EditorToolbar.java:41 msgid "Open" -msgstr "Megnyitás" +msgstr "Megnyitás" #: EditorToolbar.java:46 msgid "New Editor Window" -msgstr "Új szerkesztőablak" +msgstr "Új szerkesztőablak" #: EditorToolbar.java:46 msgid "Open in Another Window" -msgstr "Megnyitás új ablakban" +msgstr "Megnyitás új ablakban" #: Platform.java:167 msgid "No launcher available" -msgstr "Nem indítható" +msgstr "Nem indítható" #: Platform.java:168 msgid "" "Unspecified platform, no launcher available.\n" "To enable opening URLs or folders, add a \n" "\"launcher=/path/to/app\" line to preferences.txt" -msgstr "" -"Nem ismert platform, indítás nem lehetséges.\n" -"Az URL vagy mappa megnyitásához a preferences.txt-ben a\n" -"\"launcher=/path/to/app\" sor hozzáadása szükséges" +msgstr "" +"Nem ismert platform, indítás nem lehetséges.\n" +"Az URL vagy mappa megnyitásához a preferences.txt-ben a\n" +"\"launcher=/path/to/app\" sor hozzáadása szükséges" #: Theme.java:52 msgid "" "Could not read color theme settings.\n" "You'll need to reinstall Processing." -msgstr "" -"Nem olvasható a színséma,\n" -"a Processing újratelepítésére van szükség." +msgstr "" +"Nem olvasható a színséma,\n" +"a Processing újratelepítésére van szükség." #: Preferences.java:80 msgid "Browse" -msgstr "Tallóz" +msgstr "Tallóz" #: Preferences.java:83 msgid "System Default" @@ -1456,11 +1456,11 @@ msgstr "" #: Preferences.java:86 msgid "Catalan" -msgstr "Katalán" +msgstr "Katalán" #: Preferences.java:87 msgid "Chinese Simplified" -msgstr "Egyszerüsített kínai" +msgstr "Egyszerüsített kínai" #: Preferences.java:88 msgid "Chinese Traditional" @@ -1468,15 +1468,15 @@ msgstr "" #: Preferences.java:89 msgid "Danish" -msgstr "Dán" +msgstr "Dán" #: Preferences.java:90 msgid "Dutch" -msgstr "Holland" +msgstr "Holland" #: Preferences.java:91 msgid "English" -msgstr "Angol" +msgstr "Angol" #: Preferences.java:92 msgid "Estonian" @@ -1484,27 +1484,27 @@ msgstr "" #: Preferences.java:93 msgid "French" -msgstr "Francia" +msgstr "Francia" #: Preferences.java:94 msgid "Filipino" -msgstr "Fülöp-szigetek" +msgstr "Fülöp-szigetek" #: Preferences.java:95 msgid "Galician" -msgstr "Gall" +msgstr "Gall" #: Preferences.java:96 msgid "German" -msgstr "Német" +msgstr "Német" #: Preferences.java:97 msgid "Greek" -msgstr "Görög" +msgstr "Görög" #: Preferences.java:98 msgid "Hungarian" -msgstr "Magyar" +msgstr "Magyar" #: Preferences.java:99 msgid "Indonesian" @@ -1512,11 +1512,11 @@ msgstr "" #: Preferences.java:100 msgid "Italian" -msgstr "Olasz" +msgstr "Olasz" #: Preferences.java:101 msgid "Japanese" -msgstr "Japán" +msgstr "Japán" #: Preferences.java:102 msgid "Korean" @@ -1524,7 +1524,7 @@ msgstr "" #: Preferences.java:103 msgid "Latvian" -msgstr "Lett" +msgstr "Lett" #: Preferences.java:104 msgid "Lithuaninan" @@ -1532,7 +1532,7 @@ msgstr "" #: Preferences.java:105 msgid "Persian" -msgstr "Perzsa" +msgstr "Perzsa" #: Preferences.java:106 msgid "Polish" @@ -1544,49 +1544,49 @@ msgstr "" #: Preferences.java:109 msgid "Romanian" -msgstr "Román" +msgstr "Román" #: Preferences.java:110 msgid "Russian" -msgstr "Orosz" +msgstr "Orosz" #: Preferences.java:111 msgid "Spanish" -msgstr "Spanyol" +msgstr "Spanyol" #: Preferences.java:210 msgid "" "Could not read default settings.\n" "You'll need to reinstall Arduino." -msgstr "" -"Az alapértelezett beállítások nem olvashatóak\n" -"Az Arduino újratelepítése szükséges." +msgstr "" +"Az alapértelezett beállítások nem olvashatóak\n" +"Az Arduino újratelepítése szükséges." #: Preferences.java:242 #, java-format msgid "Could not read preferences from {0}" -msgstr "A beállítások nem olvashatóak: {0}" +msgstr "A beállítások nem olvashatóak: {0}" #: Preferences.java:261 msgid "Error reading preferences" -msgstr "Alapbeállítások olvasása közben hiba lépett fel" +msgstr "Alapbeállítások olvasása közben hiba lépett fel" #: Preferences.java:263 #, java-format msgid "" "Error reading the preferences file. Please delete (or move)\n" "{0} and restart Arduino." -msgstr "" -"Hiba a beállítások olvasása során. Kérem törölje (vagy mozgassa el) a\n" -"{0} file-t és indítsa újra az Arduino-t!" +msgstr "" +"Hiba a beállítások olvasása során. Kérem törölje (vagy mozgassa el) a\n" +"{0} file-t és indítsa újra az Arduino-t!" #: Preferences.java:299 msgid "Sketchbook location:" -msgstr "SketchBook helye:" +msgstr "SketchBook helye:" #: Preferences.java:314 msgid "Select new sketchbook location" -msgstr "Válasszon új SketchBook mappát" +msgstr "Válasszon új SketchBook mappát" #: Preferences.java:337 msgid "Editor language: " @@ -1594,51 +1594,51 @@ msgstr "" #: Preferences.java:342 Preferences.java:358 msgid " (requires restart of Arduino)" -msgstr " (Arduino újraindítása szükséges)" +msgstr " (Arduino újraindítása szükséges)" #: Preferences.java:354 msgid "Editor font size: " -msgstr "Szerkesztő betűméret:" +msgstr "Szerkesztő betűméret:" #: Preferences.java:371 msgid "Show verbose output during: " -msgstr "Log mutatása:" +msgstr "Log mutatása:" #: Preferences.java:373 msgid "compilation " -msgstr "fordításkor " +msgstr "fordításkor " #: Preferences.java:375 msgid "upload" -msgstr "feltöltéskor" +msgstr "feltöltéskor" #: Preferences.java:384 msgid "Verify code after upload" -msgstr "Kód ellenőrzés feltöltés után" +msgstr "Kód ellenőrzés feltöltés után" #: Preferences.java:393 msgid "Use external editor" -msgstr "Külső szerkesztő használata" +msgstr "Külső szerkesztő használata" #: Preferences.java:403 msgid "Check for updates on startup" -msgstr "Újabb verzió ellenőrzése indításkor" +msgstr "Újabb verzió ellenőrzése indításkor" #: Preferences.java:412 msgid "Update sketch files to new extension on save (.pde -> .ino)" -msgstr "Sketch frissítése az új kiterjesztéssel (.pde -> .ino)" +msgstr "Sketch frissítése az új kiterjesztéssel (.pde -> .ino)" #: Preferences.java:423 msgid "Automatically associate .ino files with Arduino" -msgstr "Automatikus kiterjesztés-hozzárendelés: .ino->Arduino" +msgstr "Automatikus kiterjesztés-hozzárendelés: .ino->Arduino" #: Preferences.java:433 msgid "More preferences can be edited directly in the file" -msgstr "További számos beállítás elérhető a file közvetlen szerkesztésével" +msgstr "További számos beállítás elérhető a file közvetlen szerkesztésével" #: Preferences.java:462 msgid "(edit only when Arduino is not running)" -msgstr "(csak akkor szerkeszthető, ha az Arduino nem fut)" +msgstr "(csak akkor szerkeszthető, ha az Arduino nem fut)" #: Preferences.java:609 #, java-format diff --git a/app/src/processing/app/i18n/Resources_hu.properties b/app/src/processing/app/i18n/Resources_hu.properties index bf805dbb5a1..a16051fe417 100644 --- a/app/src/processing/app/i18n/Resources_hu.properties +++ b/app/src/processing/app/i18n/Resources_hu.properties @@ -1,8 +1,8 @@ -# Hungarian translations for PACKAGE package. -# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Robert Cseh , 2012. -# +# Hungarian translations for PACKAGE package. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Robert Cseh , 2012. +# !=Project-Id-Version\: PACKAGE VERSION\nReport-Msgid-Bugs-To\: Robert Cseh\nPOT-Creation-Date\: 2012-04-03 10\:24-0400\nPO-Revision-Date\: 2012-04-11 23\:15-0400\nLast-Translator\: Robert Cseh \nLanguage-Team\: Hungarian\nLanguage\: hu\nMIME-Version\: 1.0\nContent-Type\: text/plain; charset\=UTF-8\nContent-Transfer-Encoding\: 8bit\nPlural-Forms\: nplurals\=2; plural\=(n \!\= 1);\n #: Editor.java:366 diff --git a/app/src/processing/app/i18n/Resources_id.po b/app/src/processing/app/i18n/Resources_id.po index a75be9892ef..75a26469319 100644 --- a/app/src/processing/app/i18n/Resources_id.po +++ b/app/src/processing/app/i18n/Resources_id.po @@ -1,278 +1,278 @@ -# Indonesian translations for the Arduino IDE. -# Copyright (C) 2012 -# This file is distributed under the same license as the Arduino IDE package. -# Rininta Andari , 2012. -# +# Indonesian translations for the Arduino IDE. +# Copyright (C) 2012 +# This file is distributed under the same license as the Arduino IDE package. +# Rininta Andari , 2012. +# msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-04-02 18:10+0100\n" -"PO-Revision-Date: 2012-04-15 23:20+0100\n" -"Last-Translator: Rininta Andari \n" -"Language-Team: Indonesian\n" -"Language: id\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-04-02 18:10+0100\n" +"PO-Revision-Date: 2012-04-15 23:20+0100\n" +"Last-Translator: Rininta Andari \n" +"Language-Team: Indonesian\n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: Editor.java:366 msgid "No files were added to the sketch." -msgstr "Tidak ada berkas yang ditambahkan ke sketsa." +msgstr "Tidak ada berkas yang ditambahkan ke sketsa." #: Editor.java:369 Sketch.java:996 msgid "One file added to the sketch." -msgstr "Satu berkas ditambahkan ke sketsa." +msgstr "Satu berkas ditambahkan ke sketsa." #: Editor.java:373 #, java-format msgid "{0} files added to the sketch." -msgstr "{0} berkas ditambahkan ke sketsa." +msgstr "{0} berkas ditambahkan ke sketsa." #: Editor.java:484 msgid "File" -msgstr "Berkas" +msgstr "Berkas" #: Editor.java:486 EditorToolbar.java:41 msgid "New" -msgstr "Baru" +msgstr "Baru" #: Editor.java:494 Base.java:903 msgid "Open..." -msgstr "Buka..." +msgstr "Buka..." #: Editor.java:503 msgid "Sketchbook" -msgstr "Buku Sketsa" +msgstr "Buku Sketsa" #: Editor.java:509 msgid "Examples" -msgstr "Contoh" +msgstr "Contoh" #: Editor.java:514 Editor.java:1977 msgid "Close" -msgstr "Tutup" +msgstr "Tutup" #: Editor.java:522 Editor.java:2017 Editor.java:2421 EditorToolbar.java:41 #: EditorToolbar.java:46 msgid "Save" -msgstr "Simpan" +msgstr "Simpan" #: Editor.java:530 msgid "Save As..." -msgstr "Simpan Sebagai..." +msgstr "Simpan Sebagai..." #: Editor.java:538 EditorToolbar.java:41 msgid "Upload" -msgstr "Unggah" +msgstr "Unggah" #: Editor.java:546 EditorToolbar.java:46 msgid "Upload Using Programmer" -msgstr "Unggah Menggunakan Programmer" +msgstr "Unggah Menggunakan Programmer" #: Editor.java:556 msgid "Page Setup" -msgstr "Pengaturan Halaman" +msgstr "Pengaturan Halaman" #: Editor.java:564 msgid "Print" -msgstr "Cetak" +msgstr "Cetak" #: Editor.java:576 Preferences.java:279 msgid "Preferences" -msgstr "Preferensi" +msgstr "Preferensi" #: Editor.java:586 Base.java:782 msgid "Quit" -msgstr "Keluar" +msgstr "Keluar" #: Editor.java:600 msgid "Sketch" -msgstr "Sketsa" +msgstr "Sketsa" #: Editor.java:602 msgid "Verify / Compile" -msgstr "Memeriksa / Menyusun" +msgstr "Memeriksa / Menyusun" #: Editor.java:629 msgid "Import Library..." -msgstr "Impor Perpustakaan..." +msgstr "Impor Perpustakaan..." #: Editor.java:634 msgid "Show Sketch Folder" -msgstr "Tampilkan Map Sketsa" +msgstr "Tampilkan Map Sketsa" #: Editor.java:643 msgid "Add File..." -msgstr "Tambah Berkas..." +msgstr "Tambah Berkas..." #: Editor.java:656 msgid "Tools" -msgstr "Peralatan" +msgstr "Peralatan" #: Editor.java:662 EditorToolbar.java:41 EditorToolbar.java:46 msgid "Serial Monitor" -msgstr "Serial Monitor" +msgstr "Serial Monitor" #: Editor.java:682 msgid "Board" -msgstr "Papan" +msgstr "Papan" #: Editor.java:690 msgid "Serial Port" -msgstr "Serial Port" +msgstr "Serial Port" #: Editor.java:695 msgid "Programmer" -msgstr "Programmer" +msgstr "Programmer" #: Editor.java:699 msgid "Burn Bootloader" -msgstr "Bakar Bootloader" +msgstr "Bakar Bootloader" #: Editor.java:923 msgid "serialMenu is null" -msgstr "serialMenu is null" +msgstr "serialMenu is null" #: Editor.java:927 Editor.java:934 msgid "name is null" -msgstr "name is null" +msgstr "name is null" #: Editor.java:986 msgid "error retrieving port list" -msgstr "kesalahan dalam mengambil daftar port" +msgstr "kesalahan dalam mengambil daftar port" #: Editor.java:1002 msgid "Help" -msgstr "Bantuan" +msgstr "Bantuan" #: Editor.java:1041 msgid "Getting Started" -msgstr "Memulai" +msgstr "Memulai" #: Editor.java:1049 msgid "Environment" -msgstr "Lingkungan" +msgstr "Lingkungan" #: Editor.java:1057 msgid "Troubleshooting" -msgstr "Pemecahan masalah" +msgstr "Pemecahan masalah" #: Editor.java:1065 msgid "Reference" -msgstr "Referensi" +msgstr "Referensi" #: Editor.java:1073 Editor.java:2728 msgid "Find in Reference" -msgstr "Cari di Referensi" +msgstr "Cari di Referensi" #: Editor.java:1083 msgid "Frequently Asked Questions" -msgstr "Pertanyaan yang Sering Diajukan" +msgstr "Pertanyaan yang Sering Diajukan" #: Editor.java:1091 msgid "Visit Arduino.cc" -msgstr "Kunjungi Arduino.cc" +msgstr "Kunjungi Arduino.cc" #: Editor.java:1094 msgid "http://arduino.cc/" -msgstr "http://arduino.cc/" +msgstr "http://arduino.cc/" #: Editor.java:1102 msgid "About Arduino" -msgstr "Tentang Arduino" +msgstr "Tentang Arduino" #: Editor.java:1116 msgid "Edit" -msgstr "Edit" +msgstr "Edit" #: Editor.java:1119 Editor.java:1341 msgid "Undo" -msgstr "Batalkan" +msgstr "Batalkan" #: Editor.java:1124 Editor.java:1126 Editor.java:1376 msgid "Redo" -msgstr "Ulang" +msgstr "Ulang" #: Editor.java:1135 Editor.java:2652 msgid "Cut" -msgstr "Potong" +msgstr "Potong" #: Editor.java:1143 Editor.java:2660 msgid "Copy" -msgstr "Salin" +msgstr "Salin" #: Editor.java:1151 Editor.java:2668 msgid "Copy for Forum" -msgstr "Salin untuk Forum" +msgstr "Salin untuk Forum" #: Editor.java:1163 Editor.java:2676 msgid "Copy as HTML" -msgstr "Salin sebagai HTML" +msgstr "Salin sebagai HTML" #: Editor.java:1175 Editor.java:2684 msgid "Paste" -msgstr "Rekat" +msgstr "Rekat" #: Editor.java:1184 Editor.java:2692 msgid "Select All" -msgstr "Pilih Semua" +msgstr "Pilih Semua" #: Editor.java:1194 Editor.java:2702 msgid "Comment/Uncomment" -msgstr "Beri komentar/Tidak beri komentar" +msgstr "Beri komentar/Tidak beri komentar" #: Editor.java:1202 Editor.java:2710 msgid "Increase Indent" -msgstr "Tambah Indentasi" +msgstr "Tambah Indentasi" #: Editor.java:1210 Editor.java:2718 msgid "Decrease Indent" -msgstr "Kurangi Indentasi" +msgstr "Kurangi Indentasi" #: Editor.java:1220 msgid "Find..." -msgstr "Cari..." +msgstr "Cari..." #: Editor.java:1235 msgid "Find Next" -msgstr "Cari Berikutnya" +msgstr "Cari Berikutnya" #: Editor.java:1245 msgid "Find Previous" -msgstr "Cari Sebelumnya" +msgstr "Cari Sebelumnya" #: Editor.java:1255 msgid "Use Selection For Find" -msgstr "Gunakan Pilihan Untuk Pencarian" +msgstr "Gunakan Pilihan Untuk Pencarian" #: Editor.java:1816 msgid "First select a word to find in the reference." -msgstr "Pertama pilih sebuah kata untuk dicari di referensi." +msgstr "Pertama pilih sebuah kata untuk dicari di referensi." #: Editor.java:1823 #, java-format msgid "No reference available for \"{0}\"" -msgstr "Tidak ada referensi yang tersedia untuk \"{0}\"" +msgstr "Tidak ada referensi yang tersedia untuk \"{0}\"" #: Editor.java:1826 #, java-format msgid "{0}.html" -msgstr "{0}.html" +msgstr "{0}.html" #: Editor.java:1843 Sketch.java:1647 msgid "Compiling sketch..." -msgstr "Menyusun sketsa..." +msgstr "Menyusun sketsa..." #: Editor.java:1864 Editor.java:1881 msgid "Done compiling." -msgstr "Selesai menyusun." +msgstr "Selesai menyusun." #: Editor.java:1973 #, java-format msgid "Save changes to \"{0}\"? " -msgstr "Simpan perubahan ke \"{0}\"? " +msgstr "Simpan perubahan ke \"{0}\"? " #: Editor.java:2006 msgid "" @@ -280,37 +280,37 @@ msgid "" "{ font: 11pt \"Lucida Grande\"; margin-top: 8px } Do you " "want to save changes to this sketch
before closing?

If you don't " "save, your changes will be lost." -msgstr "" -" Apakah anda " -"ingin menyimpan perubahan ke sketsa ini
sebelum menutup?

Jika anda tidak " -"menyimpan, perubahan anda akan hilang." +msgstr "" +" Apakah anda " +"ingin menyimpan perubahan ke sketsa ini
sebelum menutup?

Jika anda tidak " +"menyimpan, perubahan anda akan hilang." #: Editor.java:2017 Editor.java:2098 Editor.java:2418 Sketch.java:589 #: Sketch.java:741 Sketch.java:1046 Preferences.java:78 msgid "Cancel" -msgstr "Batalkan" +msgstr "Batalkan" #: Editor.java:2017 msgid "Don't Save" -msgstr "Jangan Simpan" +msgstr "Jangan Simpan" #: Editor.java:2089 msgid "Bad file selected" -msgstr "Berkas buruk dipilih" +msgstr "Berkas buruk dipilih" #: Editor.java:2090 msgid "" "Processing can only open its own sketches\n" "and other files ending in .ino or .pde" -msgstr "" -"Processing hanya dapat membuka sketsanya sendiri\n" -"dan berkas lainnya yang berakhir dengan .ino atau .pde" +msgstr "" +"Processing hanya dapat membuka sketsanya sendiri\n" +"dan berkas lainnya yang berakhir dengan .ino atau .pde" #: Editor.java:2098 Editor.java:2418 Sketch.java:589 Sketch.java:741 #: Sketch.java:1046 Preferences.java:79 msgid "OK" -msgstr "OK" +msgstr "OK" #: Editor.java:2100 #, java-format @@ -318,329 +318,329 @@ msgid "" "The file \"{0}\" needs to be inside\n" "a sketch folder named \"{1}\".\n" "Create this folder, move the file, and continue?" -msgstr "" -"Berkas \"{0}\" harus berada di dalam\n" -"sebuah map sketsa bernama \"{1}\".\n" -"Buatkan map ini, pindahkan berkas, dan lanjutkan?" +msgstr "" +"Berkas \"{0}\" harus berada di dalam\n" +"sebuah map sketsa bernama \"{1}\".\n" +"Buatkan map ini, pindahkan berkas, dan lanjutkan?" #: Editor.java:2109 msgid "Moving" -msgstr "Memindahkan" +msgstr "Memindahkan" #: Editor.java:2120 Editor.java:2131 Editor.java:2141 Editor.java:2159 #: Sketch.java:479 Sketch.java:485 Sketch.java:500 Sketch.java:507 #: Sketch.java:530 Sketch.java:547 Base.java:1861 Preferences.java:240 msgid "Error" -msgstr "Kesalahan" +msgstr "Kesalahan" #: Editor.java:2122 #, java-format msgid "A folder named \"{0}\" already exists. Can't open sketch." -msgstr "Sebuah map bernama \"{0}\" sudah ada. Tidak dapat membuka sketsa." +msgstr "Sebuah map bernama \"{0}\" sudah ada. Tidak dapat membuka sketsa." #: Editor.java:2132 msgid "Could not create the sketch folder." -msgstr "Tidak dapat membuat map sketsa." +msgstr "Tidak dapat membuat map sketsa." #: Editor.java:2141 msgid "Could not copy to a proper location." -msgstr "Tidak dapat menyalin ke lokasi yang tepat." +msgstr "Tidak dapat menyalin ke lokasi yang tepat." #: Editor.java:2159 msgid "Could not create the sketch." -msgstr "Tidak dapat membuat sketsa." +msgstr "Tidak dapat membuat sketsa." #: Editor.java:2166 #, java-format msgid "{0} | Arduino {1}" -msgstr "{0} | Arduino {1}" +msgstr "{0} | Arduino {1}" #: Editor.java:2223 Editor.java:2261 msgid "Saving..." -msgstr "Menyimpan..." +msgstr "Menyimpan..." #: Editor.java:2228 Editor.java:2264 msgid "Done Saving." -msgstr "Selesai Menyimpan." +msgstr "Selesai Menyimpan." #: Editor.java:2270 msgid "Save Canceled." -msgstr "Penyimpanan Dibatalkan." +msgstr "Penyimpanan Dibatalkan." #: Editor.java:2296 #, java-format msgid "" "Serial port {0} not found.\n" "Retry the upload with another serial port?" -msgstr "" -"Serial port {0} tidak ditemukan.\n" -"Ulang unggah dengan serial port lain?" +msgstr "" +"Serial port {0} tidak ditemukan.\n" +"Ulang unggah dengan serial port lain?" #: Editor.java:2331 msgid "Uploading to I/O Board..." -msgstr "Mengunggah ke Papan I/O..." +msgstr "Mengunggah ke Papan I/O..." #: Editor.java:2348 Editor.java:2384 msgid "Done uploading." -msgstr "Selesai mengunggah." +msgstr "Selesai mengunggah." #: Editor.java:2356 Editor.java:2392 msgid "Upload canceled." -msgstr "Unggah dibatalkan." +msgstr "Unggah dibatalkan." #: Editor.java:2420 msgid "Save changes before export?" -msgstr "Simpan perubahan sebelum ekspor?" +msgstr "Simpan perubahan sebelum ekspor?" #: Editor.java:2435 msgid "Export canceled, changes must first be saved." -msgstr "Ekspor dibatalkan, perubahan harus disimpan terlebih dahulu." +msgstr "Ekspor dibatalkan, perubahan harus disimpan terlebih dahulu." #: Editor.java:2457 msgid "Burning bootloader to I/O Board (this may take a minute)..." -msgstr "Membakar bootloader ke Papan I/O (ini akan berlangsung beberapa saat)..." +msgstr "Membakar bootloader ke Papan I/O (ini akan berlangsung beberapa saat)..." #: Editor.java:2463 msgid "Done burning bootloader." -msgstr "Selesai membakar bootloader." +msgstr "Selesai membakar bootloader." #: Editor.java:2465 Editor.java:2469 Editor.java:2473 msgid "Error while burning bootloader." -msgstr "Kesalahan ketika membakar bootloader." +msgstr "Kesalahan ketika membakar bootloader." #: Editor.java:2500 msgid "Printing..." -msgstr "Mencetak..." +msgstr "Mencetak..." #: Editor.java:2517 msgid "Done printing." -msgstr "Selesai mencetak." +msgstr "Selesai mencetak." #: Editor.java:2520 msgid "Error while printing." -msgstr "Kesalahan ketika mencetak." +msgstr "Kesalahan ketika mencetak." #: Editor.java:2524 msgid "Printing canceled." -msgstr "Mencetak dibatalkan." +msgstr "Mencetak dibatalkan." #: Editor.java:2572 #, java-format msgid "Bad error line: {0}" -msgstr "Baris kesalahan buruk: {0}" +msgstr "Baris kesalahan buruk: {0}" #: Editor.java:2641 msgid "Open URL" -msgstr "Buka URL" +msgstr "Buka URL" #: UpdateCheck.java:53 msgid "http://www.arduino.cc/latest.txt" -msgstr "http://www.arduino.cc/latest.txt" +msgstr "http://www.arduino.cc/latest.txt" #: UpdateCheck.java:103 msgid "" "A new version of Arduino is available,\n" "would you like to visit the Arduino download page?" -msgstr "" -"Sebuah versi baru Arduino telah tersedia,\n" -"apakah anda ingin mengunjungi halaman unduh Arduino?" +msgstr "" +"Sebuah versi baru Arduino telah tersedia,\n" +"apakah anda ingin mengunjungi halaman unduh Arduino?" #: UpdateCheck.java:108 Preferences.java:76 msgid "Yes" -msgstr "Ya" +msgstr "Ya" #: UpdateCheck.java:108 Preferences.java:77 msgid "No" -msgstr "Tidak" +msgstr "Tidak" #: UpdateCheck.java:111 msgid "Update" -msgstr "Pembaruan" +msgstr "Pembaruan" #: UpdateCheck.java:118 msgid "http://www.arduino.cc/en/Main/Software" -msgstr "http://www.arduino.cc/en/Main/Software" +msgstr "http://www.arduino.cc/en/Main/Software" #: FindReplace.java:80 msgid "Find:" -msgstr "Cari:" +msgstr "Cari:" #: FindReplace.java:81 msgid "Replace with:" -msgstr "Ganti dengan:" +msgstr "Ganti dengan:" #: FindReplace.java:96 msgid "Ignore Case" -msgstr "Abaikan Kasus" +msgstr "Abaikan Kasus" #: FindReplace.java:105 msgid "Wrap Around" -msgstr "Membungkus" +msgstr "Membungkus" #: FindReplace.java:120 FindReplace.java:131 msgid "Replace All" -msgstr "Ganti Semua" +msgstr "Ganti Semua" #: FindReplace.java:121 FindReplace.java:130 Sketch.java:1050 msgid "Replace" -msgstr "Ganti" +msgstr "Ganti" #: FindReplace.java:122 FindReplace.java:129 msgid "Replace & Find" -msgstr "Ganti & Cari" +msgstr "Ganti & Cari" #: FindReplace.java:123 FindReplace.java:128 msgid "Previous" -msgstr "Sebelumnya" +msgstr "Sebelumnya" #: FindReplace.java:124 FindReplace.java:127 msgid "Find" -msgstr "Cari" +msgstr "Cari" #: SerialMonitor.java:93 msgid "Send" -msgstr "Kirim" +msgstr "Kirim" #: SerialMonitor.java:110 msgid "Autoscroll" -msgstr "Scroll otomatis" +msgstr "Scroll otomatis" #: SerialMonitor.java:112 msgid "No line ending" -msgstr "Tidak ada akhir baris" +msgstr "Tidak ada akhir baris" #: SerialMonitor.java:112 msgid "Newline" -msgstr "Baris baru" +msgstr "Baris baru" #: SerialMonitor.java:112 msgid "Carriage return" -msgstr "Bawaan kembali" +msgstr "Bawaan kembali" #: SerialMonitor.java:112 msgid "Both NL & CR" -msgstr "Keduanya NL & CR" +msgstr "Keduanya NL & CR" #: SerialMonitor.java:130 SerialMonitor.java:133 msgid " baud" -msgstr " baud" +msgstr " baud" #: Serial.java:147 #, java-format msgid "" "Serial port ''{0}'' already in use. Try quiting any programs that may be " "using it." -msgstr "" -"Serial port ''{0}'' telah digunakan. Coba hentikan semua program yang mungkin " -"menggunakannya." +msgstr "" +"Serial port ''{0}'' telah digunakan. Coba hentikan semua program yang mungkin " +"menggunakannya." #: Serial.java:154 #, java-format msgid "Error opening serial port ''{0}''." -msgstr "Kesalahan dalam membuka serial port ''{0}''." +msgstr "Kesalahan dalam membuka serial port ''{0}''." #: Serial.java:167 #, java-format msgid "" "Serial port ''{0}'' not found. Did you select the right one from the Tools > " "Serial Port menu?" -msgstr "" -"Serial port ''{0}'' tidak ditemukan. Apakah anda telah memilih yang tepat dari menu Peralatan > " -"Serial Port?" +msgstr "" +"Serial port ''{0}'' tidak ditemukan. Apakah anda telah memilih yang tepat dari menu Peralatan > " +"Serial Port?" #: Serial.java:424 #, java-format msgid "" "readBytesUntil() byte buffer is too small for the {0} bytes up to and " "including char {1}" -msgstr "" -"Penyangga byte readBytesUntil() terlalu kecil untuk {0} bytes sampai dengan dan " -"termasuk char {1}" +msgstr "" +"Penyangga byte readBytesUntil() terlalu kecil untuk {0} bytes sampai dengan dan " +"termasuk char {1}" #: Serial.java:567 #, java-format msgid "Error inside Serial.{0}()" -msgstr "Kesalahan di dalam Serial.{0}()" +msgstr "Kesalahan di dalam Serial.{0}()" #: tools/AutoFormat.java:91 msgid "Auto Format" -msgstr "Format Otomatis" +msgstr "Format Otomatis" #: tools/AutoFormat.java:913 tools/format/src/AutoFormat.java:54 msgid "No changes necessary for Auto Format." -msgstr "Tidak diperlukan perubahan untuk Format Otomatis." +msgstr "Tidak diperlukan perubahan untuk Format Otomatis." #: tools/AutoFormat.java:919 msgid "Auto Format Canceled: Too many right parentheses." -msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kanan." +msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kanan." #: tools/AutoFormat.java:922 msgid "Auto Format Canceled: Too many left parentheses." -msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kiri." +msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kiri." #: tools/AutoFormat.java:928 msgid "Auto Format Canceled: Too many right curly braces." -msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kurawal kanan." +msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kurawal kanan." #: tools/AutoFormat.java:931 msgid "Auto Format Canceled: Too many left curly braces." -msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kurawal kiri." +msgstr "Format Otomatis Dibatalkan: Terlalu banyak tanda kurung kurawal kiri." #: tools/AutoFormat.java:941 msgid "Auto Format finished." -msgstr "Format Otomatis selesai." +msgstr "Format Otomatis selesai." #: tools/FixEncoding.java:41 tools/FixEncoding.java:58 #: tools/FixEncoding.java:79 msgid "Fix Encoding & Reload" -msgstr "Perbaiki Pengkodean & Muat Ulang" +msgstr "Perbaiki Pengkodean & Muat Ulang" #: tools/FixEncoding.java:57 msgid "Discard all changes and reload sketch?" -msgstr "Hapus semua perubahan dan muat ulang sketsa?" +msgstr "Hapus semua perubahan dan muat ulang sketsa?" #: tools/FixEncoding.java:77 msgid "" "An error occurred while trying to fix the file encoding.\n" "Do not attempt to save this sketch as it may overwrite\n" "the old version. Use Open to re-open the sketch and try again.\n" -msgstr "" -"Sebuah kesalahan muncul ketika mencoba memperbaiki pengkodean berkas.\n" -"Jangan mencoba menyimpan sketsa ini karena dapat menimpa\n" -"versi lama. Gunakan Buka untuk kembali membuka sketsa dan coba lagi.\n" +msgstr "" +"Sebuah kesalahan muncul ketika mencoba memperbaiki pengkodean berkas.\n" +"Jangan mencoba menyimpan sketsa ini karena dapat menimpa\n" +"versi lama. Gunakan Buka untuk kembali membuka sketsa dan coba lagi.\n" #: tools/Archiver.java:48 msgid "Archive Sketch" -msgstr "Arsipkan Sketsa" +msgstr "Arsipkan Sketsa" #: tools/Archiver.java:59 msgid "yyMMdd" -msgstr "yyMMdd" +msgstr "yyMMdd" #: tools/Archiver.java:74 msgid "Couldn't archive sketch" -msgstr "Tidak dapat mengarsipkan sketsa" +msgstr "Tidak dapat mengarsipkan sketsa" #: tools/Archiver.java:75 msgid "" "Archiving the sketch has been canceled because\n" "the sketch couldn't save properly." -msgstr "" -"Pengarsipan sketsa telah dibatalkan karena\n" -"sketsa tidak dapat menyimpan dengan benar." +msgstr "" +"Pengarsipan sketsa telah dibatalkan karena\n" +"sketsa tidak dapat menyimpan dengan benar." #: tools/Archiver.java:109 msgid "Archive sketch as:" -msgstr "Arsipkan sketsa sebagai:" +msgstr "Arsipkan sketsa sebagai:" #: tools/Archiver.java:139 msgid "Archive sketch canceled." -msgstr "Pengarsipan sketsa dibatalkan." +msgstr "Pengarsipan sketsa dibatalkan." #: SketchCode.java:83 #, java-format msgid "Error while loading code {0}" -msgstr "Kesalahan ketika memuat kode {0}" +msgstr "Kesalahan ketika memuat kode {0}" #: SketchCode.java:258 #, java-format @@ -653,46 +653,46 @@ msgstr "" #: Sketch.java:278 Sketch.java:307 Sketch.java:581 Sketch.java:970 msgid "Sketch is Read-Only" -msgstr "Sketsa Hanya-Baca" +msgstr "Sketsa Hanya-Baca" #: Sketch.java:279 Sketch.java:308 Sketch.java:582 Sketch.java:971 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save the sketch in another location,\n" "and try again." -msgstr "" -"Beberapa berkas ditandai \"hanya-baca\", jadi anda harus\n" -"kembali menyimpan sketsa di lokasi lain,\n" -"dan coba lagi." +msgstr "" +"Beberapa berkas ditandai \"hanya-baca\", jadi anda harus\n" +"kembali menyimpan sketsa di lokasi lain,\n" +"dan coba lagi." #: Sketch.java:286 msgid "Name for new file:" -msgstr "Nama untuk berkas baru:" +msgstr "Nama untuk berkas baru:" #: Sketch.java:298 msgid "Sketch is Untitled" -msgstr "Sketsa tidak berjudul" +msgstr "Sketsa tidak berjudul" #: Sketch.java:299 msgid "" "How about saving the sketch first \n" "before trying to rename it?" -msgstr "" -"Bagaimana jika simpan sketsa terlebih dahulu \n" -"sebelum mencoba untuk mengubah namanya?" +msgstr "" +"Bagaimana jika simpan sketsa terlebih dahulu \n" +"sebelum mencoba untuk mengubah namanya?" #: Sketch.java:359 Sketch.java:366 Sketch.java:377 msgid "Problem with rename" -msgstr "Masalah dengan pengubahan nama" +msgstr "Masalah dengan pengubahan nama" #: Sketch.java:360 msgid "The name cannot start with a period." -msgstr "Nama tidak dapat diawali dengan sebuah periode." +msgstr "Nama tidak dapat diawali dengan sebuah periode." #: Sketch.java:368 #, java-format msgid "\".{0}\" is not a valid extension." -msgstr "\".{0}\" bukan ekstensi yang sah." +msgstr "\".{0}\" bukan ekstensi yang sah." #: Sketch.java:378 msgid "" @@ -703,92 +703,92 @@ msgstr "" #: Sketch.java:400 Sketch.java:414 Sketch.java:423 Sketch.java:863 msgid "Nope" -msgstr "Tidak" +msgstr "Tidak" #: Sketch.java:402 #, java-format msgid "A file named \"{0}\" already exists in \"{1}\"" -msgstr "Sebuah berkas bernama \"{0}\" sudah ada di \"{1}\"" +msgstr "Sebuah berkas bernama \"{0}\" sudah ada di \"{1}\"" #: Sketch.java:415 msgid "You can't have a .cpp file with the same name as the sketch." -msgstr "Anda tidak dapat memiliki sebuah berkas .cpp dengan nama yang sama dengan sketsa." +msgstr "Anda tidak dapat memiliki sebuah berkas .cpp dengan nama yang sama dengan sketsa." #: Sketch.java:425 msgid "" "You can't rename the sketch to \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" -"Anda tidak dapat mengubah nama sketsa ke \"{0}\"\n" -"karena sketsa telah memiliki sebuah berkas .cpp dengan nama tersebut." +msgstr "" +"Anda tidak dapat mengubah nama sketsa ke \"{0}\"\n" +"karena sketsa telah memiliki sebuah berkas .cpp dengan nama tersebut." #: Sketch.java:459 msgid "Cannot Rename" -msgstr "Tidak dapat mengubah nama" +msgstr "Tidak dapat mengubah nama" #: Sketch.java:461 #, java-format msgid "Sorry, a sketch (or folder) named \"{0}\" already exists." -msgstr "Maaf, sebuah sketsa (atau map) bernama \"{0}\" sudah ada." +msgstr "Maaf, sebuah sketsa (atau map) bernama \"{0}\" sudah ada." #: Sketch.java:479 msgid "Could not rename the sketch. (0)" -msgstr "Tidak dapat mengubah nama sketsa. (0)" +msgstr "Tidak dapat mengubah nama sketsa. (0)" #: Sketch.java:487 Sketch.java:532 #, java-format msgid "Could not rename \"{0}\" to \"{1}\"" -msgstr "Tidak dapat mengubah nama \"{0}\" ke \"{1}\"" +msgstr "Tidak dapat mengubah nama \"{0}\" ke \"{1}\"" #: Sketch.java:500 msgid "Could not rename the sketch. (1)" -msgstr "Tidak dapat mengubah nama sketsa. (1)" +msgstr "Tidak dapat mengubah nama sketsa. (1)" #: Sketch.java:507 msgid "Could not rename the sketch. (2)" -msgstr "Tidak dapat mengubah nama sketsa. (2)" +msgstr "Tidak dapat mengubah nama sketsa. (2)" #: Sketch.java:544 msgid "createNewFile() returned false" -msgstr "createNewFile() kembali salah" +msgstr "createNewFile() kembali salah" #: Sketch.java:591 msgid "Are you sure you want to delete this sketch?" -msgstr "Apakah anda yakin ingin menghapus sketsa ini?" +msgstr "Apakah anda yakin ingin menghapus sketsa ini?" #: Sketch.java:592 #, java-format msgid "Are you sure you want to delete \"{0}\"?" -msgstr "Apakah anda yakin ingin menghapus \"{0}\"?" +msgstr "Apakah anda yakin ingin menghapus \"{0}\"?" #: Sketch.java:595 EditorHeader.java:314 msgid "Delete" -msgstr "Hapus" +msgstr "Hapus" #: Sketch.java:620 msgid "Couldn't do it" -msgstr "Tidak dapat melakukannya" +msgstr "Tidak dapat melakukannya" #: Sketch.java:621 #, java-format msgid "Could not delete \"{0}\"." -msgstr "Tidak dapat menghapus \"{0}\"." +msgstr "Tidak dapat menghapus \"{0}\"." #: Sketch.java:651 msgid "removeCode: internal error.. could not find code" -msgstr "removeCode: kesalahan internal.. tidak dapat menemukan kode" +msgstr "removeCode: kesalahan internal.. tidak dapat menemukan kode" #: Sketch.java:724 msgid "Sketch is read-only" -msgstr "Sketsa hanya-baca" +msgstr "Sketsa hanya-baca" #: Sketch.java:725 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save this sketch to another location." -msgstr "" -"Beberapa berkas ditandai \"hanya-baca\", jadi anda harus\n" -"kembali menyimpan sketsa ini di lokasi lain." +msgstr "" +"Beberapa berkas ditandai \"hanya-baca\", jadi anda harus\n" +"kembali menyimpan sketsa ini di lokasi lain." #: Sketch.java:743 msgid "" @@ -803,115 +803,115 @@ msgstr "" #: Sketch.java:750 msgid ".pde -> .ino" -msgstr ".pde -> .ino" +msgstr ".pde -> .ino" #: Sketch.java:829 msgid "Save sketch folder as..." -msgstr "Simpan map sketsa sebagai..." +msgstr "Simpan map sketsa sebagai..." #: Sketch.java:865 msgid "" "You can't save the sketch as \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" -"Anda tidak dapat menyimpan sketsa sebagai \"{0}\"\n" -"karena sketsa telah memiliki sebuah berkas .cpp dengan nama tersebut." +msgstr "" +"Anda tidak dapat menyimpan sketsa sebagai \"{0}\"\n" +"karena sketsa telah memiliki sebuah berkas .cpp dengan nama tersebut." #: Sketch.java:886 msgid "How very Borges of you" -msgstr "Anda Borges sekali" +msgstr "Anda Borges sekali" #: Sketch.java:887 msgid "" "You cannot save the sketch into a folder\n" "inside itself. This would go on forever." -msgstr "" -"Anda tidak dapat menyimpan sketsa kedalam sebuah map\n" -"di dalam dirinya sendiri. Ini akan memakan waktu selamanya." +msgstr "" +"Anda tidak dapat menyimpan sketsa kedalam sebuah map\n" +"di dalam dirinya sendiri. Ini akan memakan waktu selamanya." #: Sketch.java:979 msgid "Select an image or other data file to copy to your sketch" -msgstr "Pilih sebuah gambar atau berkas data lain untuk disalin ke sketsa anda" +msgstr "Pilih sebuah gambar atau berkas data lain untuk disalin ke sketsa anda" #: Sketch.java:1047 #, java-format msgid "Replace the existing version of {0}?" -msgstr "Ganti versi {0} yang ada?" +msgstr "Ganti versi {0} yang ada?" #: Sketch.java:1069 Sketch.java:1092 msgid "Error adding file" -msgstr "Kesalahan dalam menambahkan file" +msgstr "Kesalahan dalam menambahkan file" #: Sketch.java:1070 #, java-format msgid "Could not delete the existing ''{0}'' file." -msgstr "Tidak dapat menghapus berkas ''{0}'' yang ada." +msgstr "Tidak dapat menghapus berkas ''{0}'' yang ada." #: Sketch.java:1078 msgid "You can't fool me" -msgstr "Anda tidak dapat membodohi saya" +msgstr "Anda tidak dapat membodohi saya" #: Sketch.java:1079 msgid "" "This file has already been copied to the\n" "location from which where you're trying to add it.\n" "I ain't not doin nuthin'." -msgstr "" -"Berkas ini telah disalin ke\n" -"lokasi darimana anda mencoba untuk menambahkannya.\n" -"Saya bukan tidak melakukan apa-apa." +msgstr "" +"Berkas ini telah disalin ke\n" +"lokasi darimana anda mencoba untuk menambahkannya.\n" +"Saya bukan tidak melakukan apa-apa." #: Sketch.java:1093 #, java-format msgid "Could not add ''{0}'' to the sketch." -msgstr "Tidak dapat menambahkan ''{0}'' ke sketsa." +msgstr "Tidak dapat menambahkan ''{0}'' ke sketsa." #: Sketch.java:1393 Sketch.java:1424 msgid "Build folder disappeared or could not be written" -msgstr "Map Bangun hilang atau tidak dapat ditulis" +msgstr "Map Bangun hilang atau tidak dapat ditulis" #: Sketch.java:1408 msgid "Could not find main class" -msgstr "Tidak dapat menemukan kelas utama" +msgstr "Tidak dapat menemukan kelas utama" #: Sketch.java:1433 #, java-format msgid "Uncaught exception type: {0}" -msgstr "Jenis pengecualian: {0} tidak tertangkap" +msgstr "Jenis pengecualian: {0} tidak tertangkap" #: Sketch.java:1465 #, java-format msgid "Problem moving {0} to the build folder" -msgstr "Masalah dalam memindahkan {0} ke map bangun" +msgstr "Masalah dalam memindahkan {0} ke map bangun" #: Sketch.java:1661 msgid "Uploading..." -msgstr "Mengunggah..." +msgstr "Mengunggah..." #: Sketch.java:1684 #, java-format msgid "Binary sketch size: {0} bytes (of a {1} byte maximum)" -msgstr "Ukuran biner sketsa: {0} bytes (dari maksimum {1} byte)" +msgstr "Ukuran biner sketsa: {0} bytes (dari maksimum {1} byte)" #: Sketch.java:1689 msgid "Couldn't determine program size: {0}" -msgstr "Tidak dapat menentukan ukuran program: {0}" +msgstr "Tidak dapat menentukan ukuran program: {0}" #: Sketch.java:1694 msgid "" "Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for " "tips on reducing it." -msgstr "" -"Sketsa terlalu besar; lihat http://www.arduino.cc/en/Guide/Troubleshooting#size untuk " -"saran tentang menguranginya." +msgstr "" +"Sketsa terlalu besar; lihat http://www.arduino.cc/en/Guide/Troubleshooting#size untuk " +"saran tentang menguranginya." #: Sketch.java:1754 msgid "Missing the */ from the end of a /* comment */" -msgstr "Membutuhkan */ di akhir sebuah /* komentar */" +msgstr "Membutuhkan */ di akhir sebuah /* komentar */" #: Sketch.java:1796 msgid "Sketch Disappeared" -msgstr "Sketsa Hilang" +msgstr "Sketsa Hilang" #: Sketch.java:1797 msgid "" @@ -922,15 +922,15 @@ msgstr "" #: Sketch.java:1810 msgid "Could not re-save sketch" -msgstr "Tidak dapat kembali menyimpan sketsa" +msgstr "Tidak dapat kembali menyimpan sketsa" #: Sketch.java:1811 msgid "" "Could not properly re-save the sketch. You may be in trouble at this point,\n" "and it might be time to copy and paste your code to another text editor." -msgstr "" -"Tidak dapat kembali menyimpan sketsa dengan benar. Anda mungkin berada dalam kesulitan pada saat ini,\n" -"dan mungkin sudah saatnya untuk menyalin dan menyisipkan kode anda ke editor teks lain." +msgstr "" +"Tidak dapat kembali menyimpan sketsa dengan benar. Anda mungkin berada dalam kesulitan pada saat ini,\n" +"dan mungkin sudah saatnya untuk menyalin dan menyisipkan kode anda ke editor teks lain." #: Sketch.java:2060 msgid "" @@ -941,19 +941,19 @@ msgstr "" #: debug/Uploader.java:52 msgid "https://developer.berlios.de/bugs/?group_id=3590" -msgstr "https://developer.berlios.de/bugs/?group_id=3590" +msgstr "https://developer.berlios.de/bugs/?group_id=3590" #: debug/Uploader.java:54 debug/Compiler.java:43 #, java-format msgid "Compiler error, please submit this code to {0}" -msgstr "Kesalahan kompilator, harap kirim kode ini ke {0}" +msgstr "Kesalahan kompilator, harap kirim kode ini ke {0}" #: debug/Uploader.java:199 #, java-format msgid "" "the selected serial port {0} does not exist or your board is not connected" -msgstr "" -"serial port yang dipilih {0} tidak ada atau papan anda tidak terhubung" +msgstr "" +"serial port yang dipilih {0} tidak ada atau papan anda tidak terhubung" #: debug/Uploader.java:203 msgid "" @@ -975,24 +975,24 @@ msgstr "" #: debug/Compiler.java:41 msgid "http://code.google.com/p/arduino/issues/list" -msgstr "http://code.google.com/p/arduino/issues/list" +msgstr "http://code.google.com/p/arduino/issues/list" #: debug/Compiler.java:79 msgid "No board selected; please choose a board from the Tools > Board menu." -msgstr "Tidak ada papan yang dipilih; harap pilih sebuah papan dari menu Peralatan > Papan." +msgstr "Tidak ada papan yang dipilih; harap pilih sebuah papan dari menu Peralatan > Papan." #: debug/Compiler.java:422 #, java-format msgid "{0} returned {1}" -msgstr "{0} kembali {1}" +msgstr "{0} kembali {1}" #: debug/Compiler.java:426 msgid "Error compiling." -msgstr "Kesalahan dalam menyusun." +msgstr "Kesalahan dalam menyusun." #: debug/Compiler.java:465 msgid "Please import the SPI library from the Sketch > Import Library menu." -msgstr "Harap impor perpustakaan SPI dari menu Sketsa > Impor Perpustakaan." +msgstr "Harap impor perpustakaan SPI dari menu Sketsa > Impor Perpustakaan." #: debug/Compiler.java:466 msgid "" @@ -1001,16 +1001,16 @@ msgid "" "You appear to be using it or another library that depends on the SPI " "library.\n" "\n" -msgstr "" -"\n" -"Pada Arduino 0019, perpustakaan Ethernet tergantung pada perpustakaan SPI.\n" -"Tampaknya anda menggunakannya atau perpustakaan lain yang tergantung pada perpustakaan " -"SPI.\n" -"\n" +msgstr "" +"\n" +"Pada Arduino 0019, perpustakaan Ethernet tergantung pada perpustakaan SPI.\n" +"Tampaknya anda menggunakannya atau perpustakaan lain yang tergantung pada perpustakaan " +"SPI.\n" +"\n" #: debug/Compiler.java:471 msgid "The 'BYTE' keyword is no longer supported." -msgstr "Kata kunci 'BYTE' tidak lagi didukung." +msgstr "Kata kunci 'BYTE' tidak lagi didukung." #: debug/Compiler.java:472 msgid "" @@ -1018,15 +1018,15 @@ msgid "" "As of Arduino 1.0, the 'BYTE' keyword is no longer supported.\n" "Please use Serial.write() instead.\n" "\n" -msgstr "" -"\n" -"Pada Arduino 1.0, kata kunci 'BYTE' tidak lagi didukung.\n" -"Harap gunakan Serial.write() sebagai gantinya.\n" -"\n" +msgstr "" +"\n" +"Pada Arduino 1.0, kata kunci 'BYTE' tidak lagi didukung.\n" +"Harap gunakan Serial.write() sebagai gantinya.\n" +"\n" #: debug/Compiler.java:477 msgid "The Server class has been renamed EthernetServer." -msgstr "Kelas Server telah diubah namanya menjadi EthernetServer." +msgstr "Kelas Server telah diubah namanya menjadi EthernetServer." #: debug/Compiler.java:478 msgid "" @@ -1034,15 +1034,15 @@ msgid "" "As of Arduino 1.0, the Server class in the Ethernet library has been renamed " "to EthernetServer.\n" "\n" -msgstr "" -"\n" -"Pada Arduino 1.0, kelas Server dalam perpustakaan Ethernet telah diubah namanya " -"menjadi EthernetServer.\n" -"\n" +msgstr "" +"\n" +"Pada Arduino 1.0, kelas Server dalam perpustakaan Ethernet telah diubah namanya " +"menjadi EthernetServer.\n" +"\n" #: debug/Compiler.java:483 msgid "The Client class has been renamed EthernetClient." -msgstr "Kelas Client telah diubah namanya menjadi EthernetClient." +msgstr "Kelas Client telah diubah namanya menjadi EthernetClient." #: debug/Compiler.java:484 msgid "" @@ -1050,15 +1050,15 @@ msgid "" "As of Arduino 1.0, the Client class in the Ethernet library has been renamed " "to EthernetClient.\n" "\n" -msgstr "" -"\n" -"Pada Arduino 1.0, kelas Client dalam perpustakaan Ethernet telah diubah namanya " -"menjadi EthernetClient.\n" -"\n" +msgstr "" +"\n" +"Pada Arduino 1.0, kelas Client dalam perpustakaan Ethernet telah diubah namanya " +"menjadi EthernetClient.\n" +"\n" #: debug/Compiler.java:489 msgid "The Udp class has been renamed EthernetUdp." -msgstr "Kelas Udp telah diubah namanya menjadi EthernetUdp." +msgstr "Kelas Udp telah diubah namanya menjadi EthernetUdp." #: debug/Compiler.java:490 msgid "" @@ -1066,15 +1066,15 @@ msgid "" "As of Arduino 1.0, the Udp class in the Ethernet library has been renamed to " "EthernetClient.\n" "\n" -msgstr "" -"\n" -"Pada Arduino 1.0, kelas Udp dalam perpustakaan Ethernet telah diubah namanya menjadi " -"EthernetClient.\n" -"\n" +msgstr "" +"\n" +"Pada Arduino 1.0, kelas Udp dalam perpustakaan Ethernet telah diubah namanya menjadi " +"EthernetClient.\n" +"\n" #: debug/Compiler.java:495 msgid "Wire.send() has been renamed Wire.write()." -msgstr "Wire.send() telah diubah namanya menjadi Wire.write()." +msgstr "Wire.send() telah diubah namanya menjadi Wire.write()." #: debug/Compiler.java:496 msgid "" @@ -1082,15 +1082,15 @@ msgid "" "As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for " "consistency with other libraries.\n" "\n" -msgstr "" -"\n" -"Pada Arduino 1.0, fungsi Wire.send() telah diubah namanya menjadi Wire.write() demi " -"konsistensi dengan perpustakaan lain.\n" -"\n" +msgstr "" +"\n" +"Pada Arduino 1.0, fungsi Wire.send() telah diubah namanya menjadi Wire.write() demi " +"konsistensi dengan perpustakaan lain.\n" +"\n" #: debug/Compiler.java:501 msgid "Wire.receive() has been renamed Wire.read()." -msgstr "Wire.receive() telah diubah namanya menjadi Wire.read()." +msgstr "Wire.receive() telah diubah namanya menjadi Wire.read()." #: debug/Compiler.java:502 msgid "" @@ -1098,60 +1098,60 @@ msgid "" "As of Arduino 1.0, the Wire.receive() function was renamed to Wire.read() " "for consistency with other libraries.\n" "\n" -msgstr "" -"\n" -"Pada Arduino 1.0, fungsi Wire.receive() telah diubah namanya menjadi Wire.read() " -"demi konsistensi dengan perpustakaan lain.\n" -"\n" +msgstr "" +"\n" +"Pada Arduino 1.0, fungsi Wire.receive() telah diubah namanya menjadi Wire.read() " +"demi konsistensi dengan perpustakaan lain.\n" +"\n" #: EditorConsole.java:152 msgid "Console Error" -msgstr "Kesalahan Konsol" +msgstr "Kesalahan Konsol" #: EditorConsole.java:153 msgid "" "A problem occurred while trying to open the\n" "files used to store the console output." -msgstr "" -"Sebuah masalah muncul ketika mencoba membuka\n" -"berkas yang digunakan untuk menyimpan keluaran konsol." +msgstr "" +"Sebuah masalah muncul ketika mencoba membuka\n" +"berkas yang digunakan untuk menyimpan keluaran konsol." #: Base.java:184 msgid "Non-fatal error while setting the Look & Feel." -msgstr "Kesalahan tidak fatal ketika mengatur penampilan." +msgstr "Kesalahan tidak fatal ketika mengatur penampilan." #: Base.java:185 msgid "The error message follows, however Arduino should run fine." -msgstr "Pesan kesalahan akan muncul, bagaimanapun Arduino akan berjalan dengan baik." +msgstr "Pesan kesalahan akan muncul, bagaimanapun Arduino akan berjalan dengan baik." #: Base.java:220 msgid "Problem Setting the Platform" -msgstr "Masalah Dalam Mengatur Platform" +msgstr "Masalah Dalam Mengatur Platform" #: Base.java:221 msgid "" "An unknown error occurred while trying to load\n" "platform-specific code for your machine." -msgstr "Kesalahan tak dikenal muncul ketika mencoba memuat \n" -"kode spesifik platform untuk mesin anda." +msgstr "Kesalahan tak dikenal muncul ketika mencoba memuat \n" +"kode spesifik platform untuk mesin anda." #: Base.java:232 msgid "Please install JDK 1.5 or later" -msgstr "Harap pasang JDK 1.5 atau yang lebih baru" +msgstr "Harap pasang JDK 1.5 atau yang lebih baru" #: Base.java:233 msgid "" "Arduino requires a full JDK (not just a JRE)\n" "to run. Please install JDK 1.5 or later.\n" "More information can be found in the reference." -msgstr "" -"Arduino membutuhkan JDK lengkap (tidak hanya JRE)\n" -"untuk dapat berjalan. Harap pasang JDK 1.5 atau yang lebih baru.\n" -"Informasi lebih lanjut dapat ditemukan di referensi." +msgstr "" +"Arduino membutuhkan JDK lengkap (tidak hanya JRE)\n" +"untuk dapat berjalan. Harap pasang JDK 1.5 atau yang lebih baru.\n" +"Informasi lebih lanjut dapat ditemukan di referensi." #: Base.java:257 msgid "Sketchbook folder disappeared" -msgstr "Map Buku Sketsa hilang" +msgstr "Map Buku Sketsa hilang" #: Base.java:258 msgid "" @@ -1160,64 +1160,64 @@ msgid "" "location, and create a new sketchbook folder if\n" "necessary. Arduino will then stop talking about\n" "himself in the third person." -msgstr "" -"Map sketsa tidak lagi ada.\n" -"Arduino akan beralih ke lokasi buku sketsa\n" -"standar, dan membuat sebuah map buku sketsa baru jika\n" -"diperlukan. Arduino kemudian akan berhenti berbicara tentang\n" -"dirinya sendiri dari sudut orang ketiga." +msgstr "" +"Map sketsa tidak lagi ada.\n" +"Arduino akan beralih ke lokasi buku sketsa\n" +"standar, dan membuat sebuah map buku sketsa baru jika\n" +"diperlukan. Arduino kemudian akan berhenti berbicara tentang\n" +"dirinya sendiri dari sudut orang ketiga." #: Base.java:532 msgid "Time for a Break" -msgstr "Waktu untuk Istirahat" +msgstr "Waktu untuk Istirahat" #: Base.java:533 msgid "" "You've reached the limit for auto naming of new sketches\n" "for the day. How about going for a walk instead?" -msgstr "" -"Anda telah mencapai batas pemberian nama otomatis sketsa baru\n" -"untuk hari ini. Bagaimana jika anda pergi jalan-jalan sebagai gantinya?" +msgstr "" +"Anda telah mencapai batas pemberian nama otomatis sketsa baru\n" +"untuk hari ini. Bagaimana jika anda pergi jalan-jalan sebagai gantinya?" #: Base.java:537 msgid "Sunshine" -msgstr "Cuaca cerah" +msgstr "Cuaca cerah" #: Base.java:538 msgid "No really, time for some fresh air for you." -msgstr "Sungguh, sekarang waktunya anda menghirup udara segar." +msgstr "Sungguh, sekarang waktunya anda menghirup udara segar." #: Base.java:633 msgid "Open an Arduino sketch..." -msgstr "Buka sebuah sketsa Arduino..." +msgstr "Buka sebuah sketsa Arduino..." #: Base.java:772 msgid "" " Are you " "sure you want to Quit?

Closing the last open sketch will quit Arduino." -msgstr "" -" Apakah anda \n" -"yakin ingin berhenti?

Menutup sketsa aktif yang terakhir akan menghentikan Arduino." +msgstr "" +" Apakah anda \n" +"yakin ingin berhenti?

Menutup sketsa aktif yang terakhir akan menghentikan Arduino." #: Base.java:970 msgid "Contributed" -msgstr "Dikontribusikan" +msgstr "Dikontribusikan" #: Base.java:1095 msgid "Sketch Does Not Exist" -msgstr "Sketsa Tidak Ada" +msgstr "Sketsa Tidak Ada" #: Base.java:1096 msgid "" "The selected sketch no longer exists.\n" "You may need to restart Arduino to update\n" "the sketchbook menu." -msgstr "" -"Sketsa yang dipilih tidak lagi ada.\n" -"Anda mungkin perlu memulai ulang Arduino untuk memperbaharui\n" -"menu buku sketsa." +msgstr "" +"Sketsa yang dipilih tidak lagi ada.\n" +"Anda mungkin perlu memulai ulang Arduino untuk memperbaharui\n" +"menu buku sketsa." #: Base.java:1125 #, java-format @@ -1227,16 +1227,16 @@ msgid "" "(ASCII-only with no spaces, and it cannot start with a number).\n" "To get rid of this message, remove the sketch from\n" "{1}" -msgstr "" -"Sketsa \"{0}\" tidak dapat digunakan.\n" -"Nama sketsa hanya dapat terdiri dari huruf dan angka dasar\n" -"(hanya ASCII tanpa spasi, dan tidak dapat diawali dengan sebuah angka).\n" -"Untuk menghilangkan pesan ini, hapus sketsa dari\n" -"{1}" +msgstr "" +"Sketsa \"{0}\" tidak dapat digunakan.\n" +"Nama sketsa hanya dapat terdiri dari huruf dan angka dasar\n" +"(hanya ASCII tanpa spasi, dan tidak dapat diawali dengan sebuah angka).\n" +"Untuk menghilangkan pesan ini, hapus sketsa dari\n" +"{1}" #: Base.java:1132 msgid "Ignoring sketch with bad name" -msgstr "Mengabaikan sketsa dengan nama buruk" +msgstr "Mengabaikan sketsa dengan nama buruk" #: Base.java:1202 #, java-format @@ -1244,193 +1244,193 @@ msgid "" "The library \"{0}\" cannot be used.\n" "Library names must contain only basic letters and numbers.\n" "(ASCII only and no spaces, and it cannot start with a number)" -msgstr "" -"Perpustakaan \"{0}\" tidak dapat digunakan.\n" -"Nama perpustakaan hanya dapat terdiri dari huruf dan angka dasar.\n" -"(hanya ASCII dan tanpa spasi, dan tidak dapat diawali dengan sebuah angka).\n" +msgstr "" +"Perpustakaan \"{0}\" tidak dapat digunakan.\n" +"Nama perpustakaan hanya dapat terdiri dari huruf dan angka dasar.\n" +"(hanya ASCII dan tanpa spasi, dan tidak dapat diawali dengan sebuah angka).\n" #: Base.java:1207 msgid "Ignoring bad library name" -msgstr "Mengabaikan nama perpustakaan buruk" +msgstr "Mengabaikan nama perpustakaan buruk" #: Base.java:1432 msgid "Problem getting data folder" -msgstr "Masalah dalam mendapatkan map data" +msgstr "Masalah dalam mendapatkan map data" #: Base.java:1433 msgid "Error getting the Arduino data folder." -msgstr "Kesalahan dalam mendapatkan map data Arduino." +msgstr "Kesalahan dalam mendapatkan map data Arduino." #: Base.java:1440 msgid "Settings issues" -msgstr "Masalah pengaturan" +msgstr "Masalah pengaturan" #: Base.java:1441 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your settings." -msgstr "" -"Arduino tidak dapat berfungsi karena tidak bisa\n" -"membuat sebuah map untuk menyimpan pengaturan anda." +msgstr "" +"Arduino tidak dapat berfungsi karena tidak bisa\n" +"membuat sebuah map untuk menyimpan pengaturan anda." #: Base.java:1602 msgid "You forgot your sketchbook" -msgstr "Anda melupakan buku sketsa anda" +msgstr "Anda melupakan buku sketsa anda" #: Base.java:1603 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your sketchbook." -msgstr "" -"Arduino tidak dapat berjalan karena tidak bisa\n" -"membuat sebuah map untuk menyimpan buku sketsa anda." +msgstr "" +"Arduino tidak dapat berjalan karena tidak bisa\n" +"membuat sebuah map untuk menyimpan buku sketsa anda." #: Base.java:1623 msgid "Select (or create new) folder for sketches..." -msgstr "Pilih (atau buat baru) map untuk sketsa..." +msgstr "Pilih (atau buat baru) map untuk sketsa..." #: Base.java:1647 msgid "Problem Opening URL" -msgstr "Masalah Dalam Membuka URL" +msgstr "Masalah Dalam Membuka URL" #: Base.java:1648 #, java-format msgid "" "Could not open the URL\n" "{0}" -msgstr "" -"Tidak dapat membuka URL\n" -"{0}" +msgstr "" +"Tidak dapat membuka URL\n" +"{0}" #: Base.java:1671 msgid "Problem Opening Folder" -msgstr "Masalah Dalam Membuka Map" +msgstr "Masalah Dalam Membuka Map" #: Base.java:1672 #, java-format msgid "" "Could not open the folder\n" "{0}" -msgstr "" -"Tidak dapat membuka map\n" -"{0}" +msgstr "" +"Tidak dapat membuka map\n" +"{0}" #: Base.java:1785 msgid "Guide_MacOSX.html" -msgstr "Guide_MacOSX.html" +msgstr "Guide_MacOSX.html" #: Base.java:1787 msgid "Guide_Windows.html" -msgstr "Guide_Windows.html" +msgstr "Guide_Windows.html" #: Base.java:1789 msgid "http://www.arduino.cc/playground/Learning/Linux" -msgstr "http://www.arduino.cc/playground/Learning/Linux" +msgstr "http://www.arduino.cc/playground/Learning/Linux" #: Base.java:1794 msgid "index.html" -msgstr "index.html" +msgstr "index.html" #: Base.java:1799 msgid "Guide_Environment.html" -msgstr "Guide_Environment.html" +msgstr "Guide_Environment.html" #: Base.java:1804 msgid "environment" -msgstr "lingkungan" +msgstr "lingkungan" #: Base.java:1804 msgid "platforms.html" -msgstr "platforms.html" +msgstr "platforms.html" #: Base.java:1809 msgid "Guide_Troubleshooting.html" -msgstr "Guide_Troubleshooting.html" +msgstr "Guide_Troubleshooting.html" #: Base.java:1814 msgid "FAQ.html" -msgstr "FAQ.html" +msgstr "FAQ.html" #: Base.java:1826 msgid "Message" -msgstr "Pesan" +msgstr "Pesan" #: Base.java:1842 msgid "Warning" -msgstr "Peringatan" +msgstr "Peringatan" #: Base.java:2196 #, java-format msgid "Could not remove old version of {0}" -msgstr "Tidak dapat menghilangkan versi lama {0}" +msgstr "Tidak dapat menghilangkan versi lama {0}" #: Base.java:2206 #, java-format msgid "Could not replace {0}" -msgstr "Tidak dapat menggantikan {0}" +msgstr "Tidak dapat menggantikan {0}" #: Base.java:2247 Base.java:2270 #, java-format msgid "Could not delete {0}" -msgstr "Tidak dapat menghapus {0}" +msgstr "Tidak dapat menghapus {0}" #: EditorHeader.java:292 msgid "New Tab" -msgstr "Label Baru" +msgstr "Label Baru" #: EditorHeader.java:300 msgid "Rename" -msgstr "Ubah Nama" +msgstr "Ubah Nama" #: EditorHeader.java:326 msgid "Previous Tab" -msgstr "Label Sebelumnya" +msgstr "Label Sebelumnya" #: EditorHeader.java:340 msgid "Next Tab" -msgstr "Label Berikutnya" +msgstr "Label Berikutnya" #: EditorToolbar.java:41 EditorToolbar.java:46 msgid "Verify" -msgstr "Periksa" +msgstr "Periksa" #: EditorToolbar.java:41 msgid "Open" -msgstr "Buka" +msgstr "Buka" #: EditorToolbar.java:46 msgid "New Editor Window" -msgstr "Jendela Editor Baru" +msgstr "Jendela Editor Baru" #: EditorToolbar.java:46 msgid "Open in Another Window" -msgstr "Buka di Jendela Lain" +msgstr "Buka di Jendela Lain" #: Platform.java:167 msgid "No launcher available" -msgstr "Tidak ada peluncur yang tersedia" +msgstr "Tidak ada peluncur yang tersedia" #: Platform.java:168 msgid "" "Unspecified platform, no launcher available.\n" "To enable opening URLs or folders, add a \n" "\"launcher=/path/to/app\" line to preferences.txt" -msgstr "" -"Platform tanpa spesifikasi, tidak ada peluncur yang tersedia.\n" -"Untuk mengaktifkan pembukaan URL atau map, tambahkan sebuah baris \n" -"\"launcher=/path/to/app\" ke preferences.txt" +msgstr "" +"Platform tanpa spesifikasi, tidak ada peluncur yang tersedia.\n" +"Untuk mengaktifkan pembukaan URL atau map, tambahkan sebuah baris \n" +"\"launcher=/path/to/app\" ke preferences.txt" #: Theme.java:52 msgid "" "Could not read color theme settings.\n" "You'll need to reinstall Processing." -msgstr "" -"Tidak dapat membaca pengaturan tema warna." -"Anda harus memasang ulang Processing." +msgstr "" +"Tidak dapat membaca pengaturan tema warna." +"Anda harus memasang ulang Processing." #: Preferences.java:80 msgid "Browse" -msgstr "Navigasi" +msgstr "Navigasi" #: Preferences.java:83 msgid "System Default" @@ -1446,11 +1446,11 @@ msgstr "" #: Preferences.java:86 msgid "Catalan" -msgstr "Bahasa Katalan" +msgstr "Bahasa Katalan" #: Preferences.java:87 msgid "Chinese Simplified" -msgstr "Bahasa Cina Sederhana" +msgstr "Bahasa Cina Sederhana" #: Preferences.java:88 msgid "Chinese Traditional" @@ -1458,15 +1458,15 @@ msgstr "" #: Preferences.java:89 msgid "Danish" -msgstr "Bahasa Denmark" +msgstr "Bahasa Denmark" #: Preferences.java:90 msgid "Dutch" -msgstr "Bahasa Belanda" +msgstr "Bahasa Belanda" #: Preferences.java:91 msgid "English" -msgstr "Bahasa Inggris" +msgstr "Bahasa Inggris" #: Preferences.java:92 msgid "Estonian" @@ -1474,27 +1474,27 @@ msgstr "" #: Preferences.java:93 msgid "French" -msgstr "Bahasa Perancis" +msgstr "Bahasa Perancis" #: Preferences.java:94 msgid "Filipino" -msgstr "Bahasa Filipina" +msgstr "Bahasa Filipina" #: Preferences.java:95 msgid "Galician" -msgstr "Bahasa Galisia" +msgstr "Bahasa Galisia" #: Preferences.java:96 msgid "German" -msgstr "Bahasa Jerman" +msgstr "Bahasa Jerman" #: Preferences.java:97 msgid "Greek" -msgstr "Bahasa Yunani" +msgstr "Bahasa Yunani" #: Preferences.java:98 msgid "Hungarian" -msgstr "Bahasa Hungaria" +msgstr "Bahasa Hungaria" #: Preferences.java:99 msgid "Indonesian" @@ -1502,11 +1502,11 @@ msgstr "" #: Preferences.java:100 msgid "Italian" -msgstr "Bahasa Italia" +msgstr "Bahasa Italia" #: Preferences.java:101 msgid "Japanese" -msgstr "Bahasa Jepang" +msgstr "Bahasa Jepang" #: Preferences.java:102 msgid "Korean" @@ -1514,7 +1514,7 @@ msgstr "" #: Preferences.java:103 msgid "Latvian" -msgstr "Bahasa Latvia" +msgstr "Bahasa Latvia" #: Preferences.java:104 msgid "Lithuaninan" @@ -1522,7 +1522,7 @@ msgstr "" #: Preferences.java:105 msgid "Persian" -msgstr "Bahasa Persia" +msgstr "Bahasa Persia" #: Preferences.java:106 msgid "Polish" @@ -1534,7 +1534,7 @@ msgstr "" #: Preferences.java:109 msgid "Romanian" -msgstr "Bahasa Rumania" +msgstr "Bahasa Rumania" #: Preferences.java:110 msgid "Russian" @@ -1542,41 +1542,41 @@ msgstr "" #: Preferences.java:111 msgid "Spanish" -msgstr "Bahasa Spanyol" +msgstr "Bahasa Spanyol" #: Preferences.java:210 msgid "" "Could not read default settings.\n" "You'll need to reinstall Arduino." -msgstr "" -"Tidak dapat membaca pengaturan standar.\n" -"Anda harus memasang ulang Arduino." +msgstr "" +"Tidak dapat membaca pengaturan standar.\n" +"Anda harus memasang ulang Arduino." #: Preferences.java:242 #, java-format msgid "Could not read preferences from {0}" -msgstr "Tidak dapat membaca preferensi dari {0}" +msgstr "Tidak dapat membaca preferensi dari {0}" #: Preferences.java:261 msgid "Error reading preferences" -msgstr "Kesalahan dalam membaca preferensi" +msgstr "Kesalahan dalam membaca preferensi" #: Preferences.java:263 #, java-format msgid "" "Error reading the preferences file. Please delete (or move)\n" "{0} and restart Arduino." -msgstr "" -"Kesalahan dalam membaca berkas preferensi. Harap hapus (atau pindahkan)\n" -"{0} dan mulai ulang Arduino." +msgstr "" +"Kesalahan dalam membaca berkas preferensi. Harap hapus (atau pindahkan)\n" +"{0} dan mulai ulang Arduino." #: Preferences.java:299 msgid "Sketchbook location:" -msgstr "Lokasi buku sketsa:" +msgstr "Lokasi buku sketsa:" #: Preferences.java:314 msgid "Select new sketchbook location" -msgstr "Pilih lokasi buku sketsa baru" +msgstr "Pilih lokasi buku sketsa baru" #: Preferences.java:337 msgid "Editor language: " @@ -1588,49 +1588,49 @@ msgstr "" #: Preferences.java:354 msgid "Editor font size: " -msgstr "Editor ukuran huruf: " +msgstr "Editor ukuran huruf: " #: Preferences.java:371 msgid "Show verbose output during: " -msgstr "Tampilkan keluaran yang berlebihan ketika: " +msgstr "Tampilkan keluaran yang berlebihan ketika: " #: Preferences.java:373 msgid "compilation " -msgstr "susunan " +msgstr "susunan " #: Preferences.java:375 msgid "upload" -msgstr "unggah" +msgstr "unggah" #: Preferences.java:384 msgid "Verify code after upload" -msgstr "Periksa kode setelah unggah" +msgstr "Periksa kode setelah unggah" #: Preferences.java:393 msgid "Use external editor" -msgstr "Gunakan editor eksternal" +msgstr "Gunakan editor eksternal" #: Preferences.java:403 msgid "Check for updates on startup" -msgstr "Periksa pembaruan ketika program dimulai" +msgstr "Periksa pembaruan ketika program dimulai" #: Preferences.java:412 msgid "Update sketch files to new extension on save (.pde -> .ino)" -msgstr "Perbaharui berkas sketsa ke ekstensi baru ketika menyimpan (.pde -> .ino)" +msgstr "Perbaharui berkas sketsa ke ekstensi baru ketika menyimpan (.pde -> .ino)" #: Preferences.java:423 msgid "Automatically associate .ino files with Arduino" -msgstr "Asosiasikan otomatis berkas .ino dengan Arduino" +msgstr "Asosiasikan otomatis berkas .ino dengan Arduino" #: Preferences.java:433 msgid "More preferences can be edited directly in the file" -msgstr "Preferensi lebih lanjut dapat diedit langsung pada berkas" +msgstr "Preferensi lebih lanjut dapat diedit langsung pada berkas" #: Preferences.java:462 msgid "(edit only when Arduino is not running)" -msgstr "(mengedit hanya ketika Arduino sedang tidak berjalan)" +msgstr "(mengedit hanya ketika Arduino sedang tidak berjalan)" #: Preferences.java:609 #, java-format msgid "ignoring invalid font size {0}" -msgstr "mengabaikan ukuran huruf tidak sah {0}" +msgstr "mengabaikan ukuran huruf tidak sah {0}" diff --git a/app/src/processing/app/i18n/Resources_id.properties b/app/src/processing/app/i18n/Resources_id.properties index b3fb63e3c2d..8114781e8b8 100644 --- a/app/src/processing/app/i18n/Resources_id.properties +++ b/app/src/processing/app/i18n/Resources_id.properties @@ -1,8 +1,8 @@ -# Indonesian translations for the Arduino IDE. -# Copyright (C) 2012 -# This file is distributed under the same license as the Arduino IDE package. -# Rininta Andari , 2012. -# +# Indonesian translations for the Arduino IDE. +# Copyright (C) 2012 +# This file is distributed under the same license as the Arduino IDE package. +# Rininta Andari , 2012. +# !=Project-Id-Version\: PACKAGE VERSION\nReport-Msgid-Bugs-To\: \nPOT-Creation-Date\: 2012-04-02 18\:10+0100\nPO-Revision-Date\: 2012-04-15 23\:20+0100\nLast-Translator\: Rininta Andari \nLanguage-Team\: Indonesian\nLanguage\: id\nMIME-Version\: 1.0\nContent-Type\: text/plain; charset\=UTF-8\nContent-Transfer-Encoding\: 8bit\nPlural-Forms\: nplurals\=2; plural\=(n \!\= 1);\n #: Editor.java:366 diff --git a/app/src/processing/app/i18n/Resources_mr.po b/app/src/processing/app/i18n/Resources_mr.po index 05878a9ca5f..c0047286d21 100644 --- a/app/src/processing/app/i18n/Resources_mr.po +++ b/app/src/processing/app/i18n/Resources_mr.po @@ -1,278 +1,278 @@ -# Marathi translations for PACKAGE package. -# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Sarvesh S. Karkhanis <>, 2012. -# +# Marathi translations for PACKAGE package. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Sarvesh S. Karkhanis <>, 2012. +# msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-04-04 10:24-0400\n" -"PO-Revision-Date: 2012-04-04 13:24-0400\n" -"Last-Translator: Sarvesh S. Karkhanis <>\n" -"Language-Team: \n" -"Language: mr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-04-04 10:24-0400\n" +"PO-Revision-Date: 2012-04-04 13:24-0400\n" +"Last-Translator: Sarvesh S. Karkhanis <>\n" +"Language-Team: \n" +"Language: mr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: Editor.java:366 msgid "No files were added to the sketch." -msgstr "स्केच मध्ये फाईल सामील नाही." +msgstr "स्केच मध्ये फाईल सामील नाही." #: Editor.java:369 Sketch.java:996 msgid "One file added to the sketch." -msgstr "स्केच मध्ये एक फाईल सामील केली" +msgstr "स्केच मध्ये एक फाईल सामील केली" #: Editor.java:373 #, java-format msgid "{0} files added to the sketch." -msgstr "फाईल्स स्केच मध्ये सामील केल्या" +msgstr "फाईल्स स्केच मध्ये सामील केल्या" #: Editor.java:484 msgid "File" -msgstr "फाईल" +msgstr "फाईल" #: Editor.java:486 EditorToolbar.java:41 msgid "New" -msgstr "नवीन" +msgstr "नवीन" #: Editor.java:494 Base.java:903 msgid "Open..." -msgstr "उघडा..." +msgstr "उघडा..." #: Editor.java:503 msgid "Sketchbook" -msgstr "स्केच पुस्तिका" +msgstr "स्केच पुस्तिका" #: Editor.java:509 msgid "Examples" -msgstr "उदाहरणे" +msgstr "उदाहरणे" #: Editor.java:514 Editor.java:1977 msgid "Close" -msgstr "पण बंद करा" +msgstr "पण बंद करा" #: Editor.java:522 Editor.java:2017 Editor.java:2421 EditorToolbar.java:41 #: EditorToolbar.java:46 msgid "Save" -msgstr "जतन करा" +msgstr "जतन करा" #: Editor.java:530 msgid "Save As..." -msgstr "जतन करा असे की..." +msgstr "जतन करा असे की..." #: Editor.java:538 EditorToolbar.java:41 msgid "Upload" -msgstr "अपलोड" +msgstr "अपलोड" #: Editor.java:546 EditorToolbar.java:46 msgid "Upload Using Programmer" -msgstr "प्रोग्रॅमरच्या सहाय्याने अपलोड" +msgstr "प्रोग्रॅमरच्या सहाय्याने अपलोड" #: Editor.java:556 msgid "Page Setup" -msgstr "पानाचा नमुना" +msgstr "पानाचा नमुना" #: Editor.java:564 msgid "Print" -msgstr "छापा" +msgstr "छापा" #: Editor.java:576 Preferences.java:279 msgid "Preferences" -msgstr "प्राधान्य" +msgstr "प्राधान्य" #: Editor.java:586 Base.java:782 msgid "Quit" -msgstr "बंद" +msgstr "बंद" #: Editor.java:600 msgid "Sketch" -msgstr "स्केच" +msgstr "स्केच" #: Editor.java:602 msgid "Verify / Compile" -msgstr "पडताळणी / कंपाइल" +msgstr "पडताळणी / कंपाइल" #: Editor.java:629 msgid "Import Library..." -msgstr "लायब्ररीची आयात..." +msgstr "लायब्ररीची आयात..." #: Editor.java:634 msgid "Show Sketch Folder" -msgstr "स्केचचा फोल्डर उघडा" +msgstr "स्केचचा फोल्डर उघडा" #: Editor.java:643 msgid "Add File..." -msgstr "फाईल सामील करा" +msgstr "फाईल सामील करा" #: Editor.java:656 msgid "Tools" -msgstr "साधने" +msgstr "साधने" #: Editor.java:662 EditorToolbar.java:41 EditorToolbar.java:46 msgid "Serial Monitor" -msgstr "सिरीयल नियंत्रक" +msgstr "सिरीयल नियंत्रक" #: Editor.java:682 msgid "Board" -msgstr "बोर्ड" +msgstr "बोर्ड" #: Editor.java:690 msgid "Serial Port" -msgstr "सिरीयल पोर्ट" +msgstr "सिरीयल पोर्ट" #: Editor.java:695 msgid "Programmer" -msgstr "प्रोग्रॅमर" +msgstr "प्रोग्रॅमर" #: Editor.java:699 msgid "Burn Bootloader" -msgstr "बूटलोडर टाका" +msgstr "बूटलोडर टाका" #: Editor.java:923 msgid "serialMenu is null" -msgstr "सिरिअल मेनू रिक्त आहे" +msgstr "सिरिअल मेनू रिक्त आहे" #: Editor.java:927 Editor.java:934 msgid "name is null" -msgstr "नाव रिक्त आहे" +msgstr "नाव रिक्त आहे" #: Editor.java:986 msgid "error retrieving port list" -msgstr "पोर्टची यादी शिधाण्यात दोष" +msgstr "पोर्टची यादी शिधाण्यात दोष" #: Editor.java:1002 msgid "Help" -msgstr "मदत" +msgstr "मदत" #: Editor.java:1041 msgid "Getting Started" -msgstr "सुरुवात करताना" +msgstr "सुरुवात करताना" #: Editor.java:1049 msgid "Environment" -msgstr "परिसर" +msgstr "परिसर" #: Editor.java:1057 msgid "Troubleshooting" -msgstr "अडचणी सोडविणे" +msgstr "अडचणी सोडविणे" #: Editor.java:1065 msgid "Reference" -msgstr "संदर्भ" +msgstr "संदर्भ" #: Editor.java:1073 Editor.java:2728 msgid "Find in Reference" -msgstr "संदर्भ शोध" +msgstr "संदर्भ शोध" #: Editor.java:1083 msgid "Frequently Asked Questions" -msgstr "नेहमी विचारले जाणारे प्रश्न" +msgstr "नेहमी विचारले जाणारे प्रश्न" #: Editor.java:1091 msgid "Visit Arduino.cc" -msgstr "arduino.cc ला भेट द्या" +msgstr "arduino.cc ला भेट द्या" #: Editor.java:1094 msgid "http://arduino.cc/" -msgstr "" +msgstr "" #: Editor.java:1102 msgid "About Arduino" -msgstr "अर्दुईनो संबंधी" +msgstr "अर्दुईनो संबंधी" #: Editor.java:1116 msgid "Edit" -msgstr "संपादन" +msgstr "संपादन" #: Editor.java:1119 Editor.java:1341 msgid "Undo" -msgstr "एक पाउल मागे" +msgstr "एक पाउल मागे" #: Editor.java:1124 Editor.java:1126 Editor.java:1376 msgid "Redo" -msgstr "एक पाउल पुढे" +msgstr "एक पाउल पुढे" #: Editor.java:1135 Editor.java:2652 msgid "Cut" -msgstr "कट" +msgstr "कट" #: Editor.java:1143 Editor.java:2660 msgid "Copy" -msgstr "कॉपी" +msgstr "कॉपी" #: Editor.java:1151 Editor.java:2668 msgid "Copy for Forum" -msgstr "फोरम साठी कॉपी करा" +msgstr "फोरम साठी कॉपी करा" #: Editor.java:1163 Editor.java:2676 msgid "Copy as HTML" -msgstr "HTML कॉपी करा" +msgstr "HTML कॉपी करा" #: Editor.java:1175 Editor.java:2684 msgid "Paste" -msgstr "पेस्ट" +msgstr "पेस्ट" #: Editor.java:1184 Editor.java:2692 msgid "Select All" -msgstr "सर्व निवडा" +msgstr "सर्व निवडा" #: Editor.java:1194 Editor.java:2702 msgid "Comment/Uncomment" -msgstr "टिपणी करा / टिपणी काढा" +msgstr "टिपणी करा / टिपणी काढा" #: Editor.java:1202 Editor.java:2710 msgid "Increase Indent" -msgstr "अंतर वाढवा" +msgstr "अंतर वाढवा" #: Editor.java:1210 Editor.java:2718 msgid "Decrease Indent" -msgstr "अंतर कमी करा" +msgstr "अंतर कमी करा" #: Editor.java:1220 msgid "Find..." -msgstr "शोध" +msgstr "शोध" #: Editor.java:1235 msgid "Find Next" -msgstr "पुढे शोधा" +msgstr "पुढे शोधा" #: Editor.java:1245 msgid "Find Previous" -msgstr "मागे शोधा" +msgstr "मागे शोधा" #: Editor.java:1255 msgid "Use Selection For Find" -msgstr "ठळक केलेल्यामध्ये शिधा" +msgstr "ठळक केलेल्यामध्ये शिधा" #: Editor.java:1816 msgid "First select a word to find in the reference." -msgstr "संदर्भ शोधण्यासाठी प्रथम शब्द निवडा" +msgstr "संदर्भ शोधण्यासाठी प्रथम शब्द निवडा" #: Editor.java:1823 #, java-format msgid "No reference available for \"{0}\"" -msgstr "साठी संदर्भ उपलब्ध नाही" +msgstr "साठी संदर्भ उपलब्ध नाही" #: Editor.java:1826 #, java-format msgid "{0}.html" -msgstr "" +msgstr "" #: Editor.java:1843 Sketch.java:1647 msgid "Compiling sketch..." -msgstr "स्केचचे कंपाइलिंग सुरु आहे..." +msgstr "स्केचचे कंपाइलिंग सुरु आहे..." #: Editor.java:1864 Editor.java:1881 msgid "Done compiling." -msgstr "कंपाइलिंग पूर्ण" +msgstr "कंपाइलिंग पूर्ण" #: Editor.java:1973 #, java-format msgid "Save changes to \"{0}\"? " -msgstr "येथे बदल जतन करा" +msgstr "येथे बदल जतन करा" #: Editor.java:2006 msgid "" @@ -280,31 +280,31 @@ msgid "" "{ font: 11pt \"Lucida Grande\"; margin-top: 8px } Do you " "want to save changes to this sketch
before closing?

If you don't " "save, your changes will be lost." -msgstr "" +msgstr "" #: Editor.java:2017 Editor.java:2098 Editor.java:2418 Sketch.java:589 #: Sketch.java:741 Sketch.java:1046 Preferences.java:78 msgid "Cancel" -msgstr "" +msgstr "" #: Editor.java:2017 msgid "Don't Save" -msgstr "" +msgstr "" #: Editor.java:2089 msgid "Bad file selected" -msgstr "" +msgstr "" #: Editor.java:2090 msgid "" "Processing can only open its own sketches\n" "and other files ending in .ino or .pde" -msgstr "" +msgstr "" #: Editor.java:2098 Editor.java:2418 Sketch.java:589 Sketch.java:741 #: Sketch.java:1046 Preferences.java:79 msgid "OK" -msgstr "" +msgstr "" #: Editor.java:2100 #, java-format @@ -312,311 +312,311 @@ msgid "" "The file \"{0}\" needs to be inside\n" "a sketch folder named \"{1}\".\n" "Create this folder, move the file, and continue?" -msgstr "" +msgstr "" #: Editor.java:2109 msgid "Moving" -msgstr "" +msgstr "" #: Editor.java:2120 Editor.java:2131 Editor.java:2141 Editor.java:2159 #: Sketch.java:479 Sketch.java:485 Sketch.java:500 Sketch.java:507 #: Sketch.java:530 Sketch.java:547 Base.java:1861 Preferences.java:240 msgid "Error" -msgstr "" +msgstr "" #: Editor.java:2122 #, java-format msgid "A folder named \"{0}\" already exists. Can't open sketch." -msgstr "" +msgstr "" #: Editor.java:2132 msgid "Could not create the sketch folder." -msgstr "" +msgstr "" #: Editor.java:2141 msgid "Could not copy to a proper location." -msgstr "" +msgstr "" #: Editor.java:2159 msgid "Could not create the sketch." -msgstr "" +msgstr "" #: Editor.java:2166 #, java-format msgid "{0} | Arduino {1}" -msgstr "" +msgstr "" #: Editor.java:2223 Editor.java:2261 msgid "Saving..." -msgstr "" +msgstr "" #: Editor.java:2228 Editor.java:2264 msgid "Done Saving." -msgstr "" +msgstr "" #: Editor.java:2270 msgid "Save Canceled." -msgstr "" +msgstr "" #: Editor.java:2296 #, java-format msgid "" "Serial port {0} not found.\n" "Retry the upload with another serial port?" -msgstr "" +msgstr "" #: Editor.java:2331 msgid "Uploading to I/O Board..." -msgstr "" +msgstr "" #: Editor.java:2348 Editor.java:2384 msgid "Done uploading." -msgstr "" +msgstr "" #: Editor.java:2356 Editor.java:2392 msgid "Upload canceled." -msgstr "" +msgstr "" #: Editor.java:2420 msgid "Save changes before export?" -msgstr "" +msgstr "" #: Editor.java:2435 msgid "Export canceled, changes must first be saved." -msgstr "" +msgstr "" #: Editor.java:2457 msgid "Burning bootloader to I/O Board (this may take a minute)..." -msgstr "" +msgstr "" #: Editor.java:2463 msgid "Done burning bootloader." -msgstr "" +msgstr "" #: Editor.java:2465 Editor.java:2469 Editor.java:2473 msgid "Error while burning bootloader." -msgstr "" +msgstr "" #: Editor.java:2500 msgid "Printing..." -msgstr "" +msgstr "" #: Editor.java:2517 msgid "Done printing." -msgstr "" +msgstr "" #: Editor.java:2520 msgid "Error while printing." -msgstr "" +msgstr "" #: Editor.java:2524 msgid "Printing canceled." -msgstr "" +msgstr "" #: Editor.java:2572 #, java-format msgid "Bad error line: {0}" -msgstr "" +msgstr "" #: Editor.java:2641 msgid "Open URL" -msgstr "" +msgstr "" #: UpdateCheck.java:53 msgid "http://www.arduino.cc/latest.txt" -msgstr "" +msgstr "" #: UpdateCheck.java:103 msgid "" "A new version of Arduino is available,\n" "would you like to visit the Arduino download page?" -msgstr "" +msgstr "" #: UpdateCheck.java:108 Preferences.java:76 msgid "Yes" -msgstr "" +msgstr "" #: UpdateCheck.java:108 Preferences.java:77 msgid "No" -msgstr "" +msgstr "" #: UpdateCheck.java:111 msgid "Update" -msgstr "" +msgstr "" #: UpdateCheck.java:118 msgid "http://www.arduino.cc/en/Main/Software" -msgstr "" +msgstr "" #: FindReplace.java:80 msgid "Find:" -msgstr "" +msgstr "" #: FindReplace.java:81 msgid "Replace with:" -msgstr "" +msgstr "" #: FindReplace.java:96 msgid "Ignore Case" -msgstr "" +msgstr "" #: FindReplace.java:105 msgid "Wrap Around" -msgstr "" +msgstr "" #: FindReplace.java:120 FindReplace.java:131 msgid "Replace All" -msgstr "" +msgstr "" #: FindReplace.java:121 FindReplace.java:130 Sketch.java:1050 msgid "Replace" -msgstr "" +msgstr "" #: FindReplace.java:122 FindReplace.java:129 msgid "Replace & Find" -msgstr "" +msgstr "" #: FindReplace.java:123 FindReplace.java:128 msgid "Previous" -msgstr "" +msgstr "" #: FindReplace.java:124 FindReplace.java:127 msgid "Find" -msgstr "" +msgstr "" #: SerialMonitor.java:93 msgid "Send" -msgstr "" +msgstr "" #: SerialMonitor.java:110 msgid "Autoscroll" -msgstr "" +msgstr "" #: SerialMonitor.java:112 msgid "No line ending" -msgstr "" +msgstr "" #: SerialMonitor.java:112 msgid "Newline" -msgstr "" +msgstr "" #: SerialMonitor.java:112 msgid "Carriage return" -msgstr "" +msgstr "" #: SerialMonitor.java:112 msgid "Both NL & CR" -msgstr "" +msgstr "" #: SerialMonitor.java:130 SerialMonitor.java:133 msgid " baud" -msgstr "" +msgstr "" #: Serial.java:147 #, java-format msgid "" "Serial port ''{0}'' already in use. Try quiting any programs that may be " "using it." -msgstr "" +msgstr "" #: Serial.java:154 #, java-format msgid "Error opening serial port ''{0}''." -msgstr "" +msgstr "" #: Serial.java:167 #, java-format msgid "" "Serial port ''{0}'' not found. Did you select the right one from the Tools > " "Serial Port menu?" -msgstr "" +msgstr "" #: Serial.java:424 #, java-format msgid "" "readBytesUntil() byte buffer is too small for the {0} bytes up to and " "including char {1}" -msgstr "" +msgstr "" #: Serial.java:567 #, java-format msgid "Error inside Serial.{0}()" -msgstr "" +msgstr "" #: tools/AutoFormat.java:91 msgid "Auto Format" -msgstr "" +msgstr "" #: tools/AutoFormat.java:913 tools/format/src/AutoFormat.java:54 msgid "No changes necessary for Auto Format." -msgstr "" +msgstr "" #: tools/AutoFormat.java:919 msgid "Auto Format Canceled: Too many right parentheses." -msgstr "" +msgstr "" #: tools/AutoFormat.java:922 msgid "Auto Format Canceled: Too many left parentheses." -msgstr "" +msgstr "" #: tools/AutoFormat.java:928 msgid "Auto Format Canceled: Too many right curly braces." -msgstr "" +msgstr "" #: tools/AutoFormat.java:931 msgid "Auto Format Canceled: Too many left curly braces." -msgstr "" +msgstr "" #: tools/AutoFormat.java:941 msgid "Auto Format finished." -msgstr "" +msgstr "" #: tools/FixEncoding.java:41 tools/FixEncoding.java:58 #: tools/FixEncoding.java:79 msgid "Fix Encoding & Reload" -msgstr "" +msgstr "" #: tools/FixEncoding.java:57 msgid "Discard all changes and reload sketch?" -msgstr "" +msgstr "" #: tools/FixEncoding.java:77 msgid "" "An error occurred while trying to fix the file encoding.\n" "Do not attempt to save this sketch as it may overwrite\n" "the old version. Use Open to re-open the sketch and try again.\n" -msgstr "" +msgstr "" #: tools/Archiver.java:48 msgid "Archive Sketch" -msgstr "" +msgstr "" #: tools/Archiver.java:59 msgid "yyMMdd" -msgstr "" +msgstr "" #: tools/Archiver.java:74 msgid "Couldn't archive sketch" -msgstr "" +msgstr "" #: tools/Archiver.java:75 msgid "" "Archiving the sketch has been canceled because\n" "the sketch couldn't save properly." -msgstr "" +msgstr "" #: tools/Archiver.java:109 msgid "Archive sketch as:" -msgstr "" +msgstr "" #: tools/Archiver.java:139 msgid "Archive sketch canceled." -msgstr "" +msgstr "" #: SketchCode.java:83 #, java-format msgid "Error while loading code {0}" -msgstr "" +msgstr "" #: SketchCode.java:258 #, java-format @@ -625,137 +625,137 @@ msgid "" "older version of Processing,you may need to use Tools -> Fix Encoding & " "Reload to updatethe sketch to use UTF-8 encoding. If not, you may need " "todelete the bad characters to get rid of this warning." -msgstr "" +msgstr "" #: Sketch.java:278 Sketch.java:307 Sketch.java:581 Sketch.java:970 msgid "Sketch is Read-Only" -msgstr "" +msgstr "" #: Sketch.java:279 Sketch.java:308 Sketch.java:582 Sketch.java:971 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save the sketch in another location,\n" "and try again." -msgstr "" +msgstr "" #: Sketch.java:286 msgid "Name for new file:" -msgstr "" +msgstr "" #: Sketch.java:298 msgid "Sketch is Untitled" -msgstr "" +msgstr "" #: Sketch.java:299 msgid "" "How about saving the sketch first \n" "before trying to rename it?" -msgstr "" +msgstr "" #: Sketch.java:359 Sketch.java:366 Sketch.java:377 msgid "Problem with rename" -msgstr "" +msgstr "" #: Sketch.java:360 msgid "The name cannot start with a period." -msgstr "" +msgstr "" #: Sketch.java:368 #, java-format msgid "\".{0}\" is not a valid extension." -msgstr "" +msgstr "" #: Sketch.java:378 msgid "" "The main file can't use an extension.\n" "(It may be time for your to graduate to a\n" "\"real\" programming environment)" -msgstr "" +msgstr "" #: Sketch.java:400 Sketch.java:414 Sketch.java:423 Sketch.java:863 msgid "Nope" -msgstr "" +msgstr "" #: Sketch.java:402 #, java-format msgid "A file named \"{0}\" already exists in \"{1}\"" -msgstr "" +msgstr "" #: Sketch.java:415 msgid "You can't have a .cpp file with the same name as the sketch." -msgstr "" +msgstr "" #: Sketch.java:425 msgid "" "You can't rename the sketch to \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" +msgstr "" #: Sketch.java:459 msgid "Cannot Rename" -msgstr "" +msgstr "" #: Sketch.java:461 #, java-format msgid "Sorry, a sketch (or folder) named \"{0}\" already exists." -msgstr "" +msgstr "" #: Sketch.java:479 msgid "Could not rename the sketch. (0)" -msgstr "" +msgstr "" #: Sketch.java:487 Sketch.java:532 #, java-format msgid "Could not rename \"{0}\" to \"{1}\"" -msgstr "" +msgstr "" #: Sketch.java:500 msgid "Could not rename the sketch. (1)" -msgstr "" +msgstr "" #: Sketch.java:507 msgid "Could not rename the sketch. (2)" -msgstr "" +msgstr "" #: Sketch.java:544 msgid "createNewFile() returned false" -msgstr "" +msgstr "" #: Sketch.java:591 msgid "Are you sure you want to delete this sketch?" -msgstr "" +msgstr "" #: Sketch.java:592 #, java-format msgid "Are you sure you want to delete \"{0}\"?" -msgstr "" +msgstr "" #: Sketch.java:595 EditorHeader.java:314 msgid "Delete" -msgstr "" +msgstr "" #: Sketch.java:620 msgid "Couldn't do it" -msgstr "" +msgstr "" #: Sketch.java:621 #, java-format msgid "Could not delete \"{0}\"." -msgstr "" +msgstr "" #: Sketch.java:651 msgid "removeCode: internal error.. could not find code" -msgstr "" +msgstr "" #: Sketch.java:724 msgid "Sketch is read-only" -msgstr "" +msgstr "" #: Sketch.java:725 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save this sketch to another location." -msgstr "" +msgstr "" #: Sketch.java:743 msgid "" @@ -766,188 +766,188 @@ msgid "" "disable this in the Preferences dialog.\n" "\n" "Save sketch and update its extension?" -msgstr "" +msgstr "" #: Sketch.java:750 msgid ".pde -> .ino" -msgstr "" +msgstr "" #: Sketch.java:829 msgid "Save sketch folder as..." -msgstr "" +msgstr "" #: Sketch.java:865 msgid "" "You can't save the sketch as \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" +msgstr "" #: Sketch.java:886 msgid "How very Borges of you" -msgstr "" +msgstr "" #: Sketch.java:887 msgid "" "You cannot save the sketch into a folder\n" "inside itself. This would go on forever." -msgstr "" +msgstr "" #: Sketch.java:979 msgid "Select an image or other data file to copy to your sketch" -msgstr "" +msgstr "" #: Sketch.java:1047 #, java-format msgid "Replace the existing version of {0}?" -msgstr "" +msgstr "" #: Sketch.java:1069 Sketch.java:1092 msgid "Error adding file" -msgstr "" +msgstr "" #: Sketch.java:1070 #, java-format msgid "Could not delete the existing ''{0}'' file." -msgstr "" +msgstr "" #: Sketch.java:1078 msgid "You can't fool me" -msgstr "" +msgstr "" #: Sketch.java:1079 msgid "" "This file has already been copied to the\n" "location from which where you're trying to add it.\n" "I ain't not doin nuthin'." -msgstr "" +msgstr "" #: Sketch.java:1093 #, java-format msgid "Could not add ''{0}'' to the sketch." -msgstr "" +msgstr "" #: Sketch.java:1393 Sketch.java:1424 msgid "Build folder disappeared or could not be written" -msgstr "" +msgstr "" #: Sketch.java:1408 msgid "Could not find main class" -msgstr "" +msgstr "" #: Sketch.java:1433 #, java-format msgid "Uncaught exception type: {0}" -msgstr "" +msgstr "" #: Sketch.java:1465 #, java-format msgid "Problem moving {0} to the build folder" -msgstr "" +msgstr "" #: Sketch.java:1661 msgid "Uploading..." -msgstr "" +msgstr "" #: Sketch.java:1684 #, java-format msgid "Binary sketch size: {0} bytes (of a {1} byte maximum)" -msgstr "" +msgstr "" #: Sketch.java:1689 msgid "Couldn't determine program size: {0}" -msgstr "" +msgstr "" #: Sketch.java:1694 msgid "" "Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for " "tips on reducing it." -msgstr "" +msgstr "" #: Sketch.java:1754 msgid "Missing the */ from the end of a /* comment */" -msgstr "" +msgstr "" #: Sketch.java:1796 msgid "Sketch Disappeared" -msgstr "" +msgstr "" #: Sketch.java:1797 msgid "" "The sketch folder has disappeared.\n" " Will attempt to re-save in the same location,\n" "but anything besides the code will be lost." -msgstr "" +msgstr "" #: Sketch.java:1810 msgid "Could not re-save sketch" -msgstr "" +msgstr "" #: Sketch.java:1811 msgid "" "Could not properly re-save the sketch. You may be in trouble at this point,\n" "and it might be time to copy and paste your code to another text editor." -msgstr "" +msgstr "" #: Sketch.java:2060 msgid "" "The sketch name had to be modified. Sketch names can only consist\n" "of ASCII characters and numbers (but cannot start with a number).\n" "They should also be less less than 64 characters long." -msgstr "" +msgstr "" #: debug/Uploader.java:52 msgid "https://developer.berlios.de/bugs/?group_id=3590" -msgstr "" +msgstr "" #: debug/Uploader.java:54 debug/Compiler.java:43 #, java-format msgid "Compiler error, please submit this code to {0}" -msgstr "" +msgstr "" #: debug/Uploader.java:199 #, java-format msgid "" "the selected serial port {0} does not exist or your board is not connected" -msgstr "" +msgstr "" #: debug/Uploader.java:203 msgid "" "Device is not responding, check the right serial port is selected or RESET " "the board right before exporting" -msgstr "" +msgstr "" #: debug/Uploader.java:209 msgid "" "Problem uploading to board. See http://www.arduino.cc/en/Guide/" "Troubleshooting#upload for suggestions." -msgstr "" +msgstr "" #: debug/Uploader.java:213 msgid "" "Wrong microcontroller found. Did you select the right board from the Tools " "> Board menu?" -msgstr "" +msgstr "" #: debug/Compiler.java:41 msgid "http://code.google.com/p/arduino/issues/list" -msgstr "" +msgstr "" #: debug/Compiler.java:79 msgid "No board selected; please choose a board from the Tools > Board menu." -msgstr "" +msgstr "" #: debug/Compiler.java:422 #, java-format msgid "{0} returned {1}" -msgstr "" +msgstr "" #: debug/Compiler.java:426 msgid "Error compiling." -msgstr "" +msgstr "" #: debug/Compiler.java:465 msgid "Please import the SPI library from the Sketch > Import Library menu." -msgstr "" +msgstr "" #: debug/Compiler.java:466 msgid "" @@ -956,11 +956,11 @@ msgid "" "You appear to be using it or another library that depends on the SPI " "library.\n" "\n" -msgstr "" +msgstr "" #: debug/Compiler.java:471 msgid "The 'BYTE' keyword is no longer supported." -msgstr "" +msgstr "" #: debug/Compiler.java:472 msgid "" @@ -968,11 +968,11 @@ msgid "" "As of Arduino 1.0, the 'BYTE' keyword is no longer supported.\n" "Please use Serial.write() instead.\n" "\n" -msgstr "" +msgstr "" #: debug/Compiler.java:477 msgid "The Server class has been renamed EthernetServer." -msgstr "" +msgstr "" #: debug/Compiler.java:478 msgid "" @@ -980,11 +980,11 @@ msgid "" "As of Arduino 1.0, the Server class in the Ethernet library has been renamed " "to EthernetServer.\n" "\n" -msgstr "" +msgstr "" #: debug/Compiler.java:483 msgid "The Client class has been renamed EthernetClient." -msgstr "" +msgstr "" #: debug/Compiler.java:484 msgid "" @@ -992,11 +992,11 @@ msgid "" "As of Arduino 1.0, the Client class in the Ethernet library has been renamed " "to EthernetClient.\n" "\n" -msgstr "" +msgstr "" #: debug/Compiler.java:489 msgid "The Udp class has been renamed EthernetUdp." -msgstr "" +msgstr "" #: debug/Compiler.java:490 msgid "" @@ -1004,11 +1004,11 @@ msgid "" "As of Arduino 1.0, the Udp class in the Ethernet library has been renamed to " "EthernetClient.\n" "\n" -msgstr "" +msgstr "" #: debug/Compiler.java:495 msgid "Wire.send() has been renamed Wire.write()." -msgstr "" +msgstr "" #: debug/Compiler.java:496 msgid "" @@ -1016,11 +1016,11 @@ msgid "" "As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for " "consistency with other libraries.\n" "\n" -msgstr "" +msgstr "" #: debug/Compiler.java:501 msgid "Wire.receive() has been renamed Wire.read()." -msgstr "" +msgstr "" #: debug/Compiler.java:502 msgid "" @@ -1028,50 +1028,50 @@ msgid "" "As of Arduino 1.0, the Wire.receive() function was renamed to Wire.read() " "for consistency with other libraries.\n" "\n" -msgstr "" +msgstr "" #: EditorConsole.java:152 msgid "Console Error" -msgstr "" +msgstr "" #: EditorConsole.java:153 msgid "" "A problem occurred while trying to open the\n" "files used to store the console output." -msgstr "" +msgstr "" #: Base.java:184 msgid "Non-fatal error while setting the Look & Feel." -msgstr "" +msgstr "" #: Base.java:185 msgid "The error message follows, however Arduino should run fine." -msgstr "" +msgstr "" #: Base.java:220 msgid "Problem Setting the Platform" -msgstr "" +msgstr "" #: Base.java:221 msgid "" "An unknown error occurred while trying to load\n" "platform-specific code for your machine." -msgstr "" +msgstr "" #: Base.java:232 msgid "Please install JDK 1.5 or later" -msgstr "" +msgstr "" #: Base.java:233 msgid "" "Arduino requires a full JDK (not just a JRE)\n" "to run. Please install JDK 1.5 or later.\n" "More information can be found in the reference." -msgstr "" +msgstr "" #: Base.java:257 msgid "Sketchbook folder disappeared" -msgstr "" +msgstr "" #: Base.java:258 msgid "" @@ -1080,51 +1080,51 @@ msgid "" "location, and create a new sketchbook folder if\n" "necessary. Arduino will then stop talking about\n" "himself in the third person." -msgstr "" +msgstr "" #: Base.java:532 msgid "Time for a Break" -msgstr "" +msgstr "" #: Base.java:533 msgid "" "You've reached the limit for auto naming of new sketches\n" "for the day. How about going for a walk instead?" -msgstr "" +msgstr "" #: Base.java:537 msgid "Sunshine" -msgstr "" +msgstr "" #: Base.java:538 msgid "No really, time for some fresh air for you." -msgstr "" +msgstr "" #: Base.java:633 msgid "Open an Arduino sketch..." -msgstr "" +msgstr "" #: Base.java:772 msgid "" " Are you " "sure you want to Quit?

Closing the last open sketch will quit Arduino." -msgstr "" +msgstr "" #: Base.java:970 msgid "Contributed" -msgstr "" +msgstr "" #: Base.java:1095 msgid "Sketch Does Not Exist" -msgstr "" +msgstr "" #: Base.java:1096 msgid "" "The selected sketch no longer exists.\n" "You may need to restart Arduino to update\n" "the sketchbook menu." -msgstr "" +msgstr "" #: Base.java:1125 #, java-format @@ -1134,11 +1134,11 @@ msgid "" "(ASCII-only with no spaces, and it cannot start with a number).\n" "To get rid of this message, remove the sketch from\n" "{1}" -msgstr "" +msgstr "" #: Base.java:1132 msgid "Ignoring sketch with bad name" -msgstr "" +msgstr "" #: Base.java:1202 #, java-format @@ -1146,177 +1146,177 @@ msgid "" "The library \"{0}\" cannot be used.\n" "Library names must contain only basic letters and numbers.\n" "(ASCII only and no spaces, and it cannot start with a number)" -msgstr "" +msgstr "" #: Base.java:1207 msgid "Ignoring bad library name" -msgstr "" +msgstr "" #: Base.java:1432 msgid "Problem getting data folder" -msgstr "" +msgstr "" #: Base.java:1433 msgid "Error getting the Arduino data folder." -msgstr "" +msgstr "" #: Base.java:1440 msgid "Settings issues" -msgstr "" +msgstr "" #: Base.java:1441 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your settings." -msgstr "" +msgstr "" #: Base.java:1602 msgid "You forgot your sketchbook" -msgstr "" +msgstr "" #: Base.java:1603 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your sketchbook." -msgstr "" +msgstr "" #: Base.java:1623 msgid "Select (or create new) folder for sketches..." -msgstr "" +msgstr "" #: Base.java:1647 msgid "Problem Opening URL" -msgstr "" +msgstr "" #: Base.java:1648 #, java-format msgid "" "Could not open the URL\n" "{0}" -msgstr "" +msgstr "" #: Base.java:1671 msgid "Problem Opening Folder" -msgstr "" +msgstr "" #: Base.java:1672 #, java-format msgid "" "Could not open the folder\n" "{0}" -msgstr "" +msgstr "" #: Base.java:1785 msgid "Guide_MacOSX.html" -msgstr "" +msgstr "" #: Base.java:1787 msgid "Guide_Windows.html" -msgstr "" +msgstr "" #: Base.java:1789 msgid "http://www.arduino.cc/playground/Learning/Linux" -msgstr "" +msgstr "" #: Base.java:1794 msgid "index.html" -msgstr "" +msgstr "" #: Base.java:1799 msgid "Guide_Environment.html" -msgstr "" +msgstr "" #: Base.java:1804 msgid "environment" -msgstr "" +msgstr "" #: Base.java:1804 msgid "platforms.html" -msgstr "" +msgstr "" #: Base.java:1809 msgid "Guide_Troubleshooting.html" -msgstr "" +msgstr "" #: Base.java:1814 msgid "FAQ.html" -msgstr "" +msgstr "" #: Base.java:1826 msgid "Message" -msgstr "" +msgstr "" #: Base.java:1842 msgid "Warning" -msgstr "" +msgstr "" #: Base.java:2196 #, java-format msgid "Could not remove old version of {0}" -msgstr "" +msgstr "" #: Base.java:2206 #, java-format msgid "Could not replace {0}" -msgstr "" +msgstr "" #: Base.java:2247 Base.java:2270 #, java-format msgid "Could not delete {0}" -msgstr "" +msgstr "" #: EditorHeader.java:292 msgid "New Tab" -msgstr "" +msgstr "" #: EditorHeader.java:300 msgid "Rename" -msgstr "" +msgstr "" #: EditorHeader.java:326 msgid "Previous Tab" -msgstr "" +msgstr "" #: EditorHeader.java:340 msgid "Next Tab" -msgstr "" +msgstr "" #: EditorToolbar.java:41 EditorToolbar.java:46 msgid "Verify" -msgstr "" +msgstr "" #: EditorToolbar.java:41 msgid "Open" -msgstr "" +msgstr "" #: EditorToolbar.java:46 msgid "New Editor Window" -msgstr "" +msgstr "" #: EditorToolbar.java:46 msgid "Open in Another Window" -msgstr "" +msgstr "" #: Platform.java:167 msgid "No launcher available" -msgstr "" +msgstr "" #: Platform.java:168 msgid "" "Unspecified platform, no launcher available.\n" "To enable opening URLs or folders, add a \n" "\"launcher=/path/to/app\" line to preferences.txt" -msgstr "" +msgstr "" #: Theme.java:52 msgid "" "Could not read color theme settings.\n" "You'll need to reinstall Processing." -msgstr "" +msgstr "" #: Preferences.java:80 msgid "Browse" -msgstr "" +msgstr "" #: Preferences.java:83 msgid "System Default" @@ -1434,31 +1434,31 @@ msgstr "" msgid "" "Could not read default settings.\n" "You'll need to reinstall Arduino." -msgstr "" +msgstr "" #: Preferences.java:242 #, java-format msgid "Could not read preferences from {0}" -msgstr "" +msgstr "" #: Preferences.java:261 msgid "Error reading preferences" -msgstr "" +msgstr "" #: Preferences.java:263 #, java-format msgid "" "Error reading the preferences file. Please delete (or move)\n" "{0} and restart Arduino." -msgstr "" +msgstr "" #: Preferences.java:299 msgid "Sketchbook location:" -msgstr "" +msgstr "" #: Preferences.java:314 msgid "Select new sketchbook location" -msgstr "" +msgstr "" #: Preferences.java:337 msgid "Editor language: " @@ -1466,23 +1466,23 @@ msgstr "" #: Preferences.java:342 Preferences.java:358 msgid " (requires restart of Arduino)" -msgstr "" +msgstr "" #: Preferences.java:354 msgid "Editor font size: " -msgstr "" +msgstr "" #: Preferences.java:371 msgid "Show verbose output during: " -msgstr "" +msgstr "" #: Preferences.java:373 msgid "compilation " -msgstr "" +msgstr "" #: Preferences.java:375 msgid "upload" -msgstr "" +msgstr "" #: Preferences.java:384 msgid "Verify code after upload" @@ -1490,29 +1490,29 @@ msgstr "" #: Preferences.java:393 msgid "Use external editor" -msgstr "" +msgstr "" #: Preferences.java:403 msgid "Check for updates on startup" -msgstr "" +msgstr "" #: Preferences.java:412 msgid "Update sketch files to new extension on save (.pde -> .ino)" -msgstr "" +msgstr "" #: Preferences.java:423 msgid "Automatically associate .ino files with Arduino" -msgstr "" +msgstr "" #: Preferences.java:433 msgid "More preferences can be edited directly in the file" -msgstr "" +msgstr "" #: Preferences.java:462 msgid "(edit only when Arduino is not running)" -msgstr "" +msgstr "" #: Preferences.java:609 #, java-format msgid "ignoring invalid font size {0}" -msgstr "" +msgstr "" diff --git a/app/src/processing/app/i18n/Resources_mr.properties b/app/src/processing/app/i18n/Resources_mr.properties index 8d2613a3d94..acefac9cc0c 100644 --- a/app/src/processing/app/i18n/Resources_mr.properties +++ b/app/src/processing/app/i18n/Resources_mr.properties @@ -1,8 +1,8 @@ -# Marathi translations for PACKAGE package. -# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Sarvesh S. Karkhanis <>, 2012. -# +# Marathi translations for PACKAGE package. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Sarvesh S. Karkhanis <>, 2012. +# !=Project-Id-Version\: PACKAGE VERSION\nReport-Msgid-Bugs-To\: \nPOT-Creation-Date\: 2012-04-04 10\:24-0400\nPO-Revision-Date\: 2012-04-04 13\:24-0400\nLast-Translator\: Sarvesh S. Karkhanis <>\nLanguage-Team\: \nLanguage\: mr\nMIME-Version\: 1.0\nContent-Type\: text/plain; charset\=UTF-8\nContent-Transfer-Encoding\: 8bit\nPlural-Forms\: nplurals\=2; plural\=(n \!\= 1);\n #: Editor.java:366 diff --git a/app/src/processing/app/i18n/Resources_ta.po b/app/src/processing/app/i18n/Resources_ta.po index 1836d2319f0..844c1d22545 100644 --- a/app/src/processing/app/i18n/Resources_ta.po +++ b/app/src/processing/app/i18n/Resources_ta.po @@ -1,277 +1,277 @@ -# Tamil translations for Arduino IDE package. -# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the Arduino IDE package. -# Ram Kumar.Y , 2012. -# +# Tamil translations for Arduino IDE package. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the Arduino IDE package. +# Ram Kumar.Y , 2012. +# msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-03-29 10:24-0400\n" -"PO-Revision-Date: 2012-05-04 10:24-0400\n" -"Last-Translator: Ram Kumar.Y \n" -"Language-Team: Tamil\n" -"Language: ta\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-03-29 10:24-0400\n" +"PO-Revision-Date: 2012-05-04 10:24-0400\n" +"Last-Translator: Ram Kumar.Y \n" +"Language-Team: Tamil\n" +"Language: ta\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" #: Editor.java:366 msgid "No files were added to the sketch." -msgstr "வரைவில் இன்னும் கோப்புகள் சேர்க்கப்படவில்லை." +msgstr "வரைவில் இன்னும் கோப்புகள் சேர்க்கப்படவில்லை." #: Editor.java:369 Sketch.java:996 msgid "One file added to the sketch." -msgstr "வரைவில் ஒரு கோப்பு சேர்க்கப்பட்டுள்ளன." +msgstr "வரைவில் ஒரு கோப்பு சேர்க்கப்பட்டுள்ளன." #: Editor.java:373 #, java-format msgid "{0} files added to the sketch." -msgstr "கோப்புகள் வரைவில் சேர்கப்பட்டுள்ளன." +msgstr "கோப்புகள் வரைவில் சேர்கப்பட்டுள்ளன." #: Editor.java:484 msgid "File" -msgstr "கோப்பு" +msgstr "கோப்பு" #: Editor.java:486 EditorToolbar.java:41 msgid "New" -msgstr "புதிய" +msgstr "புதிய" #: Editor.java:494 Base.java:903 msgid "Open..." -msgstr "திற..." +msgstr "திற..." #: Editor.java:503 msgid "Sketchbook" -msgstr "வரைவு புத்தகம்" +msgstr "வரைவு புத்தகம்" #: Editor.java:509 msgid "Examples" -msgstr "எடுத்துக்காட்டுகள்" +msgstr "எடுத்துக்காட்டுகள்" #: Editor.java:514 Editor.java:1977 msgid "Close" -msgstr "மூடு" +msgstr "மூடு" #: Editor.java:522 Editor.java:2017 Editor.java:2421 EditorToolbar.java:41 #: EditorToolbar.java:46 msgid "Save" -msgstr "சேமி" +msgstr "சேமி" #: Editor.java:530 msgid "Save As..." -msgstr "எனச் சேமி..." +msgstr "எனச் சேமி..." #: Editor.java:538 EditorToolbar.java:41 msgid "Upload" -msgstr "பதிவேற்று" +msgstr "பதிவேற்று" #: Editor.java:546 EditorToolbar.java:46 msgid "Upload Using Programmer" -msgstr "நிரலரை பயன்படுத்தி பதிவேற்று" +msgstr "நிரலரை பயன்படுத்தி பதிவேற்று" #: Editor.java:556 msgid "Page Setup" -msgstr "பக்கத்தை நிறுவுக" +msgstr "பக்கத்தை நிறுவுக" #: Editor.java:564 msgid "Print" -msgstr "அச்சிடுக" +msgstr "அச்சிடுக" #: Editor.java:576 Preferences.java:279 msgid "Preferences" -msgstr "விருப்பத்தேர்வுகள்" +msgstr "விருப்பத்தேர்வுகள்" #: Editor.java:586 Base.java:782 msgid "Quit" -msgstr "வெளியேறுக" +msgstr "வெளியேறுக" #: Editor.java:600 msgid "Sketch" -msgstr "வரைவு" +msgstr "வரைவு" #: Editor.java:602 msgid "Verify / Compile" -msgstr "உறுதிப்படுத்து / தொகுப்பி" +msgstr "உறுதிப்படுத்து / தொகுப்பி" #: Editor.java:629 msgid "Import Library..." -msgstr "நூலகத்தை இறக்குமதி செய்..." +msgstr "நூலகத்தை இறக்குமதி செய்..." #: Editor.java:634 msgid "Show Sketch Folder" -msgstr "வரைவு உறையை காட்டுக" +msgstr "வரைவு உறையை காட்டுக" #: Editor.java:643 msgid "Add File..." -msgstr "கோப்பை சேர்" +msgstr "கோப்பை சேர்" #: Editor.java:656 msgid "Tools" -msgstr "கருவிகள்" +msgstr "கருவிகள்" #: Editor.java:662 EditorToolbar.java:41 EditorToolbar.java:46 msgid "Serial Monitor" -msgstr "தொடர்நிலை கண்காணிப்புத்திரை" +msgstr "தொடர்நிலை கண்காணிப்புத்திரை" #: Editor.java:682 msgid "Board" -msgstr "பலகை" +msgstr "பலகை" #: Editor.java:690 msgid "Serial Port" -msgstr "தொடர்நிலை துறை" +msgstr "தொடர்நிலை துறை" #: Editor.java:695 msgid "Programmer" -msgstr "நிரலர்" +msgstr "நிரலர்" #: Editor.java:699 msgid "Burn Bootloader" -msgstr "துவக்கு நிரல் பதிவேற்று" +msgstr "துவக்கு நிரல் பதிவேற்று" #: Editor.java:923 msgid "serialMenu is null" -msgstr "தொடர் தெரிவுதிரை வெற்றாக உள்ளது" +msgstr "தொடர் தெரிவுதிரை வெற்றாக உள்ளது" #: Editor.java:927 Editor.java:934 msgid "name is null" -msgstr "பெயர் வெற்றாக உள்ளது" +msgstr "பெயர் வெற்றாக உள்ளது" #: Editor.java:986 msgid "error retrieving port list" -msgstr "துறை பட்டியலை பெறுவதில் பிழை ஏற்பட்டுள்ளது" +msgstr "துறை பட்டியலை பெறுவதில் பிழை ஏற்பட்டுள்ளது" #: Editor.java:1002 msgid "Help" -msgstr "உதவி" +msgstr "உதவி" #: Editor.java:1041 msgid "Getting Started" -msgstr "தொடங்குதல்" +msgstr "தொடங்குதல்" #: Editor.java:1049 msgid "Environment" -msgstr "சூழல்" +msgstr "சூழல்" #: Editor.java:1057 msgid "Troubleshooting" -msgstr "சரிப்படுத்துதல்" +msgstr "சரிப்படுத்துதல்" #: Editor.java:1065 msgid "Reference" -msgstr "குறிப்பு" +msgstr "குறிப்பு" #: Editor.java:1073 Editor.java:2728 msgid "Find in Reference" -msgstr "குறிப்பில் கண்டுபிடி" +msgstr "குறிப்பில் கண்டுபிடி" #: Editor.java:1083 msgid "Frequently Asked Questions" -msgstr "அடிக்கடி கேட்கப்படும் கேள்விகள்" +msgstr "அடிக்கடி கேட்கப்படும் கேள்விகள்" #: Editor.java:1091 msgid "Visit Arduino.cc" -msgstr "Arduino.cc செல்க" +msgstr "Arduino.cc செல்க" #: Editor.java:1094 msgid "http://arduino.cc/" -msgstr "http://arduino.cc/" +msgstr "http://arduino.cc/" #: Editor.java:1102 msgid "About Arduino" -msgstr "Arduino பற்றி" +msgstr "Arduino பற்றி" #: Editor.java:1116 msgid "Edit" -msgstr "தொகு" +msgstr "தொகு" #: Editor.java:1119 Editor.java:1341 msgid "Undo" -msgstr "திரும்பப்பெறுக" +msgstr "திரும்பப்பெறுக" #: Editor.java:1124 Editor.java:1126 Editor.java:1376 msgid "Redo" -msgstr "திரும்பச்செய்க" +msgstr "திரும்பச்செய்க" #: Editor.java:1135 Editor.java:2652 msgid "Cut" -msgstr "வெட்டுக" +msgstr "வெட்டுக" #: Editor.java:1143 Editor.java:2660 msgid "Copy" -msgstr "நகல்" +msgstr "நகல்" #: Editor.java:1151 Editor.java:2668 msgid "Copy for Forum" -msgstr "பொது மன்றத்திற்காக நகலெடு" +msgstr "பொது மன்றத்திற்காக நகலெடு" #: Editor.java:1163 Editor.java:2676 msgid "Copy as HTML" -msgstr "HTML ஆக நகலெடு" +msgstr "HTML ஆக நகலெடு" #: Editor.java:1175 Editor.java:2684 msgid "Paste" -msgstr "ஒட்டு" +msgstr "ஒட்டு" #: Editor.java:1184 Editor.java:2692 msgid "Select All" -msgstr "அனைத்தும் தேர்ந்தெடு" +msgstr "அனைத்தும் தேர்ந்தெடு" #: Editor.java:1194 Editor.java:2702 msgid "Comment/Uncomment" -msgstr "கருத்துரைக/கருத்தை நீக்குக" +msgstr "கருத்துரைக/கருத்தை நீக்குக" #: Editor.java:1202 Editor.java:2710 msgid "Increase Indent" -msgstr "உள்தள்ளலை அதிகப்படுத்துக" +msgstr "உள்தள்ளலை அதிகப்படுத்துக" #: Editor.java:1210 Editor.java:2718 msgid "Decrease Indent" -msgstr "உள்தள்ளலை குறைக்க" +msgstr "உள்தள்ளலை குறைக்க" #: Editor.java:1220 msgid "Find..." -msgstr "தேடு..." +msgstr "தேடு..." #: Editor.java:1235 msgid "Find Next" -msgstr "அடுத்ததை தேடு" +msgstr "அடுத்ததை தேடு" #: Editor.java:1245 msgid "Find Previous" -msgstr "முந்தியதை தேடு" +msgstr "முந்தியதை தேடு" #: Editor.java:1255 msgid "Use Selection For Find" -msgstr "தேடுதலுக்கு தெரிவுகளை பயன்படுத்தவும்" +msgstr "தேடுதலுக்கு தெரிவுகளை பயன்படுத்தவும்" #: Editor.java:1816 msgid "First select a word to find in the reference." -msgstr "குறிப்பில் தேட முதலில் ஒரு வார்த்தையை தேர்வு செய்யவும்" +msgstr "குறிப்பில் தேட முதலில் ஒரு வார்த்தையை தேர்வு செய்யவும்" #: Editor.java:1823 #, java-format msgid "No reference available for \"{0}\"" -msgstr "\"{0}\" க்கு எந்த குறிப்பும் இல்லை" +msgstr "\"{0}\" க்கு எந்த குறிப்பும் இல்லை" #: Editor.java:1826 #, java-format msgid "{0}.html" -msgstr "{0}.html" +msgstr "{0}.html" #: Editor.java:1843 Sketch.java:1647 msgid "Compiling sketch..." -msgstr "வரைவை தொகுக்கிறது..." +msgstr "வரைவை தொகுக்கிறது..." #: Editor.java:1864 Editor.java:1881 msgid "Done compiling." -msgstr "தொகுத்துவிட்டது." +msgstr "தொகுத்துவிட்டது." #: Editor.java:1973 #, java-format msgid "Save changes to \"{0}\"? " -msgstr "மாறுதல்களை \"{0}\"? ல் சேமிக்கவும்" +msgstr "மாறுதல்களை \"{0}\"? ல் சேமிக்கவும்" #: Editor.java:2006 msgid "" @@ -279,37 +279,37 @@ msgid "" "{ font: 11pt \"Lucida Grande\"; margin-top: 8px } Do you " "want to save changes to this sketch
before closing?

If you don't " "save, your changes will be lost." -msgstr "" -" நீங்கள் " -"மாற்றங்களை
வரைவில் சேமிக்க விரும்புகிறீர்களா?

இல்லையென்றால் " -"நீங்கள் மாற்றியவை அனைத்தையும் இழந்துவிடுவீர்கள்." +msgstr "" +" நீங்கள் " +"மாற்றங்களை
வரைவில் சேமிக்க விரும்புகிறீர்களா?

இல்லையென்றால் " +"நீங்கள் மாற்றியவை அனைத்தையும் இழந்துவிடுவீர்கள்." #: Editor.java:2017 Editor.java:2098 Editor.java:2418 Sketch.java:589 #: Sketch.java:741 Sketch.java:1046 Preferences.java:78 msgid "Cancel" -msgstr "இரத்து செய்" +msgstr "இரத்து செய்" #: Editor.java:2017 msgid "Don't Save" -msgstr "சேமிக்காதே" +msgstr "சேமிக்காதே" #: Editor.java:2089 msgid "Bad file selected" -msgstr "தவறான கோப்பு தேர்வுசெய்யப்பட்டுள்ளது " +msgstr "தவறான கோப்பு தேர்வுசெய்யப்பட்டுள்ளது " #: Editor.java:2090 msgid "" "Processing can only open its own sketches\n" "and other files ending in .ino or .pde" -msgstr "" -"செயலாக்கத்தால் அதனுடைய வரைவுகள் மற்றும்\n" -".ino அல்லது .pde நீட்டுதல் கொண்ட கோப்புகளை மட்டுமே திறக்க முடியும்" +msgstr "" +"செயலாக்கத்தால் அதனுடைய வரைவுகள் மற்றும்\n" +".ino அல்லது .pde நீட்டுதல் கொண்ட கோப்புகளை மட்டுமே திறக்க முடியும்" #: Editor.java:2098 Editor.java:2418 Sketch.java:589 Sketch.java:741 #: Sketch.java:1046 Preferences.java:79 msgid "OK" -msgstr "சரி" +msgstr "சரி" #: Editor.java:2100 #, java-format @@ -317,328 +317,328 @@ msgid "" "The file \"{0}\" needs to be inside\n" "a sketch folder named \"{1}\".\n" "Create this folder, move the file, and continue?" -msgstr "" -"\"{0}\" கோப்பு \"{1}\" என்ற பெயர் கொண்ட\n" -"வரைவு உறையில் மட்டுமே இருக்க முடியும்.\n" -"இந்த உறையை உருவாக்கி, கோப்பை நகற்றி, முன்னேரவா?" +msgstr "" +"\"{0}\" கோப்பு \"{1}\" என்ற பெயர் கொண்ட\n" +"வரைவு உறையில் மட்டுமே இருக்க முடியும்.\n" +"இந்த உறையை உருவாக்கி, கோப்பை நகற்றி, முன்னேரவா?" #: Editor.java:2109 msgid "Moving" -msgstr "நகற்றுகிறது" +msgstr "நகற்றுகிறது" #: Editor.java:2120 Editor.java:2131 Editor.java:2141 Editor.java:2159 #: Sketch.java:479 Sketch.java:485 Sketch.java:500 Sketch.java:507 #: Sketch.java:530 Sketch.java:547 Base.java:1861 Preferences.java:240 msgid "Error" -msgstr "பிழை" +msgstr "பிழை" #: Editor.java:2122 #, java-format msgid "A folder named \"{0}\" already exists. Can't open sketch." -msgstr "\"{0}\" என்ற உறை ஏற்கனவே இருக்கிறது. வரைவை திறக்க முடியவில்லை." +msgstr "\"{0}\" என்ற உறை ஏற்கனவே இருக்கிறது. வரைவை திறக்க முடியவில்லை." #: Editor.java:2132 msgid "Could not create the sketch folder." -msgstr "வரைவு உறையை உருவாக்க முடியவில்லை." +msgstr "வரைவு உறையை உருவாக்க முடியவில்லை." #: Editor.java:2141 msgid "Could not copy to a proper location." -msgstr "சரியான இடத்திற்கு பிரதி எடுக்க முடியவில்லை." +msgstr "சரியான இடத்திற்கு பிரதி எடுக்க முடியவில்லை." #: Editor.java:2159 msgid "Could not create the sketch." -msgstr "வரைவை உருவாக்க முடியவில்லை." +msgstr "வரைவை உருவாக்க முடியவில்லை." #: Editor.java:2166 #, java-format msgid "{0} | Arduino {1}" -msgstr "{0} | Arduino {1}" +msgstr "{0} | Arduino {1}" #: Editor.java:2223 Editor.java:2261 msgid "Saving..." -msgstr "சேமிக்கிறது..." +msgstr "சேமிக்கிறது..." #: Editor.java:2228 Editor.java:2264 msgid "Done Saving." -msgstr "செமித்துவிட்டது." +msgstr "செமித்துவிட்டது." #: Editor.java:2270 msgid "Save Canceled." -msgstr "சேமிப்பு ரத்து செய்யப்பட்டது." +msgstr "சேமிப்பு ரத்து செய்யப்பட்டது." #: Editor.java:2296 #, java-format msgid "" "Serial port {0} not found.\n" "Retry the upload with another serial port?" -msgstr "" -"தொடர்நிலை துறை {0} காணவில்லை.\n" -"வேறு தொடர்நிலை துறை கொண்டு மேலேற்ற முயற்சிக்கவும்?" +msgstr "" +"தொடர்நிலை துறை {0} காணவில்லை.\n" +"வேறு தொடர்நிலை துறை கொண்டு மேலேற்ற முயற்சிக்கவும்?" #: Editor.java:2331 msgid "Uploading to I/O Board..." -msgstr "உள்ளீட்டு/வெளியீட்டு பலகைக்கு மேலேற்றுகிறது..." +msgstr "உள்ளீட்டு/வெளியீட்டு பலகைக்கு மேலேற்றுகிறது..." #: Editor.java:2348 Editor.java:2384 msgid "Done uploading." -msgstr "மேலேற்றி முடித்துவிட்டது." +msgstr "மேலேற்றி முடித்துவிட்டது." #: Editor.java:2356 Editor.java:2392 msgid "Upload canceled." -msgstr "மேலேற்றம் ரத்து செய்யப்பட்டது." +msgstr "மேலேற்றம் ரத்து செய்யப்பட்டது." #: Editor.java:2420 msgid "Save changes before export?" -msgstr "ஏற்றுமதி செய்யும் முன் மாற்றங்களை செமிக்கவா?" +msgstr "ஏற்றுமதி செய்யும் முன் மாற்றங்களை செமிக்கவா?" #: Editor.java:2435 msgid "Export canceled, changes must first be saved." -msgstr "ஏற்றுமதி ரத்து செய்யப்பட்டது, மாற்றங்களை முதலில் சேமிக்க வேண்டும்." +msgstr "ஏற்றுமதி ரத்து செய்யப்பட்டது, மாற்றங்களை முதலில் சேமிக்க வேண்டும்." #: Editor.java:2457 msgid "Burning bootloader to I/O Board (this may take a minute)..." -msgstr "துவக்கு நிரலை உள்ளீடு/வெளியீடு பலகையில் பதிவேற்றப்படுகிறது (இது சில நிமிடங்கள் நடக்கும்)..." +msgstr "துவக்கு நிரலை உள்ளீடு/வெளியீடு பலகையில் பதிவேற்றப்படுகிறது (இது சில நிமிடங்கள் நடக்கும்)..." #: Editor.java:2463 msgid "Done burning bootloader." -msgstr "துவக்கு நிரலை பதிவேற்றிவிட்டது." +msgstr "துவக்கு நிரலை பதிவேற்றிவிட்டது." #: Editor.java:2465 Editor.java:2469 Editor.java:2473 msgid "Error while burning bootloader." -msgstr "துவக்கு நிரலை பதிவேற்றும்போது பிழை ஏற்பட்டுவிட்டது." +msgstr "துவக்கு நிரலை பதிவேற்றும்போது பிழை ஏற்பட்டுவிட்டது." #: Editor.java:2500 msgid "Printing..." -msgstr "அச்சிடுகிறது..." +msgstr "அச்சிடுகிறது..." #: Editor.java:2517 msgid "Done printing." -msgstr "அச்சிட்டுவிட்டது." +msgstr "அச்சிட்டுவிட்டது." #: Editor.java:2520 msgid "Error while printing." -msgstr "அச்சிடும்போது பிழை ஏற்பட்டுவிட்டது." +msgstr "அச்சிடும்போது பிழை ஏற்பட்டுவிட்டது." #: Editor.java:2524 msgid "Printing canceled." -msgstr "அச்சிடுவது ரத்து செய்யப்பட்டது." +msgstr "அச்சிடுவது ரத்து செய்யப்பட்டது." #: Editor.java:2572 #, java-format msgid "Bad error line: {0}" -msgstr "பிழையின் வரிசை: {0}" +msgstr "பிழையின் வரிசை: {0}" #: Editor.java:2641 msgid "Open URL" -msgstr "URLஐ திற" +msgstr "URLஐ திற" #: UpdateCheck.java:53 msgid "http://www.arduino.cc/latest.txt" -msgstr "http://www.arduino.cc/latest.txt" +msgstr "http://www.arduino.cc/latest.txt" #: UpdateCheck.java:103 msgid "" "A new version of Arduino is available,\n" "would you like to visit the Arduino download page?" -msgstr "" -"Arduinoவின் புதிய பதிப்பு கிடைக்கிறது,\n" -"நீங்கள் Arduino பதிவிறக்க பக்கத்தை காண விரும்புகிறீர்களா?" +msgstr "" +"Arduinoவின் புதிய பதிப்பு கிடைக்கிறது,\n" +"நீங்கள் Arduino பதிவிறக்க பக்கத்தை காண விரும்புகிறீர்களா?" #: UpdateCheck.java:108 Preferences.java:76 msgid "Yes" -msgstr "ஆம்" +msgstr "ஆம்" #: UpdateCheck.java:108 Preferences.java:77 msgid "No" -msgstr "இல்லை" +msgstr "இல்லை" #: UpdateCheck.java:111 msgid "Update" -msgstr "புதிய பதிப்பை தேடு" +msgstr "புதிய பதிப்பை தேடு" #: UpdateCheck.java:118 msgid "http://www.arduino.cc/en/Main/Software" -msgstr "http://www.arduino.cc/en/Main/Software" +msgstr "http://www.arduino.cc/en/Main/Software" #: FindReplace.java:80 msgid "Find:" -msgstr "கண்டுபிடி:" +msgstr "கண்டுபிடி:" #: FindReplace.java:81 msgid "Replace with:" -msgstr "இதாக மாற்று:" +msgstr "இதாக மாற்று:" #: FindReplace.java:96 msgid "Ignore Case" -msgstr "வேற்றுமையை அலட்சியப்படுத்து" +msgstr "வேற்றுமையை அலட்சியப்படுத்து" #: FindReplace.java:105 msgid "Wrap Around" -msgstr "சுற்றி கட்டு" +msgstr "சுற்றி கட்டு" #: FindReplace.java:120 FindReplace.java:131 msgid "Replace All" -msgstr "அனைத்தையும் மாற்றிடு" +msgstr "அனைத்தையும் மாற்றிடு" #: FindReplace.java:121 FindReplace.java:130 Sketch.java:1050 msgid "Replace" -msgstr "மாற்று" +msgstr "மாற்று" #: FindReplace.java:122 FindReplace.java:129 msgid "Replace & Find" -msgstr "மாற்றிவிட்டு தேடு" +msgstr "மாற்றிவிட்டு தேடு" #: FindReplace.java:123 FindReplace.java:128 msgid "Previous" -msgstr "முந்திய" +msgstr "முந்திய" #: FindReplace.java:124 FindReplace.java:127 msgid "Find" -msgstr "கண்டுபிடி" +msgstr "கண்டுபிடி" #: SerialMonitor.java:93 msgid "Send" -msgstr "அனுப்பு" +msgstr "அனுப்பு" #: SerialMonitor.java:110 msgid "Autoscroll" -msgstr "சுய உருள்" +msgstr "சுய உருள்" #: SerialMonitor.java:112 msgid "No line ending" -msgstr "வரி முடிவு இல்லை" +msgstr "வரி முடிவு இல்லை" #: SerialMonitor.java:112 msgid "Newline" -msgstr "புது வரி" +msgstr "புது வரி" #: SerialMonitor.java:112 msgid "Carriage return" -msgstr "புதுவரி திரும்பி" +msgstr "புதுவரி திரும்பி" #: SerialMonitor.java:112 msgid "Both NL & CR" -msgstr "NL மற்றும் CR" +msgstr "NL மற்றும் CR" #: SerialMonitor.java:130 SerialMonitor.java:133 msgid " baud" -msgstr " ஒலிபரப்பு வேகம்" +msgstr " ஒலிபரப்பு வேகம்" #: Serial.java:147 #, java-format msgid "" "Serial port ''{0}'' already in use. Try quiting any programs that may be " "using it." -msgstr "" -"தொடர்நிலை துறை ''{0}'' ஏற்கனவே பயன்பாட்டிலுள்ளது. அதை பயன்படுத்தும் வேறு நிரலை அணைத்துவிட்டு " -"முயற்சிக்கவும்." +msgstr "" +"தொடர்நிலை துறை ''{0}'' ஏற்கனவே பயன்பாட்டிலுள்ளது. அதை பயன்படுத்தும் வேறு நிரலை அணைத்துவிட்டு " +"முயற்சிக்கவும்." #: Serial.java:154 #, java-format msgid "Error opening serial port ''{0}''." -msgstr "தொடர்நிலை துறை ''{0}''யை திறப்பதில் பிழை ஏற்பட்டுவிட்டது." +msgstr "தொடர்நிலை துறை ''{0}''யை திறப்பதில் பிழை ஏற்பட்டுவிட்டது." #: Serial.java:167 #, java-format msgid "" "Serial port ''{0}'' not found. Did you select the right one from the Tools > " "Serial Port menu?" -msgstr "" -"தொடர்நிலை துறை ''{0}''யை காணவில்லை. நீங்கள் சரியானதை கருவிகள் > தொடர்நிலை துறை பட்டியலில் தேர்வு செய்தீர்களா?" +msgstr "" +"தொடர்நிலை துறை ''{0}''யை காணவில்லை. நீங்கள் சரியானதை கருவிகள் > தொடர்நிலை துறை பட்டியலில் தேர்வு செய்தீர்களா?" #: Serial.java:424 #, java-format msgid "" "readBytesUntil() byte buffer is too small for the {0} bytes up to and " "including char {1}" -msgstr "" -"readBytesUntil() எண்பிட்டு அணை {0} எண்பிட்டுகளுக்கு மிக குறைவாக உள்ளது " -"char {1} உடன் சேற்று" +msgstr "" +"readBytesUntil() எண்பிட்டு அணை {0} எண்பிட்டுகளுக்கு மிக குறைவாக உள்ளது " +"char {1} உடன் சேற்று" #: Serial.java:567 #, java-format msgid "Error inside Serial.{0}()" -msgstr "தொடர்நிலை.{0}()க்குள் பிழை உள்ளது" +msgstr "தொடர்நிலை.{0}()க்குள் பிழை உள்ளது" #: tools/AutoFormat.java:91 msgid "Auto Format" -msgstr "சுய வடிவம்" +msgstr "சுய வடிவம்" #: tools/AutoFormat.java:913 tools/format/src/AutoFormat.java:54 msgid "No changes necessary for Auto Format." -msgstr "சுய வடிவத்திற்கு எந்த மாற்றங்களும் தேவையில்லை." +msgstr "சுய வடிவத்திற்கு எந்த மாற்றங்களும் தேவையில்லை." #: tools/AutoFormat.java:919 msgid "Auto Format Canceled: Too many right parentheses." -msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான வலது குறியீடுகள்." +msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான வலது குறியீடுகள்." #: tools/AutoFormat.java:922 msgid "Auto Format Canceled: Too many left parentheses." -msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான இடது குறியீடுகள்." +msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான இடது குறியீடுகள்." #: tools/AutoFormat.java:928 msgid "Auto Format Canceled: Too many right curly braces." -msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான வலது வளைவு குறியீடுகள்." +msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான வலது வளைவு குறியீடுகள்." #: tools/AutoFormat.java:931 msgid "Auto Format Canceled: Too many left curly braces." -msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான இடது வளைவு குறியீடுகள்." +msgstr "சுய வடிவம் ரத்து செய்யப்பட்டது: மிக அதிகமான இடது வளைவு குறியீடுகள்." #: tools/AutoFormat.java:941 msgid "Auto Format finished." -msgstr "சுய வடிவம் முடிந்தது." +msgstr "சுய வடிவம் முடிந்தது." #: tools/FixEncoding.java:41 tools/FixEncoding.java:58 #: tools/FixEncoding.java:79 msgid "Fix Encoding & Reload" -msgstr "குறியீட்டை சரி செய்துவிட்டு ஏற்றவும்" +msgstr "குறியீட்டை சரி செய்துவிட்டு ஏற்றவும்" #: tools/FixEncoding.java:57 msgid "Discard all changes and reload sketch?" -msgstr "அணைத்து மாற்றங்களையும் ஒதிக்கிவிட்டு வரைவை ஏற்றவா?" +msgstr "அணைத்து மாற்றங்களையும் ஒதிக்கிவிட்டு வரைவை ஏற்றவா?" #: tools/FixEncoding.java:77 msgid "" "An error occurred while trying to fix the file encoding.\n" "Do not attempt to save this sketch as it may overwrite\n" "the old version. Use Open to re-open the sketch and try again.\n" -msgstr "" -"கோப்பு குறியீட்டை சரிசெய்ய முயலும்போது ஒரு பிழை ஏற்பட்டுவிட்டது.\n" -"இந்திய வரைவை சேமிக்க முயலவேண்டாம். ஏனென்றால், அது பழைய பதிப்பை \n" -"மற்றியமைத்துவிடும். வரைவை மறுபடியும் திறந்து முயற்சித்துப்பார்க்கவும்.\n" +msgstr "" +"கோப்பு குறியீட்டை சரிசெய்ய முயலும்போது ஒரு பிழை ஏற்பட்டுவிட்டது.\n" +"இந்திய வரைவை சேமிக்க முயலவேண்டாம். ஏனென்றால், அது பழைய பதிப்பை \n" +"மற்றியமைத்துவிடும். வரைவை மறுபடியும் திறந்து முயற்சித்துப்பார்க்கவும்.\n" #: tools/Archiver.java:48 msgid "Archive Sketch" -msgstr "வரைவை ஆவணப்படுத்தவும்" +msgstr "வரைவை ஆவணப்படுத்தவும்" #: tools/Archiver.java:59 msgid "yyMMdd" -msgstr "yyMMdd" +msgstr "yyMMdd" #: tools/Archiver.java:74 msgid "Couldn't archive sketch" -msgstr "வரைவை ஆவணப்படுத்த முடியவில்லை" +msgstr "வரைவை ஆவணப்படுத்த முடியவில்லை" #: tools/Archiver.java:75 msgid "" "Archiving the sketch has been canceled because\n" "the sketch couldn't save properly." -msgstr "" -"வரைவை ஆவணப்படுத்துவது ரத்து செய்யப்பட்டது. ஏனென்றால், \n" -"அந்த வரைவை சரியாக சேமிக்க முடியவில்லை." +msgstr "" +"வரைவை ஆவணப்படுத்துவது ரத்து செய்யப்பட்டது. ஏனென்றால், \n" +"அந்த வரைவை சரியாக சேமிக்க முடியவில்லை." #: tools/Archiver.java:109 msgid "Archive sketch as:" -msgstr "என வரைவை அவனப்படுது:" +msgstr "என வரைவை அவனப்படுது:" #: tools/Archiver.java:139 msgid "Archive sketch canceled." -msgstr "வரைவை ஆவணப்படுத்துவது ரத்து செய்யப்பட்டது." +msgstr "வரைவை ஆவணப்படுத்துவது ரத்து செய்யப்பட்டது." #: SketchCode.java:83 #, java-format msgid "Error while loading code {0}" -msgstr "குறியீடு {0}ஐ மேலேற்றும்போது பிழை ஏற்பட்டுவிட்டது " +msgstr "குறியீடு {0}ஐ மேலேற்றும்போது பிழை ஏற்பட்டுவிட்டது " #: SketchCode.java:258 #, java-format @@ -651,145 +651,145 @@ msgstr "" #: Sketch.java:278 Sketch.java:307 Sketch.java:581 Sketch.java:970 msgid "Sketch is Read-Only" -msgstr "வாசிப்பு வரைவு" +msgstr "வாசிப்பு வரைவு" #: Sketch.java:279 Sketch.java:308 Sketch.java:582 Sketch.java:971 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save the sketch in another location,\n" "and try again." -msgstr "" -"சில கோப்புகள் \"read-only\" என குறிக்கப்பட்டுள்ளது,எனவே நீங்கள் \n" -"வேறு இடத்தில வரைவை மறுபடியும் சேமிக்கவும்,\n" -"பின்பு முயற்சிக்கவும்." +msgstr "" +"சில கோப்புகள் \"read-only\" என குறிக்கப்பட்டுள்ளது,எனவே நீங்கள் \n" +"வேறு இடத்தில வரைவை மறுபடியும் சேமிக்கவும்,\n" +"பின்பு முயற்சிக்கவும்." #: Sketch.java:286 msgid "Name for new file:" -msgstr "புதிய கோப்பின் பெயர்:" +msgstr "புதிய கோப்பின் பெயர்:" #: Sketch.java:298 msgid "Sketch is Untitled" -msgstr "வரைவு பெயரிடப்படவில்லை" +msgstr "வரைவு பெயரிடப்படவில்லை" #: Sketch.java:299 msgid "" "How about saving the sketch first \n" "before trying to rename it?" -msgstr "" -"பெயரை மாற்றும் முன் வரைவை \n" -"சேமிப்பது பற்றி என்ன நினைக்கிறீர்கள்?" +msgstr "" +"பெயரை மாற்றும் முன் வரைவை \n" +"சேமிப்பது பற்றி என்ன நினைக்கிறீர்கள்?" #: Sketch.java:359 Sketch.java:366 Sketch.java:377 msgid "Problem with rename" -msgstr "பெயர்மாற்றத்தில் பிரச்சனை எழுந்துள்ளது" +msgstr "பெயர்மாற்றத்தில் பிரச்சனை எழுந்துள்ளது" #: Sketch.java:360 msgid "The name cannot start with a period." -msgstr "பெயர் முற்றுப்புள்ளி கொண்டு ஆரம்பிக்கக்கூடாது." +msgstr "பெயர் முற்றுப்புள்ளி கொண்டு ஆரம்பிக்கக்கூடாது." #: Sketch.java:368 #, java-format msgid "\".{0}\" is not a valid extension." -msgstr "\".{0}\" சரியான நீடிப்பு கிடையாது." +msgstr "\".{0}\" சரியான நீடிப்பு கிடையாது." #: Sketch.java:378 msgid "" "The main file can't use an extension.\n" "(It may be time for your to graduate to a\n" "\"real\" programming environment)" -msgstr "" -"முக்கிய கோப்பு ஒரு நீட்டிப்பை பயன்படுத்த முடியாது.\n" -"(இந்த நேரம் நீங்கள் நிரலாக்க சூழல்\n" -"\"real\"ஐ பயன்படுத்த ஏதுவானது)" +msgstr "" +"முக்கிய கோப்பு ஒரு நீட்டிப்பை பயன்படுத்த முடியாது.\n" +"(இந்த நேரம் நீங்கள் நிரலாக்க சூழல்\n" +"\"real\"ஐ பயன்படுத்த ஏதுவானது)" #: Sketch.java:400 Sketch.java:414 Sketch.java:423 Sketch.java:863 msgid "Nope" -msgstr "இல்லை" +msgstr "இல்லை" #: Sketch.java:402 #, java-format msgid "A file named \"{0}\" already exists in \"{1}\"" -msgstr "\"{1}\"ல் ஏற்கனவே \"{0}\" என்ற பேரில் கோப்பு உள்ளது" +msgstr "\"{1}\"ல் ஏற்கனவே \"{0}\" என்ற பேரில் கோப்பு உள்ளது" #: Sketch.java:415 msgid "You can't have a .cpp file with the same name as the sketch." -msgstr "நீங்கள் வரைவின் பெயரிலேயே .cpp கோப்பை உருவாக்க முடியாது." +msgstr "நீங்கள் வரைவின் பெயரிலேயே .cpp கோப்பை உருவாக்க முடியாது." #: Sketch.java:425 msgid "" "You can't rename the sketch to \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" -"நீங்கள் \"{0}\" என்று வரைவை பெயர்மாற்றம் செய்ய முடியாது\n" -"ஏனென்றால் அந்த வரைவு ஏற்கனவே அதே பெயரில் ஒரு .cpp கோப்பை கொண்டுள்ளது." +msgstr "" +"நீங்கள் \"{0}\" என்று வரைவை பெயர்மாற்றம் செய்ய முடியாது\n" +"ஏனென்றால் அந்த வரைவு ஏற்கனவே அதே பெயரில் ஒரு .cpp கோப்பை கொண்டுள்ளது." #: Sketch.java:459 msgid "Cannot Rename" -msgstr "மறுபெயரிட முடியாது" +msgstr "மறுபெயரிட முடியாது" #: Sketch.java:461 #, java-format msgid "Sorry, a sketch (or folder) named \"{0}\" already exists." -msgstr "மன்னிக்கவும், \"{0}\"என்று ஏற்கனவே ஒரு வரைவு (அல்லது உறை) உள்ளது." +msgstr "மன்னிக்கவும், \"{0}\"என்று ஏற்கனவே ஒரு வரைவு (அல்லது உறை) உள்ளது." #: Sketch.java:479 msgid "Could not rename the sketch. (0)" -msgstr "வரைவை மருபெயரிட முடியவில்லை. (0)" +msgstr "வரைவை மருபெயரிட முடியவில்லை. (0)" #: Sketch.java:487 Sketch.java:532 #, java-format msgid "Could not rename \"{0}\" to \"{1}\"" -msgstr "\"{0}\"ஐ \"{1}\"என மருபெயரிட முடியவில்லை " +msgstr "\"{0}\"ஐ \"{1}\"என மருபெயரிட முடியவில்லை " #: Sketch.java:500 msgid "Could not rename the sketch. (1)" -msgstr "வரைவை மருபெயரிட முடியவில்லை. (1)" +msgstr "வரைவை மருபெயரிட முடியவில்லை. (1)" #: Sketch.java:507 msgid "Could not rename the sketch. (2)" -msgstr "வரைவை மருபெயரிட முடியவில்லை. (2)" +msgstr "வரைவை மருபெயரிட முடியவில்லை. (2)" #: Sketch.java:544 msgid "createNewFile() returned false" -msgstr "createNewFile() தவறென கூறுகிறது" +msgstr "createNewFile() தவறென கூறுகிறது" #: Sketch.java:591 msgid "Are you sure you want to delete this sketch?" -msgstr "நீங்கள் இந்த வரைவை நீக்க வேண்டும் என்பதில் உறுதியாக இருக்கிறீர்களா?" +msgstr "நீங்கள் இந்த வரைவை நீக்க வேண்டும் என்பதில் உறுதியாக இருக்கிறீர்களா?" #: Sketch.java:592 #, java-format msgid "Are you sure you want to delete \"{0}\"?" -msgstr "நீங்கள் \"{0}\"ஐ நீக்க வேண்டும் என்பதில் உறுதியாக இருக்கிறீர்களா?" +msgstr "நீங்கள் \"{0}\"ஐ நீக்க வேண்டும் என்பதில் உறுதியாக இருக்கிறீர்களா?" #: Sketch.java:595 EditorHeader.java:314 msgid "Delete" -msgstr "நீக்கு" +msgstr "நீக்கு" #: Sketch.java:620 msgid "Couldn't do it" -msgstr "அதை செய்ய முடியவில்லை" +msgstr "அதை செய்ய முடியவில்லை" #: Sketch.java:621 #, java-format msgid "Could not delete \"{0}\"." -msgstr "\"{0}\"ஐ நீக்க முடியவில்லை." +msgstr "\"{0}\"ஐ நீக்க முடியவில்லை." #: Sketch.java:651 msgid "removeCode: internal error.. could not find code" -msgstr "removeCode: உள் பிழை .. குறியீட்டை கண்டுபிடிக்க முடியவில்லை" +msgstr "removeCode: உள் பிழை .. குறியீட்டை கண்டுபிடிக்க முடியவில்லை" #: Sketch.java:724 msgid "Sketch is read-only" -msgstr "வரைவை வாசிக்க மட்டுமே முடியும்" +msgstr "வரைவை வாசிக்க மட்டுமே முடியும்" #: Sketch.java:725 msgid "" "Some files are marked \"read-only\", so you'll\n" "need to re-save this sketch to another location." -msgstr "" -"சில கோப்புகள் \"read-only\" என குறிப்பிடப்பட்டுள்ளது, எனவே \n" -"நீங்கள் மற்றொரு இடத்தில் இந்த வரைவை மீண்டும் சேமிக்க வேண்டும்." +msgstr "" +"சில கோப்புகள் \"read-only\" என குறிப்பிடப்பட்டுள்ளது, எனவே \n" +"நீங்கள் மற்றொரு இடத்தில் இந்த வரைவை மீண்டும் சேமிக்க வேண்டும்." #: Sketch.java:743 msgid "" @@ -800,219 +800,219 @@ msgid "" "disable this in the Preferences dialog.\n" "\n" "Save sketch and update its extension?" -msgstr "" -"Arduino 1.0ல் ,.pdeல் இருந்து .inoவுக்கு முன்னிருப்பு கோப்பு நீட்டிப்பு \n" -"மாறிவிட்டது. புதிய வரைவுகள் (\"Save-As\" உருவாக்கியவை உட்பட),\n" -"புதிய நீட்டிப்பை பயன்படுத்தும். The extension\n" -"தற்போதுள்ள வரைவுகளின் நீட்டிப்பு செமிதவுடன் புதுப்பிக்கப்படும், ஆனால் நீங்கள்\n" -"இதை விருப்பங்கள் உரையாடலில் செயலிழக்க செய்யலாம்.\n" -"\n" -"வரைவை சேமித்து, அதன் நீட்டிப்பை புதுப்பிக்கவா?" +msgstr "" +"Arduino 1.0ல் ,.pdeல் இருந்து .inoவுக்கு முன்னிருப்பு கோப்பு நீட்டிப்பு \n" +"மாறிவிட்டது. புதிய வரைவுகள் (\"Save-As\" உருவாக்கியவை உட்பட),\n" +"புதிய நீட்டிப்பை பயன்படுத்தும். The extension\n" +"தற்போதுள்ள வரைவுகளின் நீட்டிப்பு செமிதவுடன் புதுப்பிக்கப்படும், ஆனால் நீங்கள்\n" +"இதை விருப்பங்கள் உரையாடலில் செயலிழக்க செய்யலாம்.\n" +"\n" +"வரைவை சேமித்து, அதன் நீட்டிப்பை புதுப்பிக்கவா?" #: Sketch.java:750 msgid ".pde -> .ino" -msgstr ".pde -> .ino" +msgstr ".pde -> .ino" #: Sketch.java:829 msgid "Save sketch folder as..." -msgstr "என வரைவை கொப்புரையில் சேமிக்கவும்..." +msgstr "என வரைவை கொப்புரையில் சேமிக்கவும்..." #: Sketch.java:865 msgid "" "You can't save the sketch as \"{0}\"\n" "because the sketch already has a .cpp file with that name." -msgstr "" -"\"{0}\" என வரைவை நீங்கள் சேமிக்க முடியாது\n" -"ஏனென்றால், ஏற்கனவே அந்தப்பெயரில் .cpp கோப்பு உள்ளது." +msgstr "" +"\"{0}\" என வரைவை நீங்கள் சேமிக்க முடியாது\n" +"ஏனென்றால், ஏற்கனவே அந்தப்பெயரில் .cpp கோப்பு உள்ளது." #: Sketch.java:886 msgid "How very Borges of you" -msgstr "நீங்கள் மிகவும் திறமைசாலி" +msgstr "நீங்கள் மிகவும் திறமைசாலி" #: Sketch.java:887 msgid "" "You cannot save the sketch into a folder\n" "inside itself. This would go on forever." -msgstr "" -"நீங்கள் வரைவுக்குள் உள்ள உறையிலேயே அந்த வரைவை சேமிக்க\n" -"முடியாது. இது நீண்டுகொண்டே போகும்." +msgstr "" +"நீங்கள் வரைவுக்குள் உள்ள உறையிலேயே அந்த வரைவை சேமிக்க\n" +"முடியாது. இது நீண்டுகொண்டே போகும்." #: Sketch.java:979 msgid "Select an image or other data file to copy to your sketch" -msgstr "உங்கள் வரைவுக்குள் நகலெடுக்க ஒரு படத்தை அல்லது தரவு கோப்பை தேர்வு செய்யவும்" +msgstr "உங்கள் வரைவுக்குள் நகலெடுக்க ஒரு படத்தை அல்லது தரவு கோப்பை தேர்வு செய்யவும்" #: Sketch.java:1047 #, java-format msgid "Replace the existing version of {0}?" -msgstr "{0}வின் தற்போதைய பதிப்பை மாற்றவா?" +msgstr "{0}வின் தற்போதைய பதிப்பை மாற்றவா?" #: Sketch.java:1069 Sketch.java:1092 msgid "Error adding file" -msgstr "கோப்பை சேர்ப்பதில் பிழை" +msgstr "கோப்பை சேர்ப்பதில் பிழை" #: Sketch.java:1070 #, java-format msgid "Could not delete the existing ''{0}'' file." -msgstr "தற்போதுள்ள ''{0}'' கோப்பை நீக்க முடியவில்லை." +msgstr "தற்போதுள்ள ''{0}'' கோப்பை நீக்க முடியவில்லை." #: Sketch.java:1078 msgid "You can't fool me" -msgstr "நீங்கள் என்னை ஏமாற்ற முடியாது" +msgstr "நீங்கள் என்னை ஏமாற்ற முடியாது" #: Sketch.java:1079 msgid "" "This file has already been copied to the\n" "location from which where you're trying to add it.\n" "I ain't not doin nuthin'." -msgstr "" -"இந்த கோப்பு நீங்கள் நகலெடுக்க முயலும் இடத்தில் \n" -"ஏற்கனவே செர்கப்பட்டுவிட்டது.\n" -"நான் என்னால் முடிந்த அனைத்தையும் செய்துவிட்டேன்." +msgstr "" +"இந்த கோப்பு நீங்கள் நகலெடுக்க முயலும் இடத்தில் \n" +"ஏற்கனவே செர்கப்பட்டுவிட்டது.\n" +"நான் என்னால் முடிந்த அனைத்தையும் செய்துவிட்டேன்." #: Sketch.java:1093 #, java-format msgid "Could not add ''{0}'' to the sketch." -msgstr "''{0}''ஐ வரைவில் சேர்க்க முடியவில்லை." +msgstr "''{0}''ஐ வரைவில் சேர்க்க முடியவில்லை." #: Sketch.java:1393 Sketch.java:1424 msgid "Build folder disappeared or could not be written" -msgstr "கட்டுமான கோப்புறையை காணவில்லை (அ) எழுதப்பட்ட முடியவில்லை" +msgstr "கட்டுமான கோப்புறையை காணவில்லை (அ) எழுதப்பட்ட முடியவில்லை" #: Sketch.java:1408 msgid "Could not find main class" -msgstr "முக்கிய வகுப்பை கண்டுபிடிக்க முடியவில்லை" +msgstr "முக்கிய வகுப்பை கண்டுபிடிக்க முடியவில்லை" #: Sketch.java:1433 #, java-format msgid "Uncaught exception type: {0}" -msgstr "பிடிக்கமுடியாத விதிவிலக்கு வகை: {0}" +msgstr "பிடிக்கமுடியாத விதிவிலக்கு வகை: {0}" #: Sketch.java:1465 #, java-format msgid "Problem moving {0} to the build folder" -msgstr "{0}ஐ கட்டுமான உறைக்குள் நகற்றுவதில் பிரச்சினை" +msgstr "{0}ஐ கட்டுமான உறைக்குள் நகற்றுவதில் பிரச்சினை" #: Sketch.java:1661 msgid "Uploading..." -msgstr "பதிவேற்றுகிறது..." +msgstr "பதிவேற்றுகிறது..." #: Sketch.java:1684 #, java-format msgid "Binary sketch size: {0} bytes (of a {1} byte maximum)" -msgstr "இரும வரைவின் அளவு: {0} எண்பிட்டுகள் (அதிகபட்ச அளவு{1})" +msgstr "இரும வரைவின் அளவு: {0} எண்பிட்டுகள் (அதிகபட்ச அளவு{1})" #: Sketch.java:1689 msgid "Couldn't determine program size: {0}" -msgstr "நிரல் அளவை தீர்மானிக்க முடியவில்லை: {0}" +msgstr "நிரல் அளவை தீர்மானிக்க முடியவில்லை: {0}" #: Sketch.java:1694 msgid "" "Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for " "tips on reducing it." -msgstr "" -"வரைவின் பெரியதாக உள்ளது; அதை குறைப்பது பற்றிய வழிமுறைகளுக்கு,\n" -"http://www.arduino.cc/en/Guide/Troubleshooting#size%20%E0%AE%90%20%E0%AE%AA%E0%AE%BE%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AE%B5%E0%AF%81%E0%AE%AE%E0%AF%8D." +msgstr "" +"வரைவின் பெரியதாக உள்ளது; அதை குறைப்பது பற்றிய வழிமுறைகளுக்கு,\n" +"http://www.arduino.cc/en/Guide/Troubleshooting#size%20%E0%AE%90%20%E0%AE%AA%E0%AE%BE%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AE%B5%E0%AF%81%E0%AE%AE%E0%AF%8D." #: Sketch.java:1754 msgid "Missing the */ from the end of a /* comment */" -msgstr "/* comment */ல் */ஐ காணவில்லை" +msgstr "/* comment */ல் */ஐ காணவில்லை" #: Sketch.java:1796 msgid "Sketch Disappeared" -msgstr "வரைவு மறைந்துவிட்டது" +msgstr "வரைவு மறைந்துவிட்டது" #: Sketch.java:1797 msgid "" "The sketch folder has disappeared.\n" " Will attempt to re-save in the same location,\n" "but anything besides the code will be lost." -msgstr "" -"வரைவு உறை மறைந்துவிட்டது.\n" -" அதே இடத்தில சேமிக்க மறுபடியும் முயற்சிக்கிறேன்,\n" -"ஆனால், குறியீட்டை தவிர மற்றவைகளை இழந்துவிடுவீர்கள்." +msgstr "" +"வரைவு உறை மறைந்துவிட்டது.\n" +" அதே இடத்தில சேமிக்க மறுபடியும் முயற்சிக்கிறேன்,\n" +"ஆனால், குறியீட்டை தவிர மற்றவைகளை இழந்துவிடுவீர்கள்." #: Sketch.java:1810 msgid "Could not re-save sketch" -msgstr "வரைவை மறுபடியும் சேமிக்க இயலவில்லை" +msgstr "வரைவை மறுபடியும் சேமிக்க இயலவில்லை" #: Sketch.java:1811 msgid "" "Could not properly re-save the sketch. You may be in trouble at this point,\n" "and it might be time to copy and paste your code to another text editor." -msgstr "" -"சரியாக வரைவை மீண்டும் சேமிக்க முடியவில்லை. நீங்கள் இந்த இடத்தில் பிரச்சனையில் இருக்கலாம்,\n" -"இதுவே உங்கள் குறியீட்டை நகலெடுத்து மற்றொரு உரை திருத்தியில் ஓட்டுவதற்கான சரியான நேரம்." +msgstr "" +"சரியாக வரைவை மீண்டும் சேமிக்க முடியவில்லை. நீங்கள் இந்த இடத்தில் பிரச்சனையில் இருக்கலாம்,\n" +"இதுவே உங்கள் குறியீட்டை நகலெடுத்து மற்றொரு உரை திருத்தியில் ஓட்டுவதற்கான சரியான நேரம்." #: Sketch.java:2060 msgid "" "The sketch name had to be modified. Sketch names can only consist\n" "of ASCII characters and numbers (but cannot start with a number).\n" "They should also be less less than 64 characters long." -msgstr "" -"வரைவின் பெயர் மாற்றப்பட்டுள்ளது. வரைவுப்பெயர்கள் ASCII எழுத்துக்கள் \n" -"மற்றும் எண்களை கொண்டிருக்கலாம்(ஆனால் எண்ணில் ஆரம்பமாகக்கூடாது).\n" -"அவை 64 எழுத்துகளுக்கு மேல் இருக்கக்கூடாது." +msgstr "" +"வரைவின் பெயர் மாற்றப்பட்டுள்ளது. வரைவுப்பெயர்கள் ASCII எழுத்துக்கள் \n" +"மற்றும் எண்களை கொண்டிருக்கலாம்(ஆனால் எண்ணில் ஆரம்பமாகக்கூடாது).\n" +"அவை 64 எழுத்துகளுக்கு மேல் இருக்கக்கூடாது." #: debug/Uploader.java:52 msgid "https://developer.berlios.de/bugs/?group_id=3590" -msgstr "https://developer.berlios.de/bugs/?group_id=3590" +msgstr "https://developer.berlios.de/bugs/?group_id=3590" #: debug/Uploader.java:54 debug/Compiler.java:43 #, java-format msgid "Compiler error, please submit this code to {0}" -msgstr "தொகுப்பு பிழை, தயவு செய்து குறியீட்டை {0}க்கு சமர்பிக்கவும்" +msgstr "தொகுப்பு பிழை, தயவு செய்து குறியீட்டை {0}க்கு சமர்பிக்கவும்" #: debug/Uploader.java:199 #, java-format msgid "" "the selected serial port {0} does not exist or your board is not connected" -msgstr "" -"தேர்வு செய்த தொடர் துறை {0} இல்லை (அ)உங்கள் பலகை இணைக்கப்படவில்லை" +msgstr "" +"தேர்வு செய்த தொடர் துறை {0} இல்லை (அ)உங்கள் பலகை இணைக்கப்படவில்லை" #: debug/Uploader.java:203 msgid "" "Device is not responding, check the right serial port is selected or RESET " "the board right before exporting" -msgstr "" -"சாதனம் பதிலளிக்கவில்லை, சரியான தொடர் துறையை தேர்வு செய்யவும் (அ) ஏற்றுமதி செய்யும் முன்" -"பலகையை மீட்டமைக்கவும்" +msgstr "" +"சாதனம் பதிலளிக்கவில்லை, சரியான தொடர் துறையை தேர்வு செய்யவும் (அ) ஏற்றுமதி செய்யும் முன்" +"பலகையை மீட்டமைக்கவும்" #: debug/Uploader.java:209 msgid "" "Problem uploading to board. See http://www.arduino.cc/en/Guide/" "Troubleshooting#upload for suggestions." -msgstr "" -"பலகைக்கு பதிவேற்றம் செய்வதில் பிரச்சனை எழுந்துள்ளது. http://www.arduino.cc/en/Guide/" -"Troubleshooting#upload ஐ பரிந்துரைகளுக்கு பார்க்கவும்." +msgstr "" +"பலகைக்கு பதிவேற்றம் செய்வதில் பிரச்சனை எழுந்துள்ளது. http://www.arduino.cc/en/Guide/" +"Troubleshooting#upload ஐ பரிந்துரைகளுக்கு பார்க்கவும்." #: debug/Uploader.java:213 msgid "" "Wrong microcontroller found. Did you select the right board from the Tools " "> Board menu?" -msgstr "" -"தவறான நுண் கட்டுப்பாட்டுக் கருவி கண்டறியப்பட்டது.நீங்கள் சரியான பலகையை கருவிகள்" -"> பலகை பட்டியலில் தேர்வு செய்தீர்களா?" +msgstr "" +"தவறான நுண் கட்டுப்பாட்டுக் கருவி கண்டறியப்பட்டது.நீங்கள் சரியான பலகையை கருவிகள்" +"> பலகை பட்டியலில் தேர்வு செய்தீர்களா?" #: debug/Compiler.java:41 msgid "http://code.google.com/p/arduino/issues/list" -msgstr "http://code.google.com/p/arduino/issues/list" +msgstr "http://code.google.com/p/arduino/issues/list" #: debug/Compiler.java:79 msgid "No board selected; please choose a board from the Tools > Board menu." -msgstr "பலகை தேர்வு செய்யப்படவில்லை; ஒரு பலகையை கருவிகள் > பலகை பட்டியலில் தேர்வு செய்யவும்." +msgstr "பலகை தேர்வு செய்யப்படவில்லை; ஒரு பலகையை கருவிகள் > பலகை பட்டியலில் தேர்வு செய்யவும்." #: debug/Compiler.java:422 #, java-format msgid "{0} returned {1}" -msgstr "{0},{1}என திருப்பியது" +msgstr "{0},{1}என திருப்பியது" #: debug/Compiler.java:426 msgid "Error compiling." -msgstr "தொகுப்பதில் பிழை." +msgstr "தொகுப்பதில் பிழை." #: debug/Compiler.java:465 msgid "Please import the SPI library from the Sketch > Import Library menu." -msgstr "SPI நூலகத்தை வரைவு > நூலக இறக்குமதி பட்டியலில் இருந்து இறக்குமதி செய்யவும்." +msgstr "SPI நூலகத்தை வரைவு > நூலக இறக்குமதி பட்டியலில் இருந்து இறக்குமதி செய்யவும்." #: debug/Compiler.java:466 msgid "" @@ -1021,16 +1021,16 @@ msgid "" "You appear to be using it or another library that depends on the SPI " "library.\n" "\n" -msgstr "" -"\n" -"Arduino 0019வின் படி, ஈதர்நெட் நூலகம் SPI நூலகத்தையே சார்ந்துள்ளது.\n" -"நீங்கள் அந்த நூலகம் (அ) அதை சார்ந்துள்ள நூலகத்தையே " -"பயன்படுத்துகிறீர்கள்.\n" -"\n" +msgstr "" +"\n" +"Arduino 0019வின் படி, ஈதர்நெட் நூலகம் SPI நூலகத்தையே சார்ந்துள்ளது.\n" +"நீங்கள் அந்த நூலகம் (அ) அதை சார்ந்துள்ள நூலகத்தையே " +"பயன்படுத்துகிறீர்கள்.\n" +"\n" #: debug/Compiler.java:471 msgid "The 'BYTE' keyword is no longer supported." -msgstr "'BYTE' குறிச்சொல் இனிமேல் உபயோகப்படாது." +msgstr "'BYTE' குறிச்சொல் இனிமேல் உபயோகப்படாது." #: debug/Compiler.java:472 msgid "" @@ -1038,15 +1038,15 @@ msgid "" "As of Arduino 1.0, the 'BYTE' keyword is no longer supported.\n" "Please use Serial.write() instead.\n" "\n" -msgstr "" -"\n" -"Arduino 1.0ன் படி, 'BYTE' குறிச்சொல் இனிமேல் உபயோகப்படாது.\n" -" Serial.write()ஐ அதற்கு மாற்றாக பயன்படுத்தவும்.\n" -"\n" +msgstr "" +"\n" +"Arduino 1.0ன் படி, 'BYTE' குறிச்சொல் இனிமேல் உபயோகப்படாது.\n" +" Serial.write()ஐ அதற்கு மாற்றாக பயன்படுத்தவும்.\n" +"\n" #: debug/Compiler.java:477 msgid "The Server class has been renamed EthernetServer." -msgstr "Server class, EthernetServer என பெயர்மாற்றப்பட்டுள்ளது." +msgstr "Server class, EthernetServer என பெயர்மாற்றப்பட்டுள்ளது." #: debug/Compiler.java:478 msgid "" @@ -1054,15 +1054,15 @@ msgid "" "As of Arduino 1.0, the Server class in the Ethernet library has been renamed " "to EthernetServer.\n" "\n" -msgstr "" -"\n" -"Arduino 1.0ன் படி, ஈதர்நெட் நூலகத்தில் உள்ள Server class, EthernetServer என \n" -"பெயர்மாற்றப்பட்டுள்ளது.\n" -"\n" +msgstr "" +"\n" +"Arduino 1.0ன் படி, ஈதர்நெட் நூலகத்தில் உள்ள Server class, EthernetServer என \n" +"பெயர்மாற்றப்பட்டுள்ளது.\n" +"\n" #: debug/Compiler.java:483 msgid "The Client class has been renamed EthernetClient." -msgstr "Client class, EthernetClient என பெயர்மாற்றப்பட்டுள்ளது." +msgstr "Client class, EthernetClient என பெயர்மாற்றப்பட்டுள்ளது." #: debug/Compiler.java:484 msgid "" @@ -1070,15 +1070,15 @@ msgid "" "As of Arduino 1.0, the Client class in the Ethernet library has been renamed " "to EthernetClient.\n" "\n" -msgstr "" -"\n" -"Arduino 1.0ன் படி, ஈதர்நெட் நூலகத்தில் உள்ள Client class, EthernetClient என \n" -"பெயர்மாற்றப்பட்டுள்ளது.\n" -"\n" +msgstr "" +"\n" +"Arduino 1.0ன் படி, ஈதர்நெட் நூலகத்தில் உள்ள Client class, EthernetClient என \n" +"பெயர்மாற்றப்பட்டுள்ளது.\n" +"\n" #: debug/Compiler.java:489 msgid "The Udp class has been renamed EthernetUdp." -msgstr "Udp class, EthernetUdp என பெயர்மாற்றப்பட்டுள்ளது." +msgstr "Udp class, EthernetUdp என பெயர்மாற்றப்பட்டுள்ளது." #: debug/Compiler.java:490 msgid "" @@ -1086,15 +1086,15 @@ msgid "" "As of Arduino 1.0, the Udp class in the Ethernet library has been renamed to " "EthernetClient.\n" "\n" -msgstr "" -"\n" -"Arduino 1.0ன் படி, ஈதர்நெட் நூலகத்தில் உள்ள Udp class, EthernetUdp என \n" -"பெயர்மாற்றப்பட்டுள்ளது.\n" -"\n" +msgstr "" +"\n" +"Arduino 1.0ன் படி, ஈதர்நெட் நூலகத்தில் உள்ள Udp class, EthernetUdp என \n" +"பெயர்மாற்றப்பட்டுள்ளது.\n" +"\n" #: debug/Compiler.java:495 msgid "Wire.send() has been renamed Wire.write()." -msgstr "Wire.send(), Wire.write() என பெயர்மாற்றப்பட்டுள்ளது." +msgstr "Wire.send(), Wire.write() என பெயர்மாற்றப்பட்டுள்ளது." #: debug/Compiler.java:496 msgid "" @@ -1102,15 +1102,15 @@ msgid "" "As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for " "consistency with other libraries.\n" "\n" -msgstr "" -"\n" -"Arduino 1.0ன் படி, Wire.send() செயல்கூறு, Wire.write() என \n" -"நிலைத்தன்மைக்காக பெயர்மாற்றப்பட்டுள்ளது.\n" -"\n" +msgstr "" +"\n" +"Arduino 1.0ன் படி, Wire.send() செயல்கூறு, Wire.write() என \n" +"நிலைத்தன்மைக்காக பெயர்மாற்றப்பட்டுள்ளது.\n" +"\n" #: debug/Compiler.java:501 msgid "Wire.receive() has been renamed Wire.read()." -msgstr "Wire.receive(), Wire.read() என பெயர்மாற்றப்பட்டுள்ளது" +msgstr "Wire.receive(), Wire.read() என பெயர்மாற்றப்பட்டுள்ளது" #: debug/Compiler.java:502 msgid "" @@ -1118,61 +1118,61 @@ msgid "" "As of Arduino 1.0, the Wire.receive() function was renamed to Wire.read() " "for consistency with other libraries.\n" "\n" -msgstr "" -"\n" -"Arduino 1.0ன் படி, Wire.receive() செயல்கூறு, Wire.read() என \n" -"நிலைத்தன்மைக்காக பெயர்மாற்றப்பட்டுள்ளது.\n" -"\n" +msgstr "" +"\n" +"Arduino 1.0ன் படி, Wire.receive() செயல்கூறு, Wire.read() என \n" +"நிலைத்தன்மைக்காக பெயர்மாற்றப்பட்டுள்ளது.\n" +"\n" #: EditorConsole.java:152 msgid "Console Error" -msgstr "பணியக பிழை" +msgstr "பணியக பிழை" #: EditorConsole.java:153 msgid "" "A problem occurred while trying to open the\n" "files used to store the console output." -msgstr "" -"பணியக வெளிப்பாடுகலை சேமிக்க பயன்படும் கோப்புகளை திறக்க \n" -"முயற்சிக்கும்போது பிரச்சனை ஏற்பட்டுவிட்டது." +msgstr "" +"பணியக வெளிப்பாடுகலை சேமிக்க பயன்படும் கோப்புகளை திறக்க \n" +"முயற்சிக்கும்போது பிரச்சனை ஏற்பட்டுவிட்டது." #: Base.java:184 msgid "Non-fatal error while setting the Look & Feel." -msgstr "தோற்றம் & உருவத்தை அமைக்கும்போது அபாயமில்லாத பிழை ஏற்பட்டுவிட்டது." +msgstr "தோற்றம் & உருவத்தை அமைக்கும்போது அபாயமில்லாத பிழை ஏற்பட்டுவிட்டது." #: Base.java:185 msgid "The error message follows, however Arduino should run fine." -msgstr "பிழை செய்திகள் வரும், ஆனாலும் Arduino நன்றாகவே இயங்கும்." +msgstr "பிழை செய்திகள் வரும், ஆனாலும் Arduino நன்றாகவே இயங்கும்." #: Base.java:220 msgid "Problem Setting the Platform" -msgstr "இயங்குதளம் அமைப்பதில் பிரச்சினை" +msgstr "இயங்குதளம் அமைப்பதில் பிரச்சினை" #: Base.java:221 msgid "" "An unknown error occurred while trying to load\n" "platform-specific code for your machine." -msgstr "" -"உங்கள் கணினிக்கு இயங்குதளம்-குறிப்பிட்ட குறியீட்டை ஏற்ற \n" -"முயற்சிக்கும்போது ஒரு அறியப்படாத பிழை ஏற்பட்டது." +msgstr "" +"உங்கள் கணினிக்கு இயங்குதளம்-குறிப்பிட்ட குறியீட்டை ஏற்ற \n" +"முயற்சிக்கும்போது ஒரு அறியப்படாத பிழை ஏற்பட்டது." #: Base.java:232 msgid "Please install JDK 1.5 or later" -msgstr "தயவுசெய்து JDK 1.5 (அ) புதியதை நிறுவவும்" +msgstr "தயவுசெய்து JDK 1.5 (அ) புதியதை நிறுவவும்" #: Base.java:233 msgid "" "Arduino requires a full JDK (not just a JRE)\n" "to run. Please install JDK 1.5 or later.\n" "More information can be found in the reference." -msgstr "" -"Arduinoவிற்கு முழு JDK தேவை (JRE மற்றும் கூடாது). \n" -"JDK 1.5 (அ) புதியதை நிறுவவும்.\n" -"மேலும் விவரங்களை குறிப்பில் காணலாம்." +msgstr "" +"Arduinoவிற்கு முழு JDK தேவை (JRE மற்றும் கூடாது). \n" +"JDK 1.5 (அ) புதியதை நிறுவவும்.\n" +"மேலும் விவரங்களை குறிப்பில் காணலாம்." #: Base.java:257 msgid "Sketchbook folder disappeared" -msgstr "வரைவுப்புத்தக உறை மறைந்துவிட்டது" +msgstr "வரைவுப்புத்தக உறை மறைந்துவிட்டது" #: Base.java:258 msgid "" @@ -1181,64 +1181,64 @@ msgid "" "location, and create a new sketchbook folder if\n" "necessary. Arduino will then stop talking about\n" "himself in the third person." -msgstr "" -"வரைவுறை இல்லை.\n" -"Arduino இயல்பான வரைவுப்புத்தக இடத்திற்கு மாறியபின்,\n" -"தேவைப்பட்டால் புதிய வரைவுப்புத்தக உறையை உருவாக்கும். \n" -"Arduino தன்னைபற்றியே மூன்றாவது மனிதன் போல \n" -"பேசுவதை நிறுத்திக்கொள்ளும்." +msgstr "" +"வரைவுறை இல்லை.\n" +"Arduino இயல்பான வரைவுப்புத்தக இடத்திற்கு மாறியபின்,\n" +"தேவைப்பட்டால் புதிய வரைவுப்புத்தக உறையை உருவாக்கும். \n" +"Arduino தன்னைபற்றியே மூன்றாவது மனிதன் போல \n" +"பேசுவதை நிறுத்திக்கொள்ளும்." #: Base.java:532 msgid "Time for a Break" -msgstr "இடைவேளைக்கான நேரம்" +msgstr "இடைவேளைக்கான நேரம்" #: Base.java:533 msgid "" "You've reached the limit for auto naming of new sketches\n" "for the day. How about going for a walk instead?" -msgstr "" -"நீங்கள் புதிய வரைவுகளை தானாக பெயரிடும் இன்றைய உச்சவரம்பை எட்டிவிட்டீர்கள்.\n" -" சிறிது நடைபயிற்சி மேற்கொள்ளலாமே!?" +msgstr "" +"நீங்கள் புதிய வரைவுகளை தானாக பெயரிடும் இன்றைய உச்சவரம்பை எட்டிவிட்டீர்கள்.\n" +" சிறிது நடைபயிற்சி மேற்கொள்ளலாமே!?" #: Base.java:537 msgid "Sunshine" -msgstr "சூர்யோதயம்" +msgstr "சூர்யோதயம்" #: Base.java:538 msgid "No really, time for some fresh air for you." -msgstr "இல்லை உண்மையாகவே, இது நீங்கள் புத்துணர்ச்சி பெறவேண்டிய நேரம்." +msgstr "இல்லை உண்மையாகவே, இது நீங்கள் புத்துணர்ச்சி பெறவேண்டிய நேரம்." #: Base.java:633 msgid "Open an Arduino sketch..." -msgstr "ஒரு Arduino வரைவை திறக்கவும்..." +msgstr "ஒரு Arduino வரைவை திறக்கவும்..." #: Base.java:772 msgid "" " Are you " "sure you want to Quit?

Closing the last open sketch will quit Arduino." -msgstr "" -" நீங்கள் நிச்சயமாக " -"வெளியேற விரும்புகிறீர்களா?

கடைசியாக திறந்த வரைவை மூடினால் Arduino அணைந்துவிடும்." +msgstr "" +" நீங்கள் நிச்சயமாக " +"வெளியேற விரும்புகிறீர்களா?

கடைசியாக திறந்த வரைவை மூடினால் Arduino அணைந்துவிடும்." #: Base.java:970 msgid "Contributed" -msgstr "பங்களிப்பு" +msgstr "பங்களிப்பு" #: Base.java:1095 msgid "Sketch Does Not Exist" -msgstr "வரைவு இல்லை" +msgstr "வரைவு இல்லை" #: Base.java:1096 msgid "" "The selected sketch no longer exists.\n" "You may need to restart Arduino to update\n" "the sketchbook menu." -msgstr "" -"தேர்ந்தெடுக்கப்பட்ட வரைவு இல்லை.\n" -"வரைவுப்புத்தக பட்டியலை புதுப்பிக்க Arduinoவை \n" -"மறுதுவக்கம் செய்யவும்." +msgstr "" +"தேர்ந்தெடுக்கப்பட்ட வரைவு இல்லை.\n" +"வரைவுப்புத்தக பட்டியலை புதுப்பிக்க Arduinoவை \n" +"மறுதுவக்கம் செய்யவும்." #: Base.java:1125 #, java-format @@ -1248,15 +1248,15 @@ msgid "" "(ASCII-only with no spaces, and it cannot start with a number).\n" "To get rid of this message, remove the sketch from\n" "{1}" -msgstr "" -"\"{0}\" வரைவை பயன்படுத்த முடியாது.\n" -"வரைவுப்பெயர்களில் அடிப்படை எழுத்துக்கள் மற்றும் எண்கள் மட்டுமே இருக்க வேண்டும்\n" -"(இடைவெளி இல்லாமல் ASCII மட்டும், இது எண்னில் ஆரம்பமாகக் கூடாது).\n" -"இந்த செய்தியில் இருந்து விடிவு பெற, {1}ல் இருந்து வரைவை நீக்கு" +msgstr "" +"\"{0}\" வரைவை பயன்படுத்த முடியாது.\n" +"வரைவுப்பெயர்களில் அடிப்படை எழுத்துக்கள் மற்றும் எண்கள் மட்டுமே இருக்க வேண்டும்\n" +"(இடைவெளி இல்லாமல் ASCII மட்டும், இது எண்னில் ஆரம்பமாகக் கூடாது).\n" +"இந்த செய்தியில் இருந்து விடிவு பெற, {1}ல் இருந்து வரைவை நீக்கு" #: Base.java:1132 msgid "Ignoring sketch with bad name" -msgstr "தவறான பெயர் கொண்ட வரைவை அளச்சியப்படுத்துகிறது" +msgstr "தவறான பெயர் கொண்ட வரைவை அளச்சியப்படுத்துகிறது" #: Base.java:1202 #, java-format @@ -1264,193 +1264,193 @@ msgid "" "The library \"{0}\" cannot be used.\n" "Library names must contain only basic letters and numbers.\n" "(ASCII only and no spaces, and it cannot start with a number)" -msgstr "" -"\"{0}\" நூலகத்தை பயன்படுத்த முடியவில்லை.\n" -"நூலக பெயர்களில் அடிப்படை எழுத்துக்கள் மற்றும் எண்கள் மட்டுமே இருக்க வேண்டும்.\n" -"(இடைவெளி இல்லாமல் ASCII மட்டும், இது எண்னில் ஆரம்பமாகக் கூடாது)" +msgstr "" +"\"{0}\" நூலகத்தை பயன்படுத்த முடியவில்லை.\n" +"நூலக பெயர்களில் அடிப்படை எழுத்துக்கள் மற்றும் எண்கள் மட்டுமே இருக்க வேண்டும்.\n" +"(இடைவெளி இல்லாமல் ASCII மட்டும், இது எண்னில் ஆரம்பமாகக் கூடாது)" #: Base.java:1207 msgid "Ignoring bad library name" -msgstr "தவறான நூலகப்பெயரை அலட்சியப்படுத்துகிறது" +msgstr "தவறான நூலகப்பெயரை அலட்சியப்படுத்துகிறது" #: Base.java:1432 msgid "Problem getting data folder" -msgstr "தரவு கோப்புறையை பெறுவதில் பிரச்சினை" +msgstr "தரவு கோப்புறையை பெறுவதில் பிரச்சினை" #: Base.java:1433 msgid "Error getting the Arduino data folder." -msgstr "Arduino தரவு கோப்புறையை பெறுவதில் பிழை." +msgstr "Arduino தரவு கோப்புறையை பெறுவதில் பிழை." #: Base.java:1440 msgid "Settings issues" -msgstr "அமைப்பு சிக்கல்கள்" +msgstr "அமைப்பு சிக்கல்கள்" #: Base.java:1441 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your settings." -msgstr "" -"Arduino இயங்க முடியவில்லை, ஏனென்றால் உங்கள் \n" -"அமைப்புகளை சேமிக்க ஒரு உறையை உருவாக்க முடியவில்லை." +msgstr "" +"Arduino இயங்க முடியவில்லை, ஏனென்றால் உங்கள் \n" +"அமைப்புகளை சேமிக்க ஒரு உறையை உருவாக்க முடியவில்லை." #: Base.java:1602 msgid "You forgot your sketchbook" -msgstr "நீங்கள் உங்கள் வரைவுப்புத்தகத்தை மறந்துவிட்டீர்கள்" +msgstr "நீங்கள் உங்கள் வரைவுப்புத்தகத்தை மறந்துவிட்டீர்கள்" #: Base.java:1603 msgid "" "Arduino cannot run because it could not\n" "create a folder to store your sketchbook." -msgstr "" -"Arduino இயங்கமுடியவில்லை ஏனென்றால்,\n" -"வரைவுப்புத்தகத்தை சேமிக்க உறையை உருவாக்கமுடியவில்லை." +msgstr "" +"Arduino இயங்கமுடியவில்லை ஏனென்றால்,\n" +"வரைவுப்புத்தகத்தை சேமிக்க உறையை உருவாக்கமுடியவில்லை." #: Base.java:1623 msgid "Select (or create new) folder for sketches..." -msgstr "வரைவுகளுக்கு உறையை தேர்வு செய்யவும் (அல்லது உருவாக்கவும்)..." +msgstr "வரைவுகளுக்கு உறையை தேர்வு செய்யவும் (அல்லது உருவாக்கவும்)..." #: Base.java:1647 msgid "Problem Opening URL" -msgstr "URLஐ திறப்பதில் பிரச்சனை எழுந்துள்ளது" +msgstr "URLஐ திறப்பதில் பிரச்சனை எழுந்துள்ளது" #: Base.java:1648 #, java-format msgid "" "Could not open the URL\n" "{0}" -msgstr "" -"URLஐ திறக்க முடியவில்லை\n" -"{0}" +msgstr "" +"URLஐ திறக்க முடியவில்லை\n" +"{0}" #: Base.java:1671 msgid "Problem Opening Folder" -msgstr "கோப்புறையை திறப்பதில் பிரச்சனை எழுந்துள்ளது" +msgstr "கோப்புறையை திறப்பதில் பிரச்சனை எழுந்துள்ளது" #: Base.java:1672 #, java-format msgid "" "Could not open the folder\n" "{0}" -msgstr "" -"கோப்புறையை திறக்க முடியவில்லை\n" -"{0}" +msgstr "" +"கோப்புறையை திறக்க முடியவில்லை\n" +"{0}" #: Base.java:1785 msgid "Guide_MacOSX.html" -msgstr "Guide_MacOSX.html" +msgstr "Guide_MacOSX.html" #: Base.java:1787 msgid "Guide_Windows.html" -msgstr "Guide_Windows.html" +msgstr "Guide_Windows.html" #: Base.java:1789 msgid "http://www.arduino.cc/playground/Learning/Linux" -msgstr "http://www.arduino.cc/playground/Learning/Linux" +msgstr "http://www.arduino.cc/playground/Learning/Linux" #: Base.java:1794 msgid "index.html" -msgstr "index.html" +msgstr "index.html" #: Base.java:1799 msgid "Guide_Environment.html" -msgstr "Guide_Environment.html" +msgstr "Guide_Environment.html" #: Base.java:1804 msgid "environment" -msgstr "சுற்றுச்சூழல்" +msgstr "சுற்றுச்சூழல்" #: Base.java:1804 msgid "platforms.html" -msgstr "platforms.html" +msgstr "platforms.html" #: Base.java:1809 msgid "Guide_Troubleshooting.html" -msgstr "Guide_Troubleshooting.html" +msgstr "Guide_Troubleshooting.html" #: Base.java:1814 msgid "FAQ.html" -msgstr "FAQ.html" +msgstr "FAQ.html" #: Base.java:1826 msgid "Message" -msgstr "தகவல்" +msgstr "தகவல்" #: Base.java:1842 msgid "Warning" -msgstr "எச்சரிக்கை" +msgstr "எச்சரிக்கை" #: Base.java:2196 #, java-format msgid "Could not remove old version of {0}" -msgstr "{0}வின் பழைய பதிப்பை அகற்ற முடியவில்லை" +msgstr "{0}வின் பழைய பதிப்பை அகற்ற முடியவில்லை" #: Base.java:2206 #, java-format msgid "Could not replace {0}" -msgstr "{0}வை மாற்ற முடியவில்லை" +msgstr "{0}வை மாற்ற முடியவில்லை" #: Base.java:2247 Base.java:2270 #, java-format msgid "Could not delete {0}" -msgstr "{0}ஐ நீக்க முடியவில்லை" +msgstr "{0}ஐ நீக்க முடியவில்லை" #: EditorHeader.java:292 msgid "New Tab" -msgstr "புதிய தாவல்" +msgstr "புதிய தாவல்" #: EditorHeader.java:300 msgid "Rename" -msgstr "மருபெயரிடுக" +msgstr "மருபெயரிடுக" #: EditorHeader.java:326 msgid "Previous Tab" -msgstr "முந்தைய தாவல்" +msgstr "முந்தைய தாவல்" #: EditorHeader.java:340 msgid "Next Tab" -msgstr "அடுத்த தாவல்" +msgstr "அடுத்த தாவல்" #: EditorToolbar.java:41 EditorToolbar.java:46 msgid "Verify" -msgstr "சரிபார்க்க" +msgstr "சரிபார்க்க" #: EditorToolbar.java:41 msgid "Open" -msgstr "திற" +msgstr "திற" #: EditorToolbar.java:46 msgid "New Editor Window" -msgstr "புதிய திருத்தி சாளரம்" +msgstr "புதிய திருத்தி சாளரம்" #: EditorToolbar.java:46 msgid "Open in Another Window" -msgstr "மற்றொரு சாளரத்தில் திற" +msgstr "மற்றொரு சாளரத்தில் திற" #: Platform.java:167 msgid "No launcher available" -msgstr "எந்த ஏவுதிரையும் கிட்டவில்லை" +msgstr "எந்த ஏவுதிரையும் கிட்டவில்லை" #: Platform.java:168 msgid "" "Unspecified platform, no launcher available.\n" "To enable opening URLs or folders, add a \n" "\"launcher=/path/to/app\" line to preferences.txt" -msgstr "" -"குறிப்பிடப்படாத இயங்குதளம், எந்த எவுதிரையும் இல்லை.\n" -"URL (அ) உரைகளை திறக்க, \n" -"\"launcher=/path/to/app\" என்ற வரியை preferences.txtல் சேர்க்கவும்" +msgstr "" +"குறிப்பிடப்படாத இயங்குதளம், எந்த எவுதிரையும் இல்லை.\n" +"URL (அ) உரைகளை திறக்க, \n" +"\"launcher=/path/to/app\" என்ற வரியை preferences.txtல் சேர்க்கவும்" #: Theme.java:52 msgid "" "Could not read color theme settings.\n" "You'll need to reinstall Processing." -msgstr "" -"வண்ண கரு அமைப்புகளை படிக்க முடியவில்லை.\n" -"நீங்கள் செயல்முறையை மீண்டும் நிறுவ வேண்டும்." +msgstr "" +"வண்ண கரு அமைப்புகளை படிக்க முடியவில்லை.\n" +"நீங்கள் செயல்முறையை மீண்டும் நிறுவ வேண்டும்." #: Preferences.java:80 msgid "Browse" -msgstr "உலவு" +msgstr "உலவு" #: Preferences.java:83 msgid "System Default" @@ -1466,11 +1466,11 @@ msgstr "" #: Preferences.java:86 msgid "Catalan" -msgstr "கடாலன்" +msgstr "கடாலன்" #: Preferences.java:87 msgid "Chinese Simplified" -msgstr "இலகு நடை சீனம் " +msgstr "இலகு நடை சீனம் " #: Preferences.java:88 msgid "Chinese Traditional" @@ -1478,15 +1478,15 @@ msgstr "" #: Preferences.java:89 msgid "Danish" -msgstr "டானியம்" +msgstr "டானியம்" #: Preferences.java:90 msgid "Dutch" -msgstr "உலாந்தியம்" +msgstr "உலாந்தியம்" #: Preferences.java:91 msgid "English" -msgstr "ஆங்கிலம்" +msgstr "ஆங்கிலம்" #: Preferences.java:92 msgid "Estonian" @@ -1494,27 +1494,27 @@ msgstr "" #: Preferences.java:93 msgid "French" -msgstr "பிரஞ்சு" +msgstr "பிரஞ்சு" #: Preferences.java:94 msgid "Filipino" -msgstr "ஃபிலிபினோ" +msgstr "ஃபிலிபினோ" #: Preferences.java:95 msgid "Galician" -msgstr "காலிசியன்" +msgstr "காலிசியன்" #: Preferences.java:96 msgid "German" -msgstr "ஜெர்மானியம்" +msgstr "ஜெர்மானியம்" #: Preferences.java:97 msgid "Greek" -msgstr "கிரேக்கம்" +msgstr "கிரேக்கம்" #: Preferences.java:98 msgid "Hungarian" -msgstr "ஹங்கேரியன்" +msgstr "ஹங்கேரியன்" #: Preferences.java:99 msgid "Indonesian" @@ -1522,11 +1522,11 @@ msgstr "" #: Preferences.java:100 msgid "Italian" -msgstr "இத்தாலியன்" +msgstr "இத்தாலியன்" #: Preferences.java:101 msgid "Japanese" -msgstr "ஜப்பனீஸ்" +msgstr "ஜப்பனீஸ்" #: Preferences.java:102 msgid "Korean" @@ -1534,7 +1534,7 @@ msgstr "" #: Preferences.java:103 msgid "Latvian" -msgstr "லேட்வியன்" +msgstr "லேட்வியன்" #: Preferences.java:104 msgid "Lithuaninan" @@ -1542,7 +1542,7 @@ msgstr "" #: Preferences.java:105 msgid "Persian" -msgstr "பர்ஸியன்" +msgstr "பர்ஸியன்" #: Preferences.java:106 msgid "Polish" @@ -1554,7 +1554,7 @@ msgstr "" #: Preferences.java:109 msgid "Romanian" -msgstr "ரோமானியம்" +msgstr "ரோமானியம்" #: Preferences.java:110 msgid "Russian" @@ -1562,41 +1562,41 @@ msgstr "" #: Preferences.java:111 msgid "Spanish" -msgstr "ஸ்பானியம்" +msgstr "ஸ்பானியம்" #: Preferences.java:210 msgid "" "Could not read default settings.\n" "You'll need to reinstall Arduino." -msgstr "" -"இயல்புநிலை அமைப்புகளை படிக்க முடியவில்லை.\n" -"நீங்கள் Arduinoவை மீண்டும் நிறுவ வேண்டும்." +msgstr "" +"இயல்புநிலை அமைப்புகளை படிக்க முடியவில்லை.\n" +"நீங்கள் Arduinoவை மீண்டும் நிறுவ வேண்டும்." #: Preferences.java:242 #, java-format msgid "Could not read preferences from {0}" -msgstr "{0}ல் இருந்து விருப்பங்களை படிக்க முடியவில்லை" +msgstr "{0}ல் இருந்து விருப்பங்களை படிக்க முடியவில்லை" #: Preferences.java:261 msgid "Error reading preferences" -msgstr "விருப்பங்களை படிப்பதில் பிழை" +msgstr "விருப்பங்களை படிப்பதில் பிழை" #: Preferences.java:263 #, java-format msgid "" "Error reading the preferences file. Please delete (or move)\n" "{0} and restart Arduino." -msgstr "" -"விருப்பக் கோப்பை படிப்பதில் பிழை. தயவு செய்து {0}வை அகற்றவும்((அ) நகற்றவும்)\n" -"பின்பு Arduinoவை மறுதொடக்கம் செய்யவும்." +msgstr "" +"விருப்பக் கோப்பை படிப்பதில் பிழை. தயவு செய்து {0}வை அகற்றவும்((அ) நகற்றவும்)\n" +"பின்பு Arduinoவை மறுதொடக்கம் செய்யவும்." #: Preferences.java:299 msgid "Sketchbook location:" -msgstr "வரைவுப்புத்தக இடம்:" +msgstr "வரைவுப்புத்தக இடம்:" #: Preferences.java:314 msgid "Select new sketchbook location" -msgstr "புதிய வரைவுப்புத்தக இடத்தை தேர்வு செய்யவும்" +msgstr "புதிய வரைவுப்புத்தக இடத்தை தேர்வு செய்யவும்" #: Preferences.java:337 msgid "Editor language: " @@ -1604,53 +1604,53 @@ msgstr "" #: Preferences.java:342 Preferences.java:358 msgid " (requires restart of Arduino)" -msgstr " (Arduino மறுதுவக்கம் தேவைப்படுகிறது)" +msgstr " (Arduino மறுதுவக்கம் தேவைப்படுகிறது)" #: Preferences.java:354 msgid "Editor font size: " -msgstr "திருத்தி எழுத்துரு அளவு: " +msgstr "திருத்தி எழுத்துரு அளவு: " #: Preferences.java:371 msgid "Show verbose output during: " -msgstr "இதன் போது வேர்போசு வெளியீட்டை காண்பிக்கவும்:" +msgstr "இதன் போது வேர்போசு வெளியீட்டை காண்பிக்கவும்:" #: Preferences.java:373 msgid "compilation " -msgstr "தொகுப்பு" +msgstr "தொகுப்பு" #: Preferences.java:375 msgid "upload" -msgstr "பதிவேற்று" +msgstr "பதிவேற்று" #: Preferences.java:384 msgid "Verify code after upload" -msgstr "பதிவேற்றியவுடன் குறியீட்டை சரிபார்க்கவும்" +msgstr "பதிவேற்றியவுடன் குறியீட்டை சரிபார்க்கவும்" #: Preferences.java:393 msgid "Use external editor" -msgstr "புற திருத்தியை பயன்படுத்துக" +msgstr "புற திருத்தியை பயன்படுத்துக" #: Preferences.java:403 msgid "Check for updates on startup" -msgstr "துவக்கும் போது புதுப்பிப்புகள் உள்ளதா என பார்" +msgstr "துவக்கும் போது புதுப்பிப்புகள் உள்ளதா என பார்" #: Preferences.java:412 msgid "Update sketch files to new extension on save (.pde -> .ino)" -msgstr "சேமிக்கும் பொது வரைவு கோப்புகளை புதிய நீட்டிப்புகளுக்கு புதுப்பிக்கவும் (.pde -> .ino)" +msgstr "சேமிக்கும் பொது வரைவு கோப்புகளை புதிய நீட்டிப்புகளுக்கு புதுப்பிக்கவும் (.pde -> .ino)" #: Preferences.java:423 msgid "Automatically associate .ino files with Arduino" -msgstr "தானாகவே .ino கோப்புகளை Arduinoவுடன் தொடர்பு படுத்தவும்" +msgstr "தானாகவே .ino கோப்புகளை Arduinoவுடன் தொடர்பு படுத்தவும்" #: Preferences.java:433 msgid "More preferences can be edited directly in the file" -msgstr "மேலும் விருப்பத்தேர்வுகளை நேரடியாக கோப்பில் திருத்தலாம்" +msgstr "மேலும் விருப்பத்தேர்வுகளை நேரடியாக கோப்பில் திருத்தலாம்" #: Preferences.java:462 msgid "(edit only when Arduino is not running)" -msgstr "(Arduino செயல்படாதபோது மாற்றம் மட்டுமே முடியும்)" +msgstr "(Arduino செயல்படாதபோது மாற்றம் மட்டுமே முடியும்)" #: Preferences.java:609 #, java-format msgid "ignoring invalid font size {0}" -msgstr "தவறான எழுத்துரு அளவை {0} அளச்சியப்படுத்துகிறது" +msgstr "தவறான எழுத்துரு அளவை {0} அளச்சியப்படுத்துகிறது" diff --git a/app/src/processing/app/i18n/Resources_ta.properties b/app/src/processing/app/i18n/Resources_ta.properties index 380f6ccc718..ceb762e52cc 100644 --- a/app/src/processing/app/i18n/Resources_ta.properties +++ b/app/src/processing/app/i18n/Resources_ta.properties @@ -1,8 +1,8 @@ -# Tamil translations for Arduino IDE package. -# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the Arduino IDE package. -# Ram Kumar.Y , 2012. -# +# Tamil translations for Arduino IDE package. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the Arduino IDE package. +# Ram Kumar.Y , 2012. +# !=Project-Id-Version\: PACKAGE VERSION\nReport-Msgid-Bugs-To\: \nPOT-Creation-Date\: 2012-03-29 10\:24-0400\nPO-Revision-Date\: 2012-05-04 10\:24-0400\nLast-Translator\: Ram Kumar.Y \nLanguage-Team\: Tamil\nLanguage\: ta\nMIME-Version\: 1.0\nContent-Type\: text/plain; charset\=UTF-8\nContent-Transfer-Encoding\: 8bit\n #: Editor.java:366 diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/__init__.py b/app/src/processing/app/i18n/python/requests/packages/charade/__init__.py index 5d580b3da47..26378d45325 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/__init__.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/__init__.py @@ -1,27 +1,27 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -__version__ = "1.0.1" - - -def detect(aBuf): - from . import universaldetector - u = universaldetector.UniversalDetector() - u.reset() - u.feed(aBuf) - u.close() - return u.result +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +__version__ = "1.0.1" + + +def detect(aBuf): + from . import universaldetector + u = universaldetector.UniversalDetector() + u.reset() + u.feed(aBuf) + u.close() + return u.result diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/big5prober.py b/app/src/processing/app/i18n/python/requests/packages/charade/big5prober.py index 7382f7c5d49..becce81e5e8 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/big5prober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/big5prober.py @@ -1,42 +1,42 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import Big5SMModel - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(Big5SMModel) - self._mDistributionAnalyzer = Big5DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "Big5" +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import Big5SMModel + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(Big5SMModel) + self._mDistributionAnalyzer = Big5DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "Big5" diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/chardistribution.py b/app/src/processing/app/i18n/python/requests/packages/charade/chardistribution.py index 981bd1a5333..253408f287a 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/chardistribution.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/chardistribution.py @@ -1,230 +1,230 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) -from .compat import wrap_ord - -ENOUGH_DATA_THRESHOLD = 1024 -SURE_YES = 0.99 -SURE_NO = 0.01 - - -class CharDistributionAnalysis: - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._mCharToFreqOrder = None - self._mTableSize = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self._mTypicalDistributionRatio = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - self._mTotalChars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._mFreqChars = 0 - - def feed(self, aBuf, aCharLen): - """feed a character with known length""" - if aCharLen == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(aBuf) - else: - order = -1 - if order >= 0: - self._mTotalChars += 1 - # order is valid - if order < self._mTableSize: - if 512 > self._mCharToFreqOrder[order]: - self._mFreqChars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._mTotalChars <= 0: - return SURE_NO - - if self._mTotalChars != self._mFreqChars: - r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) - * self._mTypicalDistributionRatio)) - if r < SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._mTotalChars > ENOUGH_DATA_THRESHOLD - - def get_order(self, aBuf): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCTWCharToFreqOrder - self._mTableSize = EUCTW_TABLE_SIZE - self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCKRCharToFreqOrder - self._mTableSize = EUCKR_TABLE_SIZE - self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = GB2312CharToFreqOrder - self._mTableSize = GB2312_TABLE_SIZE - self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = Big5CharToFreqOrder - self._mTableSize = BIG5_TABLE_SIZE - self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = wrap_ord(aBuf[0]) - if char >= 0xA0: - return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 - else: - return -1 +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) +from .compat import wrap_ord + +ENOUGH_DATA_THRESHOLD = 1024 +SURE_YES = 0.99 +SURE_NO = 0.01 + + +class CharDistributionAnalysis: + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._mCharToFreqOrder = None + self._mTableSize = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self._mTypicalDistributionRatio = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._mDone = False + self._mTotalChars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._mFreqChars = 0 + + def feed(self, aBuf, aCharLen): + """feed a character with known length""" + if aCharLen == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(aBuf) + else: + order = -1 + if order >= 0: + self._mTotalChars += 1 + # order is valid + if order < self._mTableSize: + if 512 > self._mCharToFreqOrder[order]: + self._mFreqChars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._mTotalChars <= 0: + return SURE_NO + + if self._mTotalChars != self._mFreqChars: + r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) + * self._mTypicalDistributionRatio)) + if r < SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._mTotalChars > ENOUGH_DATA_THRESHOLD + + def get_order(self, aBuf): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCTWCharToFreqOrder + self._mTableSize = EUCTW_TABLE_SIZE + self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCKRCharToFreqOrder + self._mTableSize = EUCKR_TABLE_SIZE + self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = GB2312CharToFreqOrder + self._mTableSize = GB2312_TABLE_SIZE + self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = Big5CharToFreqOrder + self._mTableSize = BIG5_TABLE_SIZE + self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = wrap_ord(aBuf[0]) + if char >= 0xA0: + return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 + else: + return -1 diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/charsetgroupprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/charsetgroupprober.py index 29596547489..85e7a1c67db 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/charsetgroupprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/charsetgroupprober.py @@ -1,106 +1,106 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mActiveNum = 0 - self._mProbers = [] - self._mBestGuessProber = None - - def reset(self): - CharSetProber.reset(self) - self._mActiveNum = 0 - for prober in self._mProbers: - if prober: - prober.reset() - prober.active = True - self._mActiveNum += 1 - self._mBestGuessProber = None - - def get_charset_name(self): - if not self._mBestGuessProber: - self.get_confidence() - if not self._mBestGuessProber: - return None -# self._mBestGuessProber = self._mProbers[0] - return self._mBestGuessProber.get_charset_name() - - def feed(self, aBuf): - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - continue - st = prober.feed(aBuf) - if not st: - continue - if st == constants.eFoundIt: - self._mBestGuessProber = prober - return self.get_state() - elif st == constants.eNotMe: - prober.active = False - self._mActiveNum -= 1 - if self._mActiveNum <= 0: - self._mState = constants.eNotMe - return self.get_state() - return self.get_state() - - def get_confidence(self): - st = self.get_state() - if st == constants.eFoundIt: - return 0.99 - elif st == constants.eNotMe: - return 0.01 - bestConf = 0.0 - self._mBestGuessProber = None - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - if constants._debug: - sys.stderr.write(prober.get_charset_name() - + ' not active\n') - continue - cf = prober.get_confidence() - if constants._debug: - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), cf)) - if bestConf < cf: - bestConf = cf - self._mBestGuessProber = prober - if not self._mBestGuessProber: - return 0.0 - return bestConf -# else: -# self._mBestGuessProber = self._mProbers[0] -# return self._mBestGuessProber.get_confidence() +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import sys +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mActiveNum = 0 + self._mProbers = [] + self._mBestGuessProber = None + + def reset(self): + CharSetProber.reset(self) + self._mActiveNum = 0 + for prober in self._mProbers: + if prober: + prober.reset() + prober.active = True + self._mActiveNum += 1 + self._mBestGuessProber = None + + def get_charset_name(self): + if not self._mBestGuessProber: + self.get_confidence() + if not self._mBestGuessProber: + return None +# self._mBestGuessProber = self._mProbers[0] + return self._mBestGuessProber.get_charset_name() + + def feed(self, aBuf): + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + continue + st = prober.feed(aBuf) + if not st: + continue + if st == constants.eFoundIt: + self._mBestGuessProber = prober + return self.get_state() + elif st == constants.eNotMe: + prober.active = False + self._mActiveNum -= 1 + if self._mActiveNum <= 0: + self._mState = constants.eNotMe + return self.get_state() + return self.get_state() + + def get_confidence(self): + st = self.get_state() + if st == constants.eFoundIt: + return 0.99 + elif st == constants.eNotMe: + return 0.01 + bestConf = 0.0 + self._mBestGuessProber = None + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + if constants._debug: + sys.stderr.write(prober.get_charset_name() + + ' not active\n') + continue + cf = prober.get_confidence() + if constants._debug: + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), cf)) + if bestConf < cf: + bestConf = cf + self._mBestGuessProber = prober + if not self._mBestGuessProber: + return 0.0 + return bestConf +# else: +# self._mBestGuessProber = self._mProbers[0] +# return self._mBestGuessProber.get_confidence() diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/codingstatemachine.py b/app/src/processing/app/i18n/python/requests/packages/charade/codingstatemachine.py index 1bda9ff1620..8dd8c917983 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/codingstatemachine.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/codingstatemachine.py @@ -1,61 +1,61 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart -from .compat import wrap_ord - - -class CodingStateMachine: - def __init__(self, sm): - self._mModel = sm - self._mCurrentBytePos = 0 - self._mCurrentCharLen = 0 - self.reset() - - def reset(self): - self._mCurrentState = eStart - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - # PY3K: aBuf is a byte stream, so c is an int, not a byte - byteCls = self._mModel['classTable'][wrap_ord(c)] - if self._mCurrentState == eStart: - self._mCurrentBytePos = 0 - self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] - # from byte's class and stateTable, we get its next state - curr_state = (self._mCurrentState * self._mModel['classFactor'] - + byteCls) - self._mCurrentState = self._mModel['stateTable'][curr_state] - self._mCurrentBytePos += 1 - return self._mCurrentState - - def get_current_charlen(self): - return self._mCurrentCharLen - - def get_coding_state_machine(self): - return self._mModel['name'] +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart +from .compat import wrap_ord + + +class CodingStateMachine: + def __init__(self, sm): + self._mModel = sm + self._mCurrentBytePos = 0 + self._mCurrentCharLen = 0 + self.reset() + + def reset(self): + self._mCurrentState = eStart + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + # PY3K: aBuf is a byte stream, so c is an int, not a byte + byteCls = self._mModel['classTable'][wrap_ord(c)] + if self._mCurrentState == eStart: + self._mCurrentBytePos = 0 + self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] + # from byte's class and stateTable, we get its next state + curr_state = (self._mCurrentState * self._mModel['classFactor'] + + byteCls) + self._mCurrentState = self._mModel['stateTable'][curr_state] + self._mCurrentBytePos += 1 + return self._mCurrentState + + def get_current_charlen(self): + return self._mCurrentCharLen + + def get_coding_state_machine(self): + return self._mModel['name'] diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/constants.py b/app/src/processing/app/i18n/python/requests/packages/charade/constants.py index a3d27de250b..e4d148b3c5b 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/constants.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/constants.py @@ -1,39 +1,39 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -_debug = 0 - -eDetecting = 0 -eFoundIt = 1 -eNotMe = 2 - -eStart = 0 -eError = 1 -eItsMe = 2 - -SHORTCUT_THRESHOLD = 0.95 +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +_debug = 0 + +eDetecting = 0 +eFoundIt = 1 +eNotMe = 2 + +eStart = 0 +eError = 1 +eItsMe = 2 + +SHORTCUT_THRESHOLD = 0.95 diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/escprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/escprober.py index 0063935ce65..80a844ff34c 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/escprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/escprober.py @@ -1,86 +1,86 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, - ISO2022KRSMModel) -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .compat import wrap_ord - - -class EscCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = [ - CodingStateMachine(HZSMModel), - CodingStateMachine(ISO2022CNSMModel), - CodingStateMachine(ISO2022JPSMModel), - CodingStateMachine(ISO2022KRSMModel) - ] - self.reset() - - def reset(self): - CharSetProber.reset(self) - for codingSM in self._mCodingSM: - if not codingSM: - continue - codingSM.active = True - codingSM.reset() - self._mActiveSM = len(self._mCodingSM) - self._mDetectedCharset = None - - def get_charset_name(self): - return self._mDetectedCharset - - def get_confidence(self): - if self._mDetectedCharset: - return 0.99 - else: - return 0.00 - - def feed(self, aBuf): - for c in aBuf: - # PY3K: aBuf is a byte array, so c is an int, not a byte - for codingSM in self._mCodingSM: - if not codingSM: - continue - if not codingSM.active: - continue - codingState = codingSM.next_state(wrap_ord(c)) - if codingState == constants.eError: - codingSM.active = False - self._mActiveSM -= 1 - if self._mActiveSM <= 0: - self._mState = constants.eNotMe - return self.get_state() - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 - return self.get_state() - - return self.get_state() +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, + ISO2022KRSMModel) +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .compat import wrap_ord + + +class EscCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = [ + CodingStateMachine(HZSMModel), + CodingStateMachine(ISO2022CNSMModel), + CodingStateMachine(ISO2022JPSMModel), + CodingStateMachine(ISO2022KRSMModel) + ] + self.reset() + + def reset(self): + CharSetProber.reset(self) + for codingSM in self._mCodingSM: + if not codingSM: + continue + codingSM.active = True + codingSM.reset() + self._mActiveSM = len(self._mCodingSM) + self._mDetectedCharset = None + + def get_charset_name(self): + return self._mDetectedCharset + + def get_confidence(self): + if self._mDetectedCharset: + return 0.99 + else: + return 0.00 + + def feed(self, aBuf): + for c in aBuf: + # PY3K: aBuf is a byte array, so c is an int, not a byte + for codingSM in self._mCodingSM: + if not codingSM: + continue + if not codingSM.active: + continue + codingState = codingSM.next_state(wrap_ord(c)) + if codingState == constants.eError: + codingSM.active = False + self._mActiveSM -= 1 + if self._mActiveSM <= 0: + self._mState = constants.eNotMe + return self.get_state() + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 + return self.get_state() + + return self.get_state() diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/escsm.py b/app/src/processing/app/i18n/python/requests/packages/charade/escsm.py index 1cf3aa6db6d..bd302b4c61d 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/escsm.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/escsm.py @@ -1,242 +1,242 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -HZ_cls = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_st = ( -eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 - 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f - 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 - 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f -) - -HZCharLenTable = (0, 0, 0, 0, 0, 0) - -HZSMModel = {'classTable': HZ_cls, - 'classFactor': 6, - 'stateTable': HZ_st, - 'charLenTable': HZCharLenTable, - 'name': "HZ-GB-2312"} - -ISO2022CN_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 - 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 -eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f -) - -ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CNSMModel = {'classTable': ISO2022CN_cls, - 'classFactor': 9, - 'stateTable': ISO2022CN_st, - 'charLenTable': ISO2022CNCharLenTable, - 'name': "ISO-2022-CN"} - -ISO2022JP_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f -eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 -eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f -eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f -eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 -) - -ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JPSMModel = {'classTable': ISO2022JP_cls, - 'classFactor': 10, - 'stateTable': ISO2022JP_st, - 'charLenTable': ISO2022JPCharLenTable, - 'name': "ISO-2022-JP"} - -ISO2022KR_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_st = ( -eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 -eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f -eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 -) - -ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) - -ISO2022KRSMModel = {'classTable': ISO2022KR_cls, - 'classFactor': 6, - 'stateTable': ISO2022KR_st, - 'charLenTable': ISO2022KRCharLenTable, - 'name': "ISO-2022-KR"} - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart, eError, eItsMe + +HZ_cls = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_st = ( +eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 + 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f + 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 + 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f +) + +HZCharLenTable = (0, 0, 0, 0, 0, 0) + +HZSMModel = {'classTable': HZ_cls, + 'classFactor': 6, + 'stateTable': HZ_st, + 'charLenTable': HZCharLenTable, + 'name': "HZ-GB-2312"} + +ISO2022CN_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 + 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 +eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f +) + +ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CNSMModel = {'classTable': ISO2022CN_cls, + 'classFactor': 9, + 'stateTable': ISO2022CN_st, + 'charLenTable': ISO2022CNCharLenTable, + 'name': "ISO-2022-CN"} + +ISO2022JP_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f +eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 +eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f +eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f +eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 +) + +ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JPSMModel = {'classTable': ISO2022JP_cls, + 'classFactor': 10, + 'stateTable': ISO2022JP_st, + 'charLenTable': ISO2022JPCharLenTable, + 'name': "ISO-2022-JP"} + +ISO2022KR_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_st = ( +eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 +eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f +eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 +) + +ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) + +ISO2022KRSMModel = {'classTable': ISO2022KR_cls, + 'classFactor': 6, + 'stateTable': ISO2022KR_st, + 'charLenTable': ISO2022KRCharLenTable, + 'name': "ISO-2022-KR"} + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/eucjpprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/eucjpprober.py index d70cfbbb017..8e64fdcc266 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/eucjpprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/eucjpprober.py @@ -1,90 +1,90 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJPSMModel - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCJPSMModel) - self._mDistributionAnalyzer = EUCJPDistributionAnalysis() - self._mContextAnalyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "EUC-JP" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar, charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJPSMModel + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCJPSMModel) + self._mDistributionAnalyzer = EUCJPDistributionAnalysis() + self._mContextAnalyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "EUC-JP" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar, charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mContextAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/euckrprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/euckrprober.py index def3e429028..5982a46b606 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/euckrprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/euckrprober.py @@ -1,42 +1,42 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKRSMModel - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCKRSMModel) - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-KR" +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKRSMModel + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCKRSMModel) + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-KR" diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/euctwprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/euctwprober.py index e601adfdc60..fe652fe37a9 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/euctwprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/euctwprober.py @@ -1,41 +1,41 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTWSMModel - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCTWSMModel) - self._mDistributionAnalyzer = EUCTWDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-TW" +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTWSMModel + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCTWSMModel) + self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-TW" diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/gb2312prober.py b/app/src/processing/app/i18n/python/requests/packages/charade/gb2312prober.py index 643fe2519e7..0325a2d8614 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/gb2312prober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/gb2312prober.py @@ -1,41 +1,41 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312SMModel - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(GB2312SMModel) - self._mDistributionAnalyzer = GB2312DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "GB2312" +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312SMModel + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(GB2312SMModel) + self._mDistributionAnalyzer = GB2312DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "GB2312" diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/hebrewprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/hebrewprober.py index 90d171f302d..ba225c5ef43 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/hebrewprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/hebrewprober.py @@ -1,283 +1,283 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe, eDetecting -from .compat import wrap_ord - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -# windows-1255 / ISO-8859-8 code points of interest -FINAL_KAF = 0xea -NORMAL_KAF = 0xeb -FINAL_MEM = 0xed -NORMAL_MEM = 0xee -FINAL_NUN = 0xef -NORMAL_NUN = 0xf0 -FINAL_PE = 0xf3 -NORMAL_PE = 0xf4 -FINAL_TSADI = 0xf5 -NORMAL_TSADI = 0xf6 - -# Minimum Visual vs Logical final letter score difference. -# If the difference is below this, don't rely solely on the final letter score -# distance. -MIN_FINAL_CHAR_DISTANCE = 5 - -# Minimum Visual vs Logical model score difference. -# If the difference is below this, don't rely at all on the model score -# distance. -MIN_MODEL_DISTANCE = 0.01 - -VISUAL_HEBREW_NAME = "ISO-8859-8" -LOGICAL_HEBREW_NAME = "windows-1255" - - -class HebrewProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mLogicalProber = None - self._mVisualProber = None - self.reset() - - def reset(self): - self._mFinalCharLogicalScore = 0 - self._mFinalCharVisualScore = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._mPrev = ' ' - self._mBeforePrev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._mLogicalProber = logicalProber - self._mVisualProber = visualProber - - def is_final(self, c): - return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, - FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] - - def feed(self, aBuf): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.get_state() == eNotMe: - # Both model probers say it's not them. No reason to continue. - return eNotMe - - aBuf = self.filter_high_bit_only(aBuf) - - for cur in aBuf: - if cur == ' ': - # We stand on a space - a word just ended - if self._mBeforePrev != ' ': - # next-to-last char was not a space so self._mPrev is not a - # 1 letter word - if self.is_final(self._mPrev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._mFinalCharLogicalScore += 1 - elif self.is_non_final(self._mPrev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._mFinalCharVisualScore += 1 - else: - # Not standing on a space - if ((self._mBeforePrev == ' ') and - (self.is_final(self._mPrev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._mFinalCharVisualScore += 1 - self._mBeforePrev = self._mPrev - self._mPrev = cur - - # Forever detecting, till the end or until both model probers return - # eNotMe (handled above) - return eDetecting - - def get_charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore - if finalsub >= MIN_FINAL_CHAR_DISTANCE: - return LOGICAL_HEBREW_NAME - if finalsub <= -MIN_FINAL_CHAR_DISTANCE: - return VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._mLogicalProber.get_confidence() - - self._mVisualProber.get_confidence()) - if modelsub > MIN_MODEL_DISTANCE: - return LOGICAL_HEBREW_NAME - if modelsub < -MIN_MODEL_DISTANCE: - return VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return LOGICAL_HEBREW_NAME - - def get_state(self): - # Remain active as long as any of the model probers are active. - if (self._mLogicalProber.get_state() == eNotMe) and \ - (self._mVisualProber.get_state() == eNotMe): - return eNotMe - return eDetecting +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe, eDetecting +from .compat import wrap_ord + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +# windows-1255 / ISO-8859-8 code points of interest +FINAL_KAF = 0xea +NORMAL_KAF = 0xeb +FINAL_MEM = 0xed +NORMAL_MEM = 0xee +FINAL_NUN = 0xef +NORMAL_NUN = 0xf0 +FINAL_PE = 0xf3 +NORMAL_PE = 0xf4 +FINAL_TSADI = 0xf5 +NORMAL_TSADI = 0xf6 + +# Minimum Visual vs Logical final letter score difference. +# If the difference is below this, don't rely solely on the final letter score +# distance. +MIN_FINAL_CHAR_DISTANCE = 5 + +# Minimum Visual vs Logical model score difference. +# If the difference is below this, don't rely at all on the model score +# distance. +MIN_MODEL_DISTANCE = 0.01 + +VISUAL_HEBREW_NAME = "ISO-8859-8" +LOGICAL_HEBREW_NAME = "windows-1255" + + +class HebrewProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mLogicalProber = None + self._mVisualProber = None + self.reset() + + def reset(self): + self._mFinalCharLogicalScore = 0 + self._mFinalCharVisualScore = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._mPrev = ' ' + self._mBeforePrev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._mLogicalProber = logicalProber + self._mVisualProber = visualProber + + def is_final(self, c): + return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, + FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] + + def feed(self, aBuf): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.get_state() == eNotMe: + # Both model probers say it's not them. No reason to continue. + return eNotMe + + aBuf = self.filter_high_bit_only(aBuf) + + for cur in aBuf: + if cur == ' ': + # We stand on a space - a word just ended + if self._mBeforePrev != ' ': + # next-to-last char was not a space so self._mPrev is not a + # 1 letter word + if self.is_final(self._mPrev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._mFinalCharLogicalScore += 1 + elif self.is_non_final(self._mPrev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._mFinalCharVisualScore += 1 + else: + # Not standing on a space + if ((self._mBeforePrev == ' ') and + (self.is_final(self._mPrev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._mFinalCharVisualScore += 1 + self._mBeforePrev = self._mPrev + self._mPrev = cur + + # Forever detecting, till the end or until both model probers return + # eNotMe (handled above) + return eDetecting + + def get_charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore + if finalsub >= MIN_FINAL_CHAR_DISTANCE: + return LOGICAL_HEBREW_NAME + if finalsub <= -MIN_FINAL_CHAR_DISTANCE: + return VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._mLogicalProber.get_confidence() + - self._mVisualProber.get_confidence()) + if modelsub > MIN_MODEL_DISTANCE: + return LOGICAL_HEBREW_NAME + if modelsub < -MIN_MODEL_DISTANCE: + return VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return LOGICAL_HEBREW_NAME + + def get_state(self): + # Remain active as long as any of the model probers are active. + if (self._mLogicalProber.get_state() == eNotMe) and \ + (self._mVisualProber.get_state() == eNotMe): + return eNotMe + return eDetecting diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/jpcntx.py b/app/src/processing/app/i18n/python/requests/packages/charade/jpcntx.py index b4e6af44a98..f7f69ba4cda 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/jpcntx.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/jpcntx.py @@ -1,219 +1,219 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .compat import wrap_ord - -NUM_OF_CATEGORY = 6 -DONT_KNOW = -1 -ENOUGH_REL_THRESHOLD = 100 -MAX_REL_THRESHOLD = 1000 -MINIMUM_DATA_THRESHOLD = 4 - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis: - def __init__(self): - self.reset() - - def reset(self): - self._mTotalRel = 0 # total sequence received - # category counters, each interger counts sequence in its category - self._mRelSample = [0] * NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._mNeedToSkipCharNum = 0 - self._mLastCharOrder = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - - def feed(self, aBuf, aLen): - if self._mDone: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._mNeedToSkipCharNum - while i < aLen: - order, charLen = self.get_order(aBuf[i:i + 2]) - i += charLen - if i > aLen: - self._mNeedToSkipCharNum = i - aLen - self._mLastCharOrder = -1 - else: - if (order != -1) and (self._mLastCharOrder != -1): - self._mTotalRel += 1 - if self._mTotalRel > MAX_REL_THRESHOLD: - self._mDone = True - break - self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 - self._mLastCharOrder = order - - def got_enough_data(self): - return self._mTotalRel > ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._mTotalRel > MINIMUM_DATA_THRESHOLD: - return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel - else: - return DONT_KNOW - - def get_order(self, aBuf): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): - charLen = 2 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, charLen - - return -1, charLen - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - charLen = 2 - elif first_char == 0x8F: - charLen = 3 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, charLen - - return -1, charLen - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .compat import wrap_ord + +NUM_OF_CATEGORY = 6 +DONT_KNOW = -1 +ENOUGH_REL_THRESHOLD = 100 +MAX_REL_THRESHOLD = 1000 +MINIMUM_DATA_THRESHOLD = 4 + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis: + def __init__(self): + self.reset() + + def reset(self): + self._mTotalRel = 0 # total sequence received + # category counters, each interger counts sequence in its category + self._mRelSample = [0] * NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._mNeedToSkipCharNum = 0 + self._mLastCharOrder = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._mDone = False + + def feed(self, aBuf, aLen): + if self._mDone: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._mNeedToSkipCharNum + while i < aLen: + order, charLen = self.get_order(aBuf[i:i + 2]) + i += charLen + if i > aLen: + self._mNeedToSkipCharNum = i - aLen + self._mLastCharOrder = -1 + else: + if (order != -1) and (self._mLastCharOrder != -1): + self._mTotalRel += 1 + if self._mTotalRel > MAX_REL_THRESHOLD: + self._mDone = True + break + self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 + self._mLastCharOrder = order + + def got_enough_data(self): + return self._mTotalRel > ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._mTotalRel > MINIMUM_DATA_THRESHOLD: + return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel + else: + return DONT_KNOW + + def get_order(self, aBuf): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): + charLen = 2 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, charLen + + return -1, charLen + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + charLen = 2 + elif first_char == 0x8F: + charLen = 3 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, charLen + + return -1, charLen + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/langbulgarianmodel.py b/app/src/processing/app/i18n/python/requests/packages/charade/langbulgarianmodel.py index ea5a60ba043..e5788fc64a6 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/langbulgarianmodel.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/langbulgarianmodel.py @@ -1,229 +1,229 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'charToOrderMap': Latin5_BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -Win1251BulgarianModel = { - 'charToOrderMap': win1251BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'charToOrderMap': Latin5_BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-5" +} + +Win1251BulgarianModel = { + 'charToOrderMap': win1251BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': False, + 'charsetName': "windows-1251" +} + + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/langcyrillicmodel.py b/app/src/processing/app/i18n/python/requests/packages/charade/langcyrillicmodel.py index 4b69c821c8b..f0b9af27f71 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/langcyrillicmodel.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/langcyrillicmodel.py @@ -1,331 +1,331 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# KOI8-R language model -# Character Mapping Table: -KOI8R_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -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, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -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, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -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, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -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, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'charToOrderMap': KOI8R_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "KOI8-R" -} - -Win1251CyrillicModel = { - 'charToOrderMap': win1251_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - -Latin5CyrillicModel = { - 'charToOrderMap': latin5_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -MacCyrillicModel = { - 'charToOrderMap': macCyrillic_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "MacCyrillic" -}; - -Ibm866Model = { - 'charToOrderMap': IBM866_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM866" -} - -Ibm855Model = { - 'charToOrderMap': IBM855_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM855" -} - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants + +# KOI8-R language model +# Character Mapping Table: +KOI8R_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +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, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +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, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +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, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +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, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'charToOrderMap': KOI8R_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "KOI8-R" +} + +Win1251CyrillicModel = { + 'charToOrderMap': win1251_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "windows-1251" +} + +Latin5CyrillicModel = { + 'charToOrderMap': latin5_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-5" +} + +MacCyrillicModel = { + 'charToOrderMap': macCyrillic_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "MacCyrillic" +}; + +Ibm866Model = { + 'charToOrderMap': IBM866_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM866" +} + +Ibm855Model = { + 'charToOrderMap': IBM855_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM855" +} + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/langgreekmodel.py b/app/src/processing/app/i18n/python/requests/packages/charade/langgreekmodel.py index 78e9ce60106..891fe3420dc 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/langgreekmodel.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/langgreekmodel.py @@ -1,227 +1,227 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'charToOrderMap': Latin7_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-7" -} - -Win1253GreekModel = { - 'charToOrderMap': win1253_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "windows-1253" -} - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'charToOrderMap': Latin7_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-7" +} + +Win1253GreekModel = { + 'charToOrderMap': win1253_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "windows-1253" +} + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/langhebrewmodel.py b/app/src/processing/app/i18n/python/requests/packages/charade/langhebrewmodel.py index 4c6b3ce1189..248b02aa033 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/langhebrewmodel.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/langhebrewmodel.py @@ -1,203 +1,203 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -win1255_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HebrewLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'charToOrderMap': win1255_CharToOrderMap, - 'precedenceMatrix': HebrewLangModel, - 'mTypicalPositiveRatio': 0.984004, - 'keepEnglishLetter': False, - 'charsetName': "windows-1255" -} - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +win1255_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HebrewLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'charToOrderMap': win1255_CharToOrderMap, + 'precedenceMatrix': HebrewLangModel, + 'mTypicalPositiveRatio': 0.984004, + 'keepEnglishLetter': False, + 'charsetName': "windows-1255" +} + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/langhungarianmodel.py b/app/src/processing/app/i18n/python/requests/packages/charade/langhungarianmodel.py index bd7f5055de6..c748d280c45 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/langhungarianmodel.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/langhungarianmodel.py @@ -1,227 +1,227 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -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, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'charToOrderMap': Latin2_HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "ISO-8859-2" -} - -Win1250HungarianModel = { - 'charToOrderMap': win1250HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "windows-1250" -} - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +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, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'charToOrderMap': Latin2_HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "ISO-8859-2" +} + +Win1250HungarianModel = { + 'charToOrderMap': win1250HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "windows-1250" +} + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/langthaimodel.py b/app/src/processing/app/i18n/python/requests/packages/charade/langthaimodel.py index df343a74732..0508b1b1abc 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/langthaimodel.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/langthaimodel.py @@ -1,200 +1,200 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'charToOrderMap': TIS620CharToOrderMap, - 'precedenceMatrix': ThaiLangModel, - 'mTypicalPositiveRatio': 0.926386, - 'keepEnglishLetter': False, - 'charsetName': "TIS-620" -} - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'charToOrderMap': TIS620CharToOrderMap, + 'precedenceMatrix': ThaiLangModel, + 'mTypicalPositiveRatio': 0.926386, + 'keepEnglishLetter': False, + 'charsetName': "TIS-620" +} + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/latin1prober.py b/app/src/processing/app/i18n/python/requests/packages/charade/latin1prober.py index bebe1bcb02f..ad695f57a72 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/latin1prober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/latin1prober.py @@ -1,139 +1,139 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe -from .compat import wrap_ord - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( - # UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self.reset() - - def reset(self): - self._mLastCharClass = OTH - self._mFreqCounter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - def get_charset_name(self): - return "windows-1252" - - def feed(self, aBuf): - aBuf = self.filter_with_english_letters(aBuf) - for c in aBuf: - charClass = Latin1_CharToClass[wrap_ord(c)] - freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) - + charClass] - if freq == 0: - self._mState = eNotMe - break - self._mFreqCounter[freq] += 1 - self._mLastCharClass = charClass - - return self.get_state() - - def get_confidence(self): - if self.get_state() == eNotMe: - return 0.01 - - total = sum(self._mFreqCounter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._mFreqCounter[3] / total) - - (self._mFreqCounter[1] * 20.0 / total)) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.5 - return confidence +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe +from .compat import wrap_ord + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( + # UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self.reset() + + def reset(self): + self._mLastCharClass = OTH + self._mFreqCounter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + def get_charset_name(self): + return "windows-1252" + + def feed(self, aBuf): + aBuf = self.filter_with_english_letters(aBuf) + for c in aBuf: + charClass = Latin1_CharToClass[wrap_ord(c)] + freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + + charClass] + if freq == 0: + self._mState = eNotMe + break + self._mFreqCounter[freq] += 1 + self._mLastCharClass = charClass + + return self.get_state() + + def get_confidence(self): + if self.get_state() == eNotMe: + return 0.01 + + total = sum(self._mFreqCounter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._mFreqCounter[3] / total) + - (self._mFreqCounter[1] * 20.0 / total)) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.5 + return confidence diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/mbcharsetprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/mbcharsetprober.py index 1eee253c047..bb42f2fb5e8 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/mbcharsetprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/mbcharsetprober.py @@ -1,86 +1,86 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber - - -class MultiByteCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mDistributionAnalyzer = None - self._mCodingSM = None - self._mLastChar = [0, 0] - - def reset(self): - CharSetProber.reset(self) - if self._mCodingSM: - self._mCodingSM.reset() - if self._mDistributionAnalyzer: - self._mDistributionAnalyzer.reset() - self._mLastChar = [0, 0] - - def get_charset_name(self): - pass - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mDistributionAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - return self._mDistributionAnalyzer.get_confidence() +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .charsetprober import CharSetProber + + +class MultiByteCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mDistributionAnalyzer = None + self._mCodingSM = None + self._mLastChar = [0, 0] + + def reset(self): + CharSetProber.reset(self) + if self._mCodingSM: + self._mCodingSM.reset() + if self._mDistributionAnalyzer: + self._mDistributionAnalyzer.reset() + self._mLastChar = [0, 0] + + def get_charset_name(self): + pass + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mDistributionAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + return self._mDistributionAnalyzer.get_confidence() diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/mbcsgroupprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/mbcsgroupprober.py index ebe93d08d37..e349a9b6b33 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/mbcsgroupprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/mbcsgroupprober.py @@ -1,52 +1,52 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - Big5Prober(), - EUCTWProber() - ] - self.reset() +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/mbcssm.py b/app/src/processing/app/i18n/python/requests/packages/charade/mbcssm.py index 3a720c9a9af..fc7904a9a50 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/mbcssm.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/mbcssm.py @@ -1,535 +1,535 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -# BIG5 - -BIG5_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 -) - -Big5CharLenTable = (0, 1, 1, 2, 0) - -Big5SMModel = {'classTable': BIG5_cls, - 'classFactor': 5, - 'stateTable': BIG5_st, - 'charLenTable': Big5CharLenTable, - 'name': 'Big5'} - -# EUC-JP - -EUCJP_cls = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_st = ( - 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 - eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f - 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 -) - -EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) - -EUCJPSMModel = {'classTable': EUCJP_cls, - 'classFactor': 6, - 'stateTable': EUCJP_st, - 'charLenTable': EUCJPCharLenTable, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_st = ( - eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 - eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f -) - -EUCKRCharLenTable = (0, 1, 2, 0) - -EUCKRSMModel = {'classTable': EUCKR_cls, - 'classFactor': 4, - 'stateTable': EUCKR_st, - 'charLenTable': EUCKRCharLenTable, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_cls = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_st = ( - eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 - eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f - 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 - eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) - -EUCTWSMModel = {'classTable': EUCTW_cls, - 'classFactor': 7, - 'stateTable': EUCTW_st, - 'charLenTable': EUCTWCharLenTable, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_st = ( - eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 - 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f - eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validing -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) - -GB2312SMModel = {'classTable': GB2312_cls, - 'classFactor': 7, - 'stateTable': GB2312_st, - 'charLenTable': GB2312CharLenTable, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,3,3,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 4,4,4,4,4,4,4,4, # f0 - f7 - 4,4,4,4,4,0,0,0 # f8 - ff -) - - -SJIS_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 -) - -SJISCharLenTable = (0, 1, 1, 2, 0, 0) - -SJISSMModel = {'classTable': SJIS_cls, - 'classFactor': 6, - 'stateTable': SJIS_st, - 'charLenTable': SJISCharLenTable, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_st = ( - 5, 7, 7,eError, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 - 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,eError,#20-27 - 5, 8, 6, 6,eError, 6, 6, 6,#28-2f - 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 -) - -UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) - -UCS2BESMModel = {'classTable': UCS2BE_cls, - 'classFactor': 6, - 'stateTable': UCS2BE_st, - 'charLenTable': UCS2BECharLenTable, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_st = ( - 6, 6, 7, 6, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 - 5, 5, 5,eError, 5,eError, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,eError,#20-27 - 5, 5, 5,eError,eError,eError, 5, 5,#28-2f - 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 -) - -UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) - -UCS2LESMModel = {'classTable': UCS2LE_cls, - 'classFactor': 6, - 'stateTable': UCS2LE_st, - 'charLenTable': UCS2LECharLenTable, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_st = ( - eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - eError,eError,eError,eError,eError,eError,eError,eError,#10-17 - eError,eError,eError,eError,eError,eError,eError,eError,#18-1f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f - eError,eError, 5, 5, 5, 5,eError,eError,#30-37 - eError,eError,eError,eError,eError,eError,eError,eError,#38-3f - eError,eError,eError, 5, 5, 5,eError,eError,#40-47 - eError,eError,eError,eError,eError,eError,eError,eError,#48-4f - eError,eError, 7, 7, 7, 7,eError,eError,#50-57 - eError,eError,eError,eError,eError,eError,eError,eError,#58-5f - eError,eError,eError,eError, 7, 7,eError,eError,#60-67 - eError,eError,eError,eError,eError,eError,eError,eError,#68-6f - eError,eError, 9, 9, 9, 9,eError,eError,#70-77 - eError,eError,eError,eError,eError,eError,eError,eError,#78-7f - eError,eError,eError,eError,eError, 9,eError,eError,#80-87 - eError,eError,eError,eError,eError,eError,eError,eError,#88-8f - eError,eError, 12, 12, 12, 12,eError,eError,#90-97 - eError,eError,eError,eError,eError,eError,eError,eError,#98-9f - eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 - eError,eError,eError,eError,eError,eError,eError,eError,#a8-af - eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 - eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf - eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 - eError,eError,eError,eError,eError,eError,eError,eError #c8-cf -) - -UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8SMModel = {'classTable': UTF8_cls, - 'classFactor': 16, - 'stateTable': UTF8_st, - 'charLenTable': UTF8CharLenTable, - 'name': 'UTF-8'} - -# flake8: noqa +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart, eError, eItsMe + +# BIG5 + +BIG5_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_st = ( + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f + eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 +) + +Big5CharLenTable = (0, 1, 1, 2, 0) + +Big5SMModel = {'classTable': BIG5_cls, + 'classFactor': 5, + 'stateTable': BIG5_st, + 'charLenTable': Big5CharLenTable, + 'name': 'Big5'} + +# EUC-JP + +EUCJP_cls = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_st = ( + 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 + eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f + 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 +) + +EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) + +EUCJPSMModel = {'classTable': EUCJP_cls, + 'classFactor': 6, + 'stateTable': EUCJP_st, + 'charLenTable': EUCJPCharLenTable, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_st = ( + eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 + eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f +) + +EUCKRCharLenTable = (0, 1, 2, 0) + +EUCKRSMModel = {'classTable': EUCKR_cls, + 'classFactor': 4, + 'stateTable': EUCKR_st, + 'charLenTable': EUCKRCharLenTable, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_cls = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_st = ( + eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 + eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f + 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 + eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +) + +EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) + +EUCTWSMModel = {'classTable': EUCTW_cls, + 'classFactor': 7, + 'stateTable': EUCTW_st, + 'charLenTable': EUCTWCharLenTable, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_st = ( + eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 + 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f + eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 + eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validing +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) + +GB2312SMModel = {'classTable': GB2312_cls, + 'classFactor': 7, + 'stateTable': GB2312_st, + 'charLenTable': GB2312CharLenTable, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,3,3,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 4,4,4,4,4,4,4,4, # f0 - f7 + 4,4,4,4,4,0,0,0 # f8 - ff +) + + +SJIS_st = ( + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 +) + +SJISCharLenTable = (0, 1, 1, 2, 0, 0) + +SJISSMModel = {'classTable': SJIS_cls, + 'classFactor': 6, + 'stateTable': SJIS_st, + 'charLenTable': SJISCharLenTable, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_cls = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_st = ( + 5, 7, 7,eError, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 + 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,eError,#20-27 + 5, 8, 6, 6,eError, 6, 6, 6,#28-2f + 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 +) + +UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) + +UCS2BESMModel = {'classTable': UCS2BE_cls, + 'classFactor': 6, + 'stateTable': UCS2BE_st, + 'charLenTable': UCS2BECharLenTable, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_cls = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_st = ( + 6, 6, 7, 6, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 + 5, 5, 5,eError, 5,eError, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,eError,#20-27 + 5, 5, 5,eError,eError,eError, 5, 5,#28-2f + 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 +) + +UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) + +UCS2LESMModel = {'classTable': UCS2LE_cls, + 'classFactor': 6, + 'stateTable': UCS2LE_st, + 'charLenTable': UCS2LECharLenTable, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_st = ( + eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + eError,eError,eError,eError,eError,eError,eError,eError,#10-17 + eError,eError,eError,eError,eError,eError,eError,eError,#18-1f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f + eError,eError, 5, 5, 5, 5,eError,eError,#30-37 + eError,eError,eError,eError,eError,eError,eError,eError,#38-3f + eError,eError,eError, 5, 5, 5,eError,eError,#40-47 + eError,eError,eError,eError,eError,eError,eError,eError,#48-4f + eError,eError, 7, 7, 7, 7,eError,eError,#50-57 + eError,eError,eError,eError,eError,eError,eError,eError,#58-5f + eError,eError,eError,eError, 7, 7,eError,eError,#60-67 + eError,eError,eError,eError,eError,eError,eError,eError,#68-6f + eError,eError, 9, 9, 9, 9,eError,eError,#70-77 + eError,eError,eError,eError,eError,eError,eError,eError,#78-7f + eError,eError,eError,eError,eError, 9,eError,eError,#80-87 + eError,eError,eError,eError,eError,eError,eError,eError,#88-8f + eError,eError, 12, 12, 12, 12,eError,eError,#90-97 + eError,eError,eError,eError,eError,eError,eError,eError,#98-9f + eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 + eError,eError,eError,eError,eError,eError,eError,eError,#a8-af + eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 + eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf + eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 + eError,eError,eError,eError,eError,eError,eError,eError #c8-cf +) + +UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8SMModel = {'classTable': UTF8_cls, + 'classFactor': 16, + 'stateTable': UTF8_st, + 'charLenTable': UTF8CharLenTable, + 'name': 'UTF-8'} + +# flake8: noqa diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/sbcharsetprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/sbcharsetprober.py index da26715cfcd..37291bd27a9 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/sbcharsetprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/sbcharsetprober.py @@ -1,120 +1,120 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber -from .compat import wrap_ord - -SAMPLE_SIZE = 64 -SB_ENOUGH_REL_THRESHOLD = 1024 -POSITIVE_SHORTCUT_THRESHOLD = 0.95 -NEGATIVE_SHORTCUT_THRESHOLD = 0.05 -SYMBOL_CAT_ORDER = 250 -NUMBER_OF_SEQ_CAT = 4 -POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 -#NEGATIVE_CAT = 0 - - -class SingleByteCharSetProber(CharSetProber): - def __init__(self, model, reversed=False, nameProber=None): - CharSetProber.__init__(self) - self._mModel = model - # TRUE if we need to reverse every pair in the model lookup - self._mReversed = reversed - # Optional auxiliary prober for name decision - self._mNameProber = nameProber - self.reset() - - def reset(self): - CharSetProber.reset(self) - # char order of last character - self._mLastOrder = 255 - self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT - self._mTotalSeqs = 0 - self._mTotalChar = 0 - # characters that fall in our sampling range - self._mFreqChar = 0 - - def get_charset_name(self): - if self._mNameProber: - return self._mNameProber.get_charset_name() - else: - return self._mModel['charsetName'] - - def feed(self, aBuf): - if not self._mModel['keepEnglishLetter']: - aBuf = self.filter_without_english_letters(aBuf) - aLen = len(aBuf) - if not aLen: - return self.get_state() - for c in aBuf: - order = self._mModel['charToOrderMap'][wrap_ord(c)] - if order < SYMBOL_CAT_ORDER: - self._mTotalChar += 1 - if order < SAMPLE_SIZE: - self._mFreqChar += 1 - if self._mLastOrder < SAMPLE_SIZE: - self._mTotalSeqs += 1 - if not self._mReversed: - i = (self._mLastOrder * SAMPLE_SIZE) + order - model = self._mModel['precedenceMatrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * SAMPLE_SIZE) + self._mLastOrder - model = self._mModel['precedenceMatrix'][i] - self._mSeqCounters[model] += 1 - self._mLastOrder = order - - if self.get_state() == constants.eDetecting: - if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: - cf = self.get_confidence() - if cf > POSITIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, we have a' - 'winner\n' % - (self._mModel['charsetName'], cf)) - self._mState = constants.eFoundIt - elif cf < NEGATIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, below negative' - 'shortcut threshhold %s\n' % - (self._mModel['charsetName'], cf, - NEGATIVE_SHORTCUT_THRESHOLD)) - self._mState = constants.eNotMe - - return self.get_state() - - def get_confidence(self): - r = 0.01 - if self._mTotalSeqs > 0: - r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs - / self._mModel['mTypicalPositiveRatio']) - r = r * self._mFreqChar / self._mTotalChar - if r >= 1.0: - r = 0.99 - return r +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .charsetprober import CharSetProber +from .compat import wrap_ord + +SAMPLE_SIZE = 64 +SB_ENOUGH_REL_THRESHOLD = 1024 +POSITIVE_SHORTCUT_THRESHOLD = 0.95 +NEGATIVE_SHORTCUT_THRESHOLD = 0.05 +SYMBOL_CAT_ORDER = 250 +NUMBER_OF_SEQ_CAT = 4 +POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 +#NEGATIVE_CAT = 0 + + +class SingleByteCharSetProber(CharSetProber): + def __init__(self, model, reversed=False, nameProber=None): + CharSetProber.__init__(self) + self._mModel = model + # TRUE if we need to reverse every pair in the model lookup + self._mReversed = reversed + # Optional auxiliary prober for name decision + self._mNameProber = nameProber + self.reset() + + def reset(self): + CharSetProber.reset(self) + # char order of last character + self._mLastOrder = 255 + self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT + self._mTotalSeqs = 0 + self._mTotalChar = 0 + # characters that fall in our sampling range + self._mFreqChar = 0 + + def get_charset_name(self): + if self._mNameProber: + return self._mNameProber.get_charset_name() + else: + return self._mModel['charsetName'] + + def feed(self, aBuf): + if not self._mModel['keepEnglishLetter']: + aBuf = self.filter_without_english_letters(aBuf) + aLen = len(aBuf) + if not aLen: + return self.get_state() + for c in aBuf: + order = self._mModel['charToOrderMap'][wrap_ord(c)] + if order < SYMBOL_CAT_ORDER: + self._mTotalChar += 1 + if order < SAMPLE_SIZE: + self._mFreqChar += 1 + if self._mLastOrder < SAMPLE_SIZE: + self._mTotalSeqs += 1 + if not self._mReversed: + i = (self._mLastOrder * SAMPLE_SIZE) + order + model = self._mModel['precedenceMatrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * SAMPLE_SIZE) + self._mLastOrder + model = self._mModel['precedenceMatrix'][i] + self._mSeqCounters[model] += 1 + self._mLastOrder = order + + if self.get_state() == constants.eDetecting: + if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: + cf = self.get_confidence() + if cf > POSITIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, we have a' + 'winner\n' % + (self._mModel['charsetName'], cf)) + self._mState = constants.eFoundIt + elif cf < NEGATIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, below negative' + 'shortcut threshhold %s\n' % + (self._mModel['charsetName'], cf, + NEGATIVE_SHORTCUT_THRESHOLD)) + self._mState = constants.eNotMe + + return self.get_state() + + def get_confidence(self): + r = 0.01 + if self._mTotalSeqs > 0: + r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs + / self._mModel['mTypicalPositiveRatio']) + r = r * self._mFreqChar / self._mTotalChar + if r >= 1.0: + r = 0.99 + return r diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/sbcsgroupprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/sbcsgroupprober.py index b224814568f..1b6196cd16c 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/sbcsgroupprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/sbcsgroupprober.py @@ -1,69 +1,69 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - SingleByteCharSetProber(Latin2HungarianModel), - SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - ] - hebrewProber = HebrewProber() - logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrewProber) - visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrewProber) - hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) - self._mProbers.extend([hebrewProber, logicalHebrewProber, - visualHebrewProber]) - - self.reset() +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + SingleByteCharSetProber(Latin2HungarianModel), + SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + ] + hebrewProber = HebrewProber() + logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrewProber) + visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrewProber) + hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) + self._mProbers.extend([hebrewProber, logicalHebrewProber, + visualHebrewProber]) + + self.reset() diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/sjisprober.py b/app/src/processing/app/i18n/python/requests/packages/charade/sjisprober.py index 9bb0cdcf1fd..b173614e682 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/sjisprober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/sjisprober.py @@ -1,91 +1,91 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJISSMModel -from . import constants - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(SJISSMModel) - self._mDistributionAnalyzer = SJISDistributionAnalysis() - self._mContextAnalyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "SHIFT_JIS" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], - charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 - - charLen], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJISSMModel +from . import constants + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(SJISSMModel) + self._mDistributionAnalyzer = SJISDistributionAnalysis() + self._mContextAnalyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "SHIFT_JIS" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], + charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 + - charLen], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mContextAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/universaldetector.py b/app/src/processing/app/i18n/python/requests/packages/charade/universaldetector.py index adaae720704..3d5336b0324 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/universaldetector.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/universaldetector.py @@ -1,171 +1,171 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -from .latin1prober import Latin1Prober # windows-1252 -from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets -from .sbcsgroupprober import SBCSGroupProber # single-byte character sets -from .escprober import EscCharSetProber # ISO-2122, etc. -import re - -MINIMUM_THRESHOLD = 0.20 -ePureAscii = 0 -eEscAscii = 1 -eHighbyte = 2 - - -class UniversalDetector: - def __init__(self): - self._highBitDetector = re.compile(b'[\x80-\xFF]') - self._escDetector = re.compile(b'(\033|~{)') - self._mEscCharSetProber = None - self._mCharSetProbers = [] - self.reset() - - def reset(self): - self.result = {'encoding': None, 'confidence': 0.0} - self.done = False - self._mStart = True - self._mGotData = False - self._mInputState = ePureAscii - self._mLastChar = b'' - if self._mEscCharSetProber: - self._mEscCharSetProber.reset() - for prober in self._mCharSetProbers: - prober.reset() - - def feed(self, aBuf): - if self.done: - return - - aLen = len(aBuf) - if not aLen: - return - - if not self._mGotData: - # If the data starts with BOM, we know it is UTF - if aBuf[:3] == '\xEF\xBB\xBF': - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8", 'confidence': 1.0} - elif aBuf[:4] == '\xFF\xFE\x00\x00': - # FF FE 00 00 UTF-32, little-endian BOM - self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} - elif aBuf[:4] == '\x00\x00\xFE\xFF': - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} - elif aBuf[:4] == '\xFE\xFF\x00\x00': - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0 - } - elif aBuf[:4] == '\x00\x00\xFF\xFE': - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0 - } - elif aBuf[:2] == '\xFF\xFE': - # FF FE UTF-16, little endian BOM - self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} - elif aBuf[:2] == '\xFE\xFF': - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} - - self._mGotData = True - if self.result['encoding'] and (self.result['confidence'] > 0.0): - self.done = True - return - - if self._mInputState == ePureAscii: - if self._highBitDetector.search(aBuf): - self._mInputState = eHighbyte - elif ((self._mInputState == ePureAscii) and - self._escDetector.search(self._mLastChar + aBuf)): - self._mInputState = eEscAscii - - self._mLastChar = aBuf[-1:] - - if self._mInputState == eEscAscii: - if not self._mEscCharSetProber: - self._mEscCharSetProber = EscCharSetProber() - if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: - self.result = { - 'encoding': self._mEscCharSetProber.get_charset_name(), - 'confidence': self._mEscCharSetProber.get_confidence() - } - self.done = True - elif self._mInputState == eHighbyte: - if not self._mCharSetProbers: - self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), - Latin1Prober()] - for prober in self._mCharSetProbers: - if prober.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': prober.get_charset_name(), - 'confidence': prober.get_confidence()} - self.done = True - break - - def close(self): - if self.done: - return - if not self._mGotData: - if constants._debug: - sys.stderr.write('no data received!\n') - return - self.done = True - - if self._mInputState == ePureAscii: - self.result = {'encoding': 'ascii', 'confidence': 1.0} - return self.result - - if self._mInputState == eHighbyte: - proberConfidence = None - maxProberConfidence = 0.0 - maxProber = None - for prober in self._mCharSetProbers: - if not prober: - continue - proberConfidence = prober.get_confidence() - if proberConfidence > maxProberConfidence: - maxProberConfidence = proberConfidence - maxProber = prober - if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): - self.result = {'encoding': maxProber.get_charset_name(), - 'confidence': maxProber.get_confidence()} - return self.result - - if constants._debug: - sys.stderr.write('no probers hit minimum threshhold\n') - for prober in self._mCharSetProbers[0].mProbers: - if not prober: - continue - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), - prober.get_confidence())) +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import sys +from .latin1prober import Latin1Prober # windows-1252 +from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets +from .sbcsgroupprober import SBCSGroupProber # single-byte character sets +from .escprober import EscCharSetProber # ISO-2122, etc. +import re + +MINIMUM_THRESHOLD = 0.20 +ePureAscii = 0 +eEscAscii = 1 +eHighbyte = 2 + + +class UniversalDetector: + def __init__(self): + self._highBitDetector = re.compile(b'[\x80-\xFF]') + self._escDetector = re.compile(b'(\033|~{)') + self._mEscCharSetProber = None + self._mCharSetProbers = [] + self.reset() + + def reset(self): + self.result = {'encoding': None, 'confidence': 0.0} + self.done = False + self._mStart = True + self._mGotData = False + self._mInputState = ePureAscii + self._mLastChar = b'' + if self._mEscCharSetProber: + self._mEscCharSetProber.reset() + for prober in self._mCharSetProbers: + prober.reset() + + def feed(self, aBuf): + if self.done: + return + + aLen = len(aBuf) + if not aLen: + return + + if not self._mGotData: + # If the data starts with BOM, we know it is UTF + if aBuf[:3] == '\xEF\xBB\xBF': + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8", 'confidence': 1.0} + elif aBuf[:4] == '\xFF\xFE\x00\x00': + # FF FE 00 00 UTF-32, little-endian BOM + self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} + elif aBuf[:4] == '\x00\x00\xFE\xFF': + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} + elif aBuf[:4] == '\xFE\xFF\x00\x00': + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = { + 'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0 + } + elif aBuf[:4] == '\x00\x00\xFF\xFE': + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = { + 'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0 + } + elif aBuf[:2] == '\xFF\xFE': + # FF FE UTF-16, little endian BOM + self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} + elif aBuf[:2] == '\xFE\xFF': + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} + + self._mGotData = True + if self.result['encoding'] and (self.result['confidence'] > 0.0): + self.done = True + return + + if self._mInputState == ePureAscii: + if self._highBitDetector.search(aBuf): + self._mInputState = eHighbyte + elif ((self._mInputState == ePureAscii) and + self._escDetector.search(self._mLastChar + aBuf)): + self._mInputState = eEscAscii + + self._mLastChar = aBuf[-1:] + + if self._mInputState == eEscAscii: + if not self._mEscCharSetProber: + self._mEscCharSetProber = EscCharSetProber() + if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: + self.result = { + 'encoding': self._mEscCharSetProber.get_charset_name(), + 'confidence': self._mEscCharSetProber.get_confidence() + } + self.done = True + elif self._mInputState == eHighbyte: + if not self._mCharSetProbers: + self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), + Latin1Prober()] + for prober in self._mCharSetProbers: + if prober.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': prober.get_charset_name(), + 'confidence': prober.get_confidence()} + self.done = True + break + + def close(self): + if self.done: + return + if not self._mGotData: + if constants._debug: + sys.stderr.write('no data received!\n') + return + self.done = True + + if self._mInputState == ePureAscii: + self.result = {'encoding': 'ascii', 'confidence': 1.0} + return self.result + + if self._mInputState == eHighbyte: + proberConfidence = None + maxProberConfidence = 0.0 + maxProber = None + for prober in self._mCharSetProbers: + if not prober: + continue + proberConfidence = prober.get_confidence() + if proberConfidence > maxProberConfidence: + maxProberConfidence = proberConfidence + maxProber = prober + if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): + self.result = {'encoding': maxProber.get_charset_name(), + 'confidence': maxProber.get_confidence()} + return self.result + + if constants._debug: + sys.stderr.write('no probers hit minimum threshhold\n') + for prober in self._mCharSetProbers[0].mProbers: + if not prober: + continue + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), + prober.get_confidence())) diff --git a/app/src/processing/app/i18n/python/requests/packages/charade/utf8prober.py b/app/src/processing/app/i18n/python/requests/packages/charade/utf8prober.py index 72c8d3d6a9b..1c0bb5d8fda 100644 --- a/app/src/processing/app/i18n/python/requests/packages/charade/utf8prober.py +++ b/app/src/processing/app/i18n/python/requests/packages/charade/utf8prober.py @@ -1,76 +1,76 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8SMModel - -ONE_CHAR_PROB = 0.5 - - -class UTF8Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(UTF8SMModel) - self.reset() - - def reset(self): - CharSetProber.reset(self) - self._mCodingSM.reset() - self._mNumOfMBChar = 0 - - def get_charset_name(self): - return "utf-8" - - def feed(self, aBuf): - for c in aBuf: - codingState = self._mCodingSM.next_state(c) - if codingState == constants.eError: - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - if self._mCodingSM.get_current_charlen() >= 2: - self._mNumOfMBChar += 1 - - if self.get_state() == constants.eDetecting: - if self.get_confidence() > constants.SHORTCUT_THRESHOLD: - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - unlike = 0.99 - if self._mNumOfMBChar < 6: - for i in range(0, self._mNumOfMBChar): - unlike = unlike * ONE_CHAR_PROB - return 1.0 - unlike - else: - return unlike +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8SMModel + +ONE_CHAR_PROB = 0.5 + + +class UTF8Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(UTF8SMModel) + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mCodingSM.reset() + self._mNumOfMBChar = 0 + + def get_charset_name(self): + return "utf-8" + + def feed(self, aBuf): + for c in aBuf: + codingState = self._mCodingSM.next_state(c) + if codingState == constants.eError: + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + if self._mCodingSM.get_current_charlen() >= 2: + self._mNumOfMBChar += 1 + + if self.get_state() == constants.eDetecting: + if self.get_confidence() > constants.SHORTCUT_THRESHOLD: + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + unlike = 0.99 + if self._mNumOfMBChar < 6: + for i in range(0, self._mNumOfMBChar): + unlike = unlike * ONE_CHAR_PROB + return 1.0 - unlike + else: + return unlike diff --git a/app/src/processing/app/windows/Advapi32.java b/app/src/processing/app/windows/Advapi32.java index 0534d6b2175..203fb74d7ed 100644 --- a/app/src/processing/app/windows/Advapi32.java +++ b/app/src/processing/app/windows/Advapi32.java @@ -1,335 +1,335 @@ -package processing.app.windows; - -/* - * Advapi32.java - * - * Created on 6. August 2007, 11:24 - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -import com.sun.jna.*; -import com.sun.jna.ptr.*; -import com.sun.jna.win32.*; - -/** - * - * @author TB - */ -public interface Advapi32 extends StdCallLibrary { - Advapi32 INSTANCE = (Advapi32) Native.loadLibrary("Advapi32", Advapi32.class, Options.UNICODE_OPTIONS); - -/* -BOOL WINAPI LookupAccountName( - LPCTSTR lpSystemName, - LPCTSTR lpAccountName, - PSID Sid, - LPDWORD cbSid, - LPTSTR ReferencedDomainName, - LPDWORD cchReferencedDomainName, - PSID_NAME_USE peUse -);*/ - public boolean LookupAccountName(String lpSystemName, String lpAccountName, - byte[] Sid, IntByReference cbSid, char[] ReferencedDomainName, - IntByReference cchReferencedDomainName, PointerByReference peUse); - -/* -BOOL WINAPI LookupAccountSid( - LPCTSTR lpSystemName, - PSID lpSid, - LPTSTR lpName, - LPDWORD cchName, - LPTSTR lpReferencedDomainName, - LPDWORD cchReferencedDomainName, - PSID_NAME_USE peUse -);*/ - public boolean LookupAccountSid(String lpSystemName, byte[] Sid, - char[] lpName, IntByReference cchName, char[] ReferencedDomainName, - IntByReference cchReferencedDomainName, PointerByReference peUse); - -/* -BOOL ConvertSidToStringSid( - PSID Sid, - LPTSTR* StringSid -);*/ - public boolean ConvertSidToStringSid(byte[] Sid, PointerByReference StringSid); - -/* -BOOL WINAPI ConvertStringSidToSid( - LPCTSTR StringSid, - PSID* Sid -);*/ - public boolean ConvertStringSidToSid(String StringSid, PointerByReference Sid); - -/* -SC_HANDLE WINAPI OpenSCManager( - LPCTSTR lpMachineName, - LPCTSTR lpDatabaseName, - DWORD dwDesiredAccess -);*/ - public Pointer OpenSCManager(String lpMachineName, WString lpDatabaseName, int dwDesiredAccess); - -/* -BOOL WINAPI CloseServiceHandle( - SC_HANDLE hSCObject -);*/ - public boolean CloseServiceHandle(Pointer hSCObject); - -/* -SC_HANDLE WINAPI OpenService( - SC_HANDLE hSCManager, - LPCTSTR lpServiceName, - DWORD dwDesiredAccess -);*/ - public Pointer OpenService(Pointer hSCManager, String lpServiceName, int dwDesiredAccess); - -/* -BOOL WINAPI StartService( - SC_HANDLE hService, - DWORD dwNumServiceArgs, - LPCTSTR* lpServiceArgVectors -);*/ - public boolean StartService(Pointer hService, int dwNumServiceArgs, char[] lpServiceArgVectors); - -/* -BOOL WINAPI ControlService( - SC_HANDLE hService, - DWORD dwControl, - LPSERVICE_STATUS lpServiceStatus -);*/ - public boolean ControlService(Pointer hService, int dwControl, SERVICE_STATUS lpServiceStatus); - -/* -BOOL WINAPI StartServiceCtrlDispatcher( - const SERVICE_TABLE_ENTRY* lpServiceTable -);*/ - public boolean StartServiceCtrlDispatcher(Structure[] lpServiceTable); - -/* -SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandler( - LPCTSTR lpServiceName, - LPHANDLER_FUNCTION lpHandlerProc -);*/ - public Pointer RegisterServiceCtrlHandler(String lpServiceName, Handler lpHandlerProc); - -/* -SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerEx( - LPCTSTR lpServiceName, - LPHANDLER_FUNCTION_EX lpHandlerProc, - LPVOID lpContext -);*/ - public Pointer RegisterServiceCtrlHandlerEx(String lpServiceName, HandlerEx lpHandlerProc, Pointer lpContext); - -/* -BOOL WINAPI SetServiceStatus( - SERVICE_STATUS_HANDLE hServiceStatus, - LPSERVICE_STATUS lpServiceStatus -);*/ - public boolean SetServiceStatus(Pointer hServiceStatus, SERVICE_STATUS lpServiceStatus); - -/* -SC_HANDLE WINAPI CreateService( - SC_HANDLE hSCManager, - LPCTSTR lpServiceName, - LPCTSTR lpDisplayName, - DWORD dwDesiredAccess, - DWORD dwServiceType, - DWORD dwStartType, - DWORD dwErrorControl, - LPCTSTR lpBinaryPathName, - LPCTSTR lpLoadOrderGroup, - LPDWORD lpdwTagId, - LPCTSTR lpDependencies, - LPCTSTR lpServiceStartName, - LPCTSTR lpPassword -);*/ - public Pointer CreateService(Pointer hSCManager, String lpServiceName, String lpDisplayName, - int dwDesiredAccess, int dwServiceType, int dwStartType, int dwErrorControl, - String lpBinaryPathName, String lpLoadOrderGroup, IntByReference lpdwTagId, - String lpDependencies, String lpServiceStartName, String lpPassword); - -/* -BOOL WINAPI DeleteService( - SC_HANDLE hService -);*/ - public boolean DeleteService(Pointer hService); - -/* -BOOL WINAPI ChangeServiceConfig2( - SC_HANDLE hService, - DWORD dwInfoLevel, - LPVOID lpInfo -);*/ - public boolean ChangeServiceConfig2(Pointer hService, int dwInfoLevel, ChangeServiceConfig2Info lpInfo); - -/* -LONG WINAPI RegOpenKeyEx( - HKEY hKey, - LPCTSTR lpSubKey, - DWORD ulOptions, - REGSAM samDesired, - PHKEY phkResult -);*/ - public int RegOpenKeyEx(int hKey, String lpSubKey, int ulOptions, int samDesired, IntByReference phkResult); - -/* -LONG WINAPI RegQueryValueEx( - HKEY hKey, - LPCTSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData -);*/ - public int RegQueryValueEx(int hKey, String lpValueName, IntByReference lpReserved, IntByReference lpType, byte[] lpData, IntByReference lpcbData); - -/* -LONG WINAPI RegCloseKey( - HKEY hKey -);*/ - public int RegCloseKey(int hKey); - -/* -LONG WINAPI RegDeleteValue( - HKEY hKey, - LPCTSTR lpValueName -);*/ - public int RegDeleteValue(int hKey, String lpValueName); - -/* -LONG WINAPI RegSetValueEx( - HKEY hKey, - LPCTSTR lpValueName, - DWORD Reserved, - DWORD dwType, - const BYTE* lpData, - DWORD cbData -);*/ - public int RegSetValueEx(int hKey, String lpValueName, int Reserved, int dwType, byte[] lpData, int cbData); - -/* -LONG WINAPI RegCreateKeyEx( - HKEY hKey, - LPCTSTR lpSubKey, - DWORD Reserved, - LPTSTR lpClass, - DWORD dwOptions, - REGSAM samDesired, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition -);*/ - public int RegCreateKeyEx(int hKey, String lpSubKey, int Reserved, String lpClass, int dwOptions, - int samDesired, WINBASE.SECURITY_ATTRIBUTES lpSecurityAttributes, IntByReference phkResult, - IntByReference lpdwDisposition); - -/* -LONG WINAPI RegDeleteKey( - HKEY hKey, - LPCTSTR lpSubKey -);*/ - public int RegDeleteKey(int hKey, String name); - -/* -LONG WINAPI RegEnumKeyEx( - HKEY hKey, - DWORD dwIndex, - LPTSTR lpName, - LPDWORD lpcName, - LPDWORD lpReserved, - LPTSTR lpClass, - LPDWORD lpcClass, - PFILETIME lpftLastWriteTime -);*/ - public int RegEnumKeyEx(int hKey, int dwIndex, char[] lpName, IntByReference lpcName, IntByReference reserved, - char[] lpClass, IntByReference lpcClass, WINBASE.FILETIME lpftLastWriteTime); - -/* -LONG WINAPI RegEnumValue( - HKEY hKey, - DWORD dwIndex, - LPTSTR lpValueName, - LPDWORD lpcchValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData -);*/ - public int RegEnumValue(int hKey, int dwIndex, char[] lpValueName, IntByReference lpcchValueName, IntByReference reserved, - IntByReference lpType, byte[] lpData, IntByReference lpcbData); - - interface SERVICE_MAIN_FUNCTION extends StdCallCallback { - /* - VOID WINAPI ServiceMain( - DWORD dwArgc, - LPTSTR* lpszArgv - );*/ - public void callback(int dwArgc, Pointer lpszArgv); - } - - interface Handler extends StdCallCallback { - /* - VOID WINAPI Handler( - DWORD fdwControl - );*/ - public void callback(int fdwControl); - } - - interface HandlerEx extends StdCallCallback { - /* - DWORD WINAPI HandlerEx( - DWORD dwControl, - DWORD dwEventType, - LPVOID lpEventData, - LPVOID lpContext - );*/ - public void callback(int dwControl, int dwEventType, Pointer lpEventData, Pointer lpContext); - } - -/* -typedef struct _SERVICE_STATUS { - DWORD dwServiceType; - DWORD dwCurrentState; - DWORD dwControlsAccepted; - DWORD dwWin32ExitCode; - DWORD dwServiceSpecificExitCode; - DWORD dwCheckPoint; - DWORD dwWaitHint; -} SERVICE_STATUS, - *LPSERVICE_STATUS;*/ - public static class SERVICE_STATUS extends Structure { - public int dwServiceType; - public int dwCurrentState; - public int dwControlsAccepted; - public int dwWin32ExitCode; - public int dwServiceSpecificExitCode; - public int dwCheckPoint; - public int dwWaitHint; - } - -/* -typedef struct _SERVICE_TABLE_ENTRY { - LPTSTR lpServiceName; - LPSERVICE_MAIN_FUNCTION lpServiceProc; -} SERVICE_TABLE_ENTRY, - *LPSERVICE_TABLE_ENTRY;*/ - public static class SERVICE_TABLE_ENTRY extends Structure { - public String lpServiceName; - public SERVICE_MAIN_FUNCTION lpServiceProc; - } - - public static class ChangeServiceConfig2Info extends Structure { - } - -/* - typedef struct _SERVICE_DESCRIPTION { - LPTSTR lpDescription; -} SERVICE_DESCRIPTION, - *LPSERVICE_DESCRIPTION;*/ - public static class SERVICE_DESCRIPTION extends ChangeServiceConfig2Info { - public String lpDescription; - } -} - - +package processing.app.windows; + +/* + * Advapi32.java + * + * Created on 6. August 2007, 11:24 + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +import com.sun.jna.*; +import com.sun.jna.ptr.*; +import com.sun.jna.win32.*; + +/** + * + * @author TB + */ +public interface Advapi32 extends StdCallLibrary { + Advapi32 INSTANCE = (Advapi32) Native.loadLibrary("Advapi32", Advapi32.class, Options.UNICODE_OPTIONS); + +/* +BOOL WINAPI LookupAccountName( + LPCTSTR lpSystemName, + LPCTSTR lpAccountName, + PSID Sid, + LPDWORD cbSid, + LPTSTR ReferencedDomainName, + LPDWORD cchReferencedDomainName, + PSID_NAME_USE peUse +);*/ + public boolean LookupAccountName(String lpSystemName, String lpAccountName, + byte[] Sid, IntByReference cbSid, char[] ReferencedDomainName, + IntByReference cchReferencedDomainName, PointerByReference peUse); + +/* +BOOL WINAPI LookupAccountSid( + LPCTSTR lpSystemName, + PSID lpSid, + LPTSTR lpName, + LPDWORD cchName, + LPTSTR lpReferencedDomainName, + LPDWORD cchReferencedDomainName, + PSID_NAME_USE peUse +);*/ + public boolean LookupAccountSid(String lpSystemName, byte[] Sid, + char[] lpName, IntByReference cchName, char[] ReferencedDomainName, + IntByReference cchReferencedDomainName, PointerByReference peUse); + +/* +BOOL ConvertSidToStringSid( + PSID Sid, + LPTSTR* StringSid +);*/ + public boolean ConvertSidToStringSid(byte[] Sid, PointerByReference StringSid); + +/* +BOOL WINAPI ConvertStringSidToSid( + LPCTSTR StringSid, + PSID* Sid +);*/ + public boolean ConvertStringSidToSid(String StringSid, PointerByReference Sid); + +/* +SC_HANDLE WINAPI OpenSCManager( + LPCTSTR lpMachineName, + LPCTSTR lpDatabaseName, + DWORD dwDesiredAccess +);*/ + public Pointer OpenSCManager(String lpMachineName, WString lpDatabaseName, int dwDesiredAccess); + +/* +BOOL WINAPI CloseServiceHandle( + SC_HANDLE hSCObject +);*/ + public boolean CloseServiceHandle(Pointer hSCObject); + +/* +SC_HANDLE WINAPI OpenService( + SC_HANDLE hSCManager, + LPCTSTR lpServiceName, + DWORD dwDesiredAccess +);*/ + public Pointer OpenService(Pointer hSCManager, String lpServiceName, int dwDesiredAccess); + +/* +BOOL WINAPI StartService( + SC_HANDLE hService, + DWORD dwNumServiceArgs, + LPCTSTR* lpServiceArgVectors +);*/ + public boolean StartService(Pointer hService, int dwNumServiceArgs, char[] lpServiceArgVectors); + +/* +BOOL WINAPI ControlService( + SC_HANDLE hService, + DWORD dwControl, + LPSERVICE_STATUS lpServiceStatus +);*/ + public boolean ControlService(Pointer hService, int dwControl, SERVICE_STATUS lpServiceStatus); + +/* +BOOL WINAPI StartServiceCtrlDispatcher( + const SERVICE_TABLE_ENTRY* lpServiceTable +);*/ + public boolean StartServiceCtrlDispatcher(Structure[] lpServiceTable); + +/* +SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandler( + LPCTSTR lpServiceName, + LPHANDLER_FUNCTION lpHandlerProc +);*/ + public Pointer RegisterServiceCtrlHandler(String lpServiceName, Handler lpHandlerProc); + +/* +SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerEx( + LPCTSTR lpServiceName, + LPHANDLER_FUNCTION_EX lpHandlerProc, + LPVOID lpContext +);*/ + public Pointer RegisterServiceCtrlHandlerEx(String lpServiceName, HandlerEx lpHandlerProc, Pointer lpContext); + +/* +BOOL WINAPI SetServiceStatus( + SERVICE_STATUS_HANDLE hServiceStatus, + LPSERVICE_STATUS lpServiceStatus +);*/ + public boolean SetServiceStatus(Pointer hServiceStatus, SERVICE_STATUS lpServiceStatus); + +/* +SC_HANDLE WINAPI CreateService( + SC_HANDLE hSCManager, + LPCTSTR lpServiceName, + LPCTSTR lpDisplayName, + DWORD dwDesiredAccess, + DWORD dwServiceType, + DWORD dwStartType, + DWORD dwErrorControl, + LPCTSTR lpBinaryPathName, + LPCTSTR lpLoadOrderGroup, + LPDWORD lpdwTagId, + LPCTSTR lpDependencies, + LPCTSTR lpServiceStartName, + LPCTSTR lpPassword +);*/ + public Pointer CreateService(Pointer hSCManager, String lpServiceName, String lpDisplayName, + int dwDesiredAccess, int dwServiceType, int dwStartType, int dwErrorControl, + String lpBinaryPathName, String lpLoadOrderGroup, IntByReference lpdwTagId, + String lpDependencies, String lpServiceStartName, String lpPassword); + +/* +BOOL WINAPI DeleteService( + SC_HANDLE hService +);*/ + public boolean DeleteService(Pointer hService); + +/* +BOOL WINAPI ChangeServiceConfig2( + SC_HANDLE hService, + DWORD dwInfoLevel, + LPVOID lpInfo +);*/ + public boolean ChangeServiceConfig2(Pointer hService, int dwInfoLevel, ChangeServiceConfig2Info lpInfo); + +/* +LONG WINAPI RegOpenKeyEx( + HKEY hKey, + LPCTSTR lpSubKey, + DWORD ulOptions, + REGSAM samDesired, + PHKEY phkResult +);*/ + public int RegOpenKeyEx(int hKey, String lpSubKey, int ulOptions, int samDesired, IntByReference phkResult); + +/* +LONG WINAPI RegQueryValueEx( + HKEY hKey, + LPCTSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData +);*/ + public int RegQueryValueEx(int hKey, String lpValueName, IntByReference lpReserved, IntByReference lpType, byte[] lpData, IntByReference lpcbData); + +/* +LONG WINAPI RegCloseKey( + HKEY hKey +);*/ + public int RegCloseKey(int hKey); + +/* +LONG WINAPI RegDeleteValue( + HKEY hKey, + LPCTSTR lpValueName +);*/ + public int RegDeleteValue(int hKey, String lpValueName); + +/* +LONG WINAPI RegSetValueEx( + HKEY hKey, + LPCTSTR lpValueName, + DWORD Reserved, + DWORD dwType, + const BYTE* lpData, + DWORD cbData +);*/ + public int RegSetValueEx(int hKey, String lpValueName, int Reserved, int dwType, byte[] lpData, int cbData); + +/* +LONG WINAPI RegCreateKeyEx( + HKEY hKey, + LPCTSTR lpSubKey, + DWORD Reserved, + LPTSTR lpClass, + DWORD dwOptions, + REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, + LPDWORD lpdwDisposition +);*/ + public int RegCreateKeyEx(int hKey, String lpSubKey, int Reserved, String lpClass, int dwOptions, + int samDesired, WINBASE.SECURITY_ATTRIBUTES lpSecurityAttributes, IntByReference phkResult, + IntByReference lpdwDisposition); + +/* +LONG WINAPI RegDeleteKey( + HKEY hKey, + LPCTSTR lpSubKey +);*/ + public int RegDeleteKey(int hKey, String name); + +/* +LONG WINAPI RegEnumKeyEx( + HKEY hKey, + DWORD dwIndex, + LPTSTR lpName, + LPDWORD lpcName, + LPDWORD lpReserved, + LPTSTR lpClass, + LPDWORD lpcClass, + PFILETIME lpftLastWriteTime +);*/ + public int RegEnumKeyEx(int hKey, int dwIndex, char[] lpName, IntByReference lpcName, IntByReference reserved, + char[] lpClass, IntByReference lpcClass, WINBASE.FILETIME lpftLastWriteTime); + +/* +LONG WINAPI RegEnumValue( + HKEY hKey, + DWORD dwIndex, + LPTSTR lpValueName, + LPDWORD lpcchValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData +);*/ + public int RegEnumValue(int hKey, int dwIndex, char[] lpValueName, IntByReference lpcchValueName, IntByReference reserved, + IntByReference lpType, byte[] lpData, IntByReference lpcbData); + + interface SERVICE_MAIN_FUNCTION extends StdCallCallback { + /* + VOID WINAPI ServiceMain( + DWORD dwArgc, + LPTSTR* lpszArgv + );*/ + public void callback(int dwArgc, Pointer lpszArgv); + } + + interface Handler extends StdCallCallback { + /* + VOID WINAPI Handler( + DWORD fdwControl + );*/ + public void callback(int fdwControl); + } + + interface HandlerEx extends StdCallCallback { + /* + DWORD WINAPI HandlerEx( + DWORD dwControl, + DWORD dwEventType, + LPVOID lpEventData, + LPVOID lpContext + );*/ + public void callback(int dwControl, int dwEventType, Pointer lpEventData, Pointer lpContext); + } + +/* +typedef struct _SERVICE_STATUS { + DWORD dwServiceType; + DWORD dwCurrentState; + DWORD dwControlsAccepted; + DWORD dwWin32ExitCode; + DWORD dwServiceSpecificExitCode; + DWORD dwCheckPoint; + DWORD dwWaitHint; +} SERVICE_STATUS, + *LPSERVICE_STATUS;*/ + public static class SERVICE_STATUS extends Structure { + public int dwServiceType; + public int dwCurrentState; + public int dwControlsAccepted; + public int dwWin32ExitCode; + public int dwServiceSpecificExitCode; + public int dwCheckPoint; + public int dwWaitHint; + } + +/* +typedef struct _SERVICE_TABLE_ENTRY { + LPTSTR lpServiceName; + LPSERVICE_MAIN_FUNCTION lpServiceProc; +} SERVICE_TABLE_ENTRY, + *LPSERVICE_TABLE_ENTRY;*/ + public static class SERVICE_TABLE_ENTRY extends Structure { + public String lpServiceName; + public SERVICE_MAIN_FUNCTION lpServiceProc; + } + + public static class ChangeServiceConfig2Info extends Structure { + } + +/* + typedef struct _SERVICE_DESCRIPTION { + LPTSTR lpDescription; +} SERVICE_DESCRIPTION, + *LPSERVICE_DESCRIPTION;*/ + public static class SERVICE_DESCRIPTION extends ChangeServiceConfig2Info { + public String lpDescription; + } +} + + diff --git a/app/src/processing/app/windows/Options.java b/app/src/processing/app/windows/Options.java index f5cff28888d..6f5239172a5 100644 --- a/app/src/processing/app/windows/Options.java +++ b/app/src/processing/app/windows/Options.java @@ -1,27 +1,27 @@ -/* - * Options.java - * - * Created on 8. August 2007, 17:07 - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package processing.app.windows; - -import static com.sun.jna.Library.*; -import com.sun.jna.win32.*; -import java.util.*; - -/** - * - * @author TB - */ -public interface Options { - Map UNICODE_OPTIONS = new HashMap() { - { - put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE); - put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE); - } - }; -} +/* + * Options.java + * + * Created on 8. August 2007, 17:07 + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +package processing.app.windows; + +import static com.sun.jna.Library.*; +import com.sun.jna.win32.*; +import java.util.*; + +/** + * + * @author TB + */ +public interface Options { + Map UNICODE_OPTIONS = new HashMap() { + { + put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE); + put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE); + } + }; +} diff --git a/app/src/processing/app/windows/WINBASE.java b/app/src/processing/app/windows/WINBASE.java index c4807cc903c..78a386f0467 100644 --- a/app/src/processing/app/windows/WINBASE.java +++ b/app/src/processing/app/windows/WINBASE.java @@ -1,43 +1,43 @@ -/* - * WINBASE.java - * - * Created on 5. September 2007, 11:24 - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package processing.app.windows; - -import com.sun.jna.Pointer; -import com.sun.jna.Structure; - -/** - * - * @author TB - */ -public interface WINBASE { -/* -typedef struct _SECURITY_ATTRIBUTES { - DWORD nLength; - LPVOID lpSecurityDescriptor; - BOOL bInheritHandle; -} SECURITY_ATTRIBUTES, - *PSECURITY_ATTRIBUTES, - *LPSECURITY_ATTRIBUTES;*/ - public static class SECURITY_ATTRIBUTES extends Structure { - public int nLength; - public Pointer lpSecurityDescriptor; - public boolean bInheritHandle; - } - -/* -typedef struct _FILETIME { - DWORD dwLowDateTime; - DWORD dwHighDateTime; -} FILETIME, *PFILETIME, *LPFILETIME;*/ - public static class FILETIME extends Structure { - public int dwLowDateTime; - public int dwHighDateTime; - } -} +/* + * WINBASE.java + * + * Created on 5. September 2007, 11:24 + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +package processing.app.windows; + +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + +/** + * + * @author TB + */ +public interface WINBASE { +/* +typedef struct _SECURITY_ATTRIBUTES { + DWORD nLength; + LPVOID lpSecurityDescriptor; + BOOL bInheritHandle; +} SECURITY_ATTRIBUTES, + *PSECURITY_ATTRIBUTES, + *LPSECURITY_ATTRIBUTES;*/ + public static class SECURITY_ATTRIBUTES extends Structure { + public int nLength; + public Pointer lpSecurityDescriptor; + public boolean bInheritHandle; + } + +/* +typedef struct _FILETIME { + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} FILETIME, *PFILETIME, *LPFILETIME;*/ + public static class FILETIME extends Structure { + public int dwLowDateTime; + public int dwHighDateTime; + } +} diff --git a/app/src/processing/app/windows/WINERROR.java b/app/src/processing/app/windows/WINERROR.java index 3e1146e93a6..a9382cfcbcf 100644 --- a/app/src/processing/app/windows/WINERROR.java +++ b/app/src/processing/app/windows/WINERROR.java @@ -1,22 +1,22 @@ -/* - * WINERROR.java - * - * Created on 7. August 2007, 08:09 - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package processing.app.windows; - - -/** - * - * @author TB - */ -public interface WINERROR { - public final static int ERROR_SUCCESS = 0; - public final static int NO_ERROR = 0; - public final static int ERROR_FILE_NOT_FOUND = 2; - public final static int ERROR_MORE_DATA = 234; -} +/* + * WINERROR.java + * + * Created on 7. August 2007, 08:09 + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +package processing.app.windows; + + +/** + * + * @author TB + */ +public interface WINERROR { + public final static int ERROR_SUCCESS = 0; + public final static int NO_ERROR = 0; + public final static int ERROR_FILE_NOT_FOUND = 2; + public final static int ERROR_MORE_DATA = 234; +} diff --git a/app/src/processing/app/windows/WINNT.java b/app/src/processing/app/windows/WINNT.java index 89aa3616804..c08c9f5a3fc 100644 --- a/app/src/processing/app/windows/WINNT.java +++ b/app/src/processing/app/windows/WINNT.java @@ -1,73 +1,73 @@ -/* - * WINNT.java - * - * Created on 8. August 2007, 13:41 - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package processing.app.windows; - -/** - * - * @author TB - */ -public interface WINNT { - public final static int DELETE = 0x00010000; - public final static int READ_CONTROL = 0x00020000; - public final static int WRITE_DAC = 0x00040000; - public final static int WRITE_OWNER = 0x00080000; - public final static int SYNCHRONIZE = 0x00100000; - - public final static int STANDARD_RIGHTS_REQUIRED = 0x000F0000; - - public final static int STANDARD_RIGHTS_READ = READ_CONTROL; - public final static int STANDARD_RIGHTS_WRITE = READ_CONTROL; - public final static int STANDARD_RIGHTS_EXECUTE = READ_CONTROL; - - public final static int STANDARD_RIGHTS_ALL = 0x001F0000; - - public final static int SPECIFIC_RIGHTS_ALL = 0x0000FFFF; - - public final static int GENERIC_EXECUTE = 0x20000000; - - public final static int SERVICE_WIN32_OWN_PROCESS = 0x00000010; - - public final static int KEY_QUERY_VALUE = 0x0001; - public final static int KEY_SET_VALUE = 0x0002; - public final static int KEY_CREATE_SUB_KEY = 0x0004; - public final static int KEY_ENUMERATE_SUB_KEYS = 0x0008; - public final static int KEY_NOTIFY = 0x0010; - public final static int KEY_CREATE_LINK = 0x0020; - - public final static int KEY_READ = ((STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIZE)); - public final static int KEY_WRITE = ((STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE)); - - public final static int REG_NONE = 0; // No value type - public final static int REG_SZ = 1; // Unicode nul terminated string - public final static int REG_EXPAND_SZ = 2; // Unicode nul terminated string - // (with environment variable references) - public final static int REG_BINARY = 3; // Free form binary - public final static int REG_DWORD = 4; // 32-bit number - public final static int REG_DWORD_LITTLE_ENDIAN = 4; // 32-bit number (same as REG_DWORD) - public final static int REG_DWORD_BIG_ENDIAN = 5; // 32-bit number - public final static int REG_LINK = 6; // Symbolic Link (unicode) - public final static int REG_MULTI_SZ = 7; // Multiple Unicode strings - public final static int REG_RESOURCE_LIST = 8; // Resource list in the resource map - public final static int REG_FULL_RESOURCE_DESCRIPTOR = 9; // Resource list in the hardware description - public final static int REG_RESOURCE_REQUIREMENTS_LIST = 10; - - public final static int REG_OPTION_RESERVED = 0x00000000; // Parameter is reserved - public final static int REG_OPTION_NON_VOLATILE = 0x00000000; // Key is preserved - // when system is rebooted - public final static int REG_OPTION_VOLATILE = 0x00000001; // Key is not preserved - // when system is rebooted - public final static int REG_OPTION_CREATE_LINK = 0x00000002; // Created key is a - // symbolic link - public final static int REG_OPTION_BACKUP_RESTORE = 0x00000004; // open for backup or restore - // special access rules - // privilege required - public final static int REG_OPTION_OPEN_LINK = 0x00000008; // Open symbolic link - -} +/* + * WINNT.java + * + * Created on 8. August 2007, 13:41 + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +package processing.app.windows; + +/** + * + * @author TB + */ +public interface WINNT { + public final static int DELETE = 0x00010000; + public final static int READ_CONTROL = 0x00020000; + public final static int WRITE_DAC = 0x00040000; + public final static int WRITE_OWNER = 0x00080000; + public final static int SYNCHRONIZE = 0x00100000; + + public final static int STANDARD_RIGHTS_REQUIRED = 0x000F0000; + + public final static int STANDARD_RIGHTS_READ = READ_CONTROL; + public final static int STANDARD_RIGHTS_WRITE = READ_CONTROL; + public final static int STANDARD_RIGHTS_EXECUTE = READ_CONTROL; + + public final static int STANDARD_RIGHTS_ALL = 0x001F0000; + + public final static int SPECIFIC_RIGHTS_ALL = 0x0000FFFF; + + public final static int GENERIC_EXECUTE = 0x20000000; + + public final static int SERVICE_WIN32_OWN_PROCESS = 0x00000010; + + public final static int KEY_QUERY_VALUE = 0x0001; + public final static int KEY_SET_VALUE = 0x0002; + public final static int KEY_CREATE_SUB_KEY = 0x0004; + public final static int KEY_ENUMERATE_SUB_KEYS = 0x0008; + public final static int KEY_NOTIFY = 0x0010; + public final static int KEY_CREATE_LINK = 0x0020; + + public final static int KEY_READ = ((STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIZE)); + public final static int KEY_WRITE = ((STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE)); + + public final static int REG_NONE = 0; // No value type + public final static int REG_SZ = 1; // Unicode nul terminated string + public final static int REG_EXPAND_SZ = 2; // Unicode nul terminated string + // (with environment variable references) + public final static int REG_BINARY = 3; // Free form binary + public final static int REG_DWORD = 4; // 32-bit number + public final static int REG_DWORD_LITTLE_ENDIAN = 4; // 32-bit number (same as REG_DWORD) + public final static int REG_DWORD_BIG_ENDIAN = 5; // 32-bit number + public final static int REG_LINK = 6; // Symbolic Link (unicode) + public final static int REG_MULTI_SZ = 7; // Multiple Unicode strings + public final static int REG_RESOURCE_LIST = 8; // Resource list in the resource map + public final static int REG_FULL_RESOURCE_DESCRIPTOR = 9; // Resource list in the hardware description + public final static int REG_RESOURCE_REQUIREMENTS_LIST = 10; + + public final static int REG_OPTION_RESERVED = 0x00000000; // Parameter is reserved + public final static int REG_OPTION_NON_VOLATILE = 0x00000000; // Key is preserved + // when system is rebooted + public final static int REG_OPTION_VOLATILE = 0x00000001; // Key is not preserved + // when system is rebooted + public final static int REG_OPTION_CREATE_LINK = 0x00000002; // Created key is a + // symbolic link + public final static int REG_OPTION_BACKUP_RESTORE = 0x00000004; // open for backup or restore + // special access rules + // privilege required + public final static int REG_OPTION_OPEN_LINK = 0x00000008; // Open symbolic link + +} diff --git a/app/src/processing/app/windows/WINREG.java b/app/src/processing/app/windows/WINREG.java index 988f7ef3658..07a7c23cb94 100644 --- a/app/src/processing/app/windows/WINREG.java +++ b/app/src/processing/app/windows/WINREG.java @@ -1,21 +1,21 @@ -/* - * WINREG.java - * - * Created on 17. August 2007, 14:32 - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package processing.app.windows; - -/** - * - * @author TB - */ -public interface WINREG { - public final static int HKEY_CLASSES_ROOT = 0x80000000; - public final static int HKEY_CURRENT_USER = 0x80000001; - public final static int HKEY_LOCAL_MACHINE = 0x80000002; - public final static int HKEY_USERS = 0x80000003; -} +/* + * WINREG.java + * + * Created on 17. August 2007, 14:32 + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +package processing.app.windows; + +/** + * + * @author TB + */ +public interface WINREG { + public final static int HKEY_CLASSES_ROOT = 0x80000000; + public final static int HKEY_CURRENT_USER = 0x80000001; + public final static int HKEY_LOCAL_MACHINE = 0x80000002; + public final static int HKEY_USERS = 0x80000003; +} diff --git a/build/shared/lib/arduino_icon.ico b/build/shared/lib/arduino_icon.ico old mode 100755 new mode 100644 diff --git a/build/windows/dist/drivers/Arduino Due Programming Port.inf b/build/windows/dist/drivers/Arduino Due Programming Port.inf index 16200c626d9..bc8882ff6b2 100644 --- a/build/windows/dist/drivers/Arduino Due Programming Port.inf +++ b/build/windows/dist/drivers/Arduino Due Programming Port.inf @@ -1,106 +1,106 @@ -;************************************************************ -; Windows USB CDC ACM Setup File -; Copyright (c) 2000 Microsoft Corporation - - -[Version] -Signature="$Windows NT$" -Class=Ports -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} -Provider=%MFGNAME% -LayoutFile=layout.inf -CatalogFile=%MFGFILENAME%.cat -DriverVer=11/15/2007,5.1.2600.0 - -[Manufacturer] -%MFGNAME%=DeviceList, NTamd64 - -[DestinationDirs] -DefaultDestDir=12 - - -;------------------------------------------------------------------------------ -; Windows 2000/XP/Vista-32bit Sections -;------------------------------------------------------------------------------ - -[DriverInstall.nt] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles.nt -AddReg=DriverInstall.nt.AddReg - -[DriverCopyFiles.nt] -usbser.sys,,,0x20 - -[DriverInstall.nt.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,%DRIVERFILENAME%.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.nt.Services] -AddService=usbser, 0x00000002, DriverService.nt - -[DriverService.nt] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\%DRIVERFILENAME%.sys - -;------------------------------------------------------------------------------ -; Vista-64bit Sections -;------------------------------------------------------------------------------ - -[DriverInstall.NTamd64] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles.NTamd64 -AddReg=DriverInstall.NTamd64.AddReg - -[DriverCopyFiles.NTamd64] -%DRIVERFILENAME%.sys,,,0x20 - -[DriverInstall.NTamd64.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,%DRIVERFILENAME%.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.NTamd64.Services] -AddService=usbser, 0x00000002, DriverService.NTamd64 - -[DriverService.NTamd64] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\%DRIVERFILENAME%.sys - - -;------------------------------------------------------------------------------ -; Vendor and Product ID Definitions -;------------------------------------------------------------------------------ -; When developing your USB device, the VID and PID used in the PC side -; application program and the firmware on the microcontroller must match. -; Modify the below line to use your VID and PID. Use the format as shown below. -; Note: One INF file can be used for multiple devices with different VID and PIDs. -; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. -;------------------------------------------------------------------------------ -[SourceDisksFiles] -[SourceDisksNames] -[DeviceList] -%DESCRIPTION%=DriverInstall, USB\VID_2341&PID_003D - -[DeviceList.NTamd64] -%DESCRIPTION%=DriverInstall, USB\VID_2341&PID_003D - - -;------------------------------------------------------------------------------ -; String Definitions -;------------------------------------------------------------------------------ -;Modify these strings to customize your device -;------------------------------------------------------------------------------ -[Strings] -MFGFILENAME="CDC_vista" -DRIVERFILENAME ="usbser" -MFGNAME="Arduino LLC (www.arduino.cc)" -INSTDISK="Arduino Due Programming Port Driver Installer" -DESCRIPTION="Arduino Due Programming Port" -SERVICE="USB RS-232 Emulation Driver" +;************************************************************ +; Windows USB CDC ACM Setup File +; Copyright (c) 2000 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%MFGNAME% +LayoutFile=layout.inf +CatalogFile=%MFGFILENAME%.cat +DriverVer=11/15/2007,5.1.2600.0 + +[Manufacturer] +%MFGNAME%=DeviceList, NTamd64 + +[DestinationDirs] +DefaultDestDir=12 + + +;------------------------------------------------------------------------------ +; Windows 2000/XP/Vista-32bit Sections +;------------------------------------------------------------------------------ + +[DriverInstall.nt] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles.nt +AddReg=DriverInstall.nt.AddReg + +[DriverCopyFiles.nt] +usbser.sys,,,0x20 + +[DriverInstall.nt.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,%DRIVERFILENAME%.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.nt.Services] +AddService=usbser, 0x00000002, DriverService.nt + +[DriverService.nt] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\%DRIVERFILENAME%.sys + +;------------------------------------------------------------------------------ +; Vista-64bit Sections +;------------------------------------------------------------------------------ + +[DriverInstall.NTamd64] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles.NTamd64 +AddReg=DriverInstall.NTamd64.AddReg + +[DriverCopyFiles.NTamd64] +%DRIVERFILENAME%.sys,,,0x20 + +[DriverInstall.NTamd64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,%DRIVERFILENAME%.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.NTamd64.Services] +AddService=usbser, 0x00000002, DriverService.NTamd64 + +[DriverService.NTamd64] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\%DRIVERFILENAME%.sys + + +;------------------------------------------------------------------------------ +; Vendor and Product ID Definitions +;------------------------------------------------------------------------------ +; When developing your USB device, the VID and PID used in the PC side +; application program and the firmware on the microcontroller must match. +; Modify the below line to use your VID and PID. Use the format as shown below. +; Note: One INF file can be used for multiple devices with different VID and PIDs. +; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. +;------------------------------------------------------------------------------ +[SourceDisksFiles] +[SourceDisksNames] +[DeviceList] +%DESCRIPTION%=DriverInstall, USB\VID_2341&PID_003D + +[DeviceList.NTamd64] +%DESCRIPTION%=DriverInstall, USB\VID_2341&PID_003D + + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ +;Modify these strings to customize your device +;------------------------------------------------------------------------------ +[Strings] +MFGFILENAME="CDC_vista" +DRIVERFILENAME ="usbser" +MFGNAME="Arduino LLC (www.arduino.cc)" +INSTDISK="Arduino Due Programming Port Driver Installer" +DESCRIPTION="Arduino Due Programming Port" +SERVICE="USB RS-232 Emulation Driver" diff --git a/build/windows/dist/drivers/arduino.inf b/build/windows/dist/drivers/arduino.inf index 0b74d96bbb8..25f3cec8760 100644 --- a/build/windows/dist/drivers/arduino.inf +++ b/build/windows/dist/drivers/arduino.inf @@ -1,139 +1,139 @@ -; Copyright 2012 Blacklabel Development, Inc. - -[Strings] -DriverPackageDisplayName="Arduino USB Driver" -ManufacturerName="Arduino LLC (www.arduino.cc)" -ServiceName="USB RS-232 Emulation Driver" -due.bossa.name="Bossa Program Port" -due.programming_port.name="Arduino Due Programming Port" -due.sketch.name="Arduino Due" -esplora.bootloader.name="Arduino Esplora bootloader" -esplora.sketch.name="Arduino Esplora" -leonardo.bootloader.name="Arduino Leonardo bootloader" -leonardo.sketch.name="Arduino Leonardo" -lilypadUSB.bootloader.name="Arduino LilyPad USB bootloader" -lilypadUSB.sketch.name="Arduino LilyPad USB" -mega2560.name="Arduino Mega 2560" -mega2560rev3.name="Arduino Mega 2560" -megaADK.name="Arduino Mega ADK" -megaADKrev3.name="Arduino Mega ADK" -micro.bootloader.name="Arduino Micro bootloader" -micro.sketch.name="Arduino Micro" -uno.name="Arduino Uno" -unoR3.name="Arduino Uno" -usbserial.name="Arduino USB Serial Light Adapter" -robotControl.bootloader.name="Arduino Robot Control bootloader" -robotControl.sketch.name="Arduino Robot" -robotMotor.bootloader.name="Arduino Robot Motor bootloader" -robotMotor.sketch.name="Arduino Robot" - -[DefaultInstall] -CopyINF=arduino.inf - -[Version] -Class=Ports -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} -Signature="$Windows NT$" -Provider=%ManufacturerName% -DriverPackageDisplayName=%DriverPackageDisplayName% -CatalogFile=arduino.cat -DriverVer=01/01/2013,1.0.0.0 - -[Manufacturer] -%ManufacturerName%=DeviceList, NTamd64, NTia64 - -[DestinationDirs] -FakeModemCopyFileSection=12 -DefaultDestDir=12 - -[DeviceList] -%due.bossa.name%=DriverInstall, USB\VID_03EB&PID_6124 -%due.programming_port.name%=DriverInstall, USB\VID_2341&PID_003D -%due.sketch.name%=DriverInstall, USB\VID_2341&PID_003E&MI_00 -%esplora.bootloader.name%=DriverInstall, USB\VID_2341&PID_003C -%esplora.sketch.name%=DriverInstall, USB\VID_2341&PID_803C&MI_00 -%leonardo.bootloader.name%=DriverInstall, USB\VID_2341&PID_0036 -%leonardo.sketch.name%=DriverInstall, USB\VID_2341&PID_8036&MI_00 -%lilypadUSB.bootloader.name%=DriverInstall, USB\VID_1B4F&PID_9207 -%lilypadUSB.sketch.name%=DriverInstall, USB\VID_1B4F&PID_9208&MI_00 -%mega2560rev3.name%=DriverInstall, USB\VID_2341&PID_0042 -%mega2560.name%=DriverInstall, USB\VID_2341&PID_0010 -%megaADK.name%=DriverInstall, USB\VID_2341&PID_003F -%megaADKrev3.name%=DriverInstall, USB\VID_2341&PID_0044 -%micro.bootloader.name%=DriverInstall, USB\VID_2341&PID_0037 -%micro.sketch.name%=DriverInstall, USB\VID_2341&PID_8037&MI_00 -%uno.name%=DriverInstall, USB\VID_2341&PID_0001 -%unoR3.name%=DriverInstall, USB\VID_2341&PID_0043 -%usbserial.name%=DriverInstall, USB\VID_2341&PID_003B -%robotControl.bootloader.name%=DriverInstall, USB\VID_2341&PID_0038 -%robotControl.sketch.name%=DriverInstall, USB\VID_2341&PID_8038&MI_00 -%robotMotor.bootloader.name%=DriverInstall, USB\VID_2341&PID_0039 -%robotMotor.sketch.name%=DriverInstall, USB\VID_2341&PID_8039&MI_00 - -[DeviceList.NTamd64] -%due.bossa.name%=DriverInstall, USB\VID_03EB&PID_6124 -%due.programming_port.name%=DriverInstall, USB\VID_2341&PID_003D -%due.sketch.name%=DriverInstall, USB\VID_2341&PID_003E&MI_00 -%esplora.bootloader.name%=DriverInstall, USB\VID_2341&PID_003C -%esplora.sketch.name%=DriverInstall, USB\VID_2341&PID_803C&MI_00 -%leonardo.bootloader.name%=DriverInstall, USB\VID_2341&PID_0036 -%leonardo.sketch.name%=DriverInstall, USB\VID_2341&PID_8036&MI_00 -%lilypadUSB.bootloader.name%=DriverInstall, USB\VID_1B4F&PID_9207 -%lilypadUSB.sketch.name%=DriverInstall, USB\VID_1B4F&PID_9208&MI_00 -%mega2560rev3.name%=DriverInstall, USB\VID_2341&PID_0042 -%mega2560.name%=DriverInstall, USB\VID_2341&PID_0010 -%megaADK.name%=DriverInstall, USB\VID_2341&PID_003F -%megaADKrev3.name%=DriverInstall, USB\VID_2341&PID_0044 -%micro.bootloader.name%=DriverInstall, USB\VID_2341&PID_0037 -%micro.sketch.name%=DriverInstall, USB\VID_2341&PID_8037&MI_00 -%uno.name%=DriverInstall, USB\VID_2341&PID_0001 -%unoR3.name%=DriverInstall, USB\VID_2341&PID_0043 -%usbserial.name%=DriverInstall, USB\VID_2341&PID_003B -%robotControl.bootloader.name%=DriverInstall, USB\VID_2341&PID_0038 -%robotControl.sketch.name%=DriverInstall, USB\VID_2341&PID_8038&MI_00 -%robotMotor.bootloader.name%=DriverInstall, USB\VID_2341&PID_0039 -%robotMotor.sketch.name%=DriverInstall, USB\VID_2341&PID_8039&MI_00 - -[DeviceList.NTia64] -%esplora.bootloader.name%=DriverInstall, USB\VID_2341&PID_003C -%esplora.sketch.name%=DriverInstall, USB\VID_2341&PID_803C&MI_00 -%leonardo.bootloader.name%=DriverInstall, USB\VID_2341&PID_0036 -%leonardo.sketch.name%=DriverInstall, USB\VID_2341&PID_8036&MI_00 -%lilypadUSB.bootloader.name%=DriverInstall, USB\VID_1B4F&PID_9207 -%lilypadUSB.sketch.name%=DriverInstall, USB\VID_1B4F&PID_9208&MI_00 -%mega2560rev3.name%=DriverInstall, USB\VID_2341&PID_0042 -%mega2560.name%=DriverInstall, USB\VID_2341&PID_0010 -%megaADK.name%=DriverInstall, USB\VID_2341&PID_003F -%megaADKrev3.name%=DriverInstall, USB\VID_2341&PID_0044 -%micro.bootloader.name%=DriverInstall, USB\VID_2341&PID_0037 -%micro.sketch.name%=DriverInstall, USB\VID_2341&PID_8037&MI_00 -%uno.name%=DriverInstall, USB\VID_2341&PID_0001 -%unoR3.name%=DriverInstall, USB\VID_2341&PID_0043 -%usbserial.name%=DriverInstall, USB\VID_2341&PID_003B -%robotControl.bootloader.name%=DriverInstall, USB\VID_2341&PID_0038 -%robotControl.sketch.name%=DriverInstall, USB\VID_2341&PID_8038&MI_00 -%robotMotor.bootloader.name%=DriverInstall, USB\VID_2341&PID_0039 -%robotMotor.sketch.name%=DriverInstall, USB\VID_2341&PID_8039&MI_00 - -[DriverInstall] -include=mdmcpq.inf,usb.inf -CopyFiles = FakeModemCopyFileSection -AddReg=DriverAddReg - -[DriverAddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,usbser.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.Services] -include=mdmcpq.inf -AddService=usbser, 0x00000002, DriverService - -[DriverService] -DisplayName=%ServiceName% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\usbser.sys -LoadOrderGroup=Base - +; Copyright 2012 Blacklabel Development, Inc. + +[Strings] +DriverPackageDisplayName="Arduino USB Driver" +ManufacturerName="Arduino LLC (www.arduino.cc)" +ServiceName="USB RS-232 Emulation Driver" +due.bossa.name="Bossa Program Port" +due.programming_port.name="Arduino Due Programming Port" +due.sketch.name="Arduino Due" +esplora.bootloader.name="Arduino Esplora bootloader" +esplora.sketch.name="Arduino Esplora" +leonardo.bootloader.name="Arduino Leonardo bootloader" +leonardo.sketch.name="Arduino Leonardo" +lilypadUSB.bootloader.name="Arduino LilyPad USB bootloader" +lilypadUSB.sketch.name="Arduino LilyPad USB" +mega2560.name="Arduino Mega 2560" +mega2560rev3.name="Arduino Mega 2560" +megaADK.name="Arduino Mega ADK" +megaADKrev3.name="Arduino Mega ADK" +micro.bootloader.name="Arduino Micro bootloader" +micro.sketch.name="Arduino Micro" +uno.name="Arduino Uno" +unoR3.name="Arduino Uno" +usbserial.name="Arduino USB Serial Light Adapter" +robotControl.bootloader.name="Arduino Robot Control bootloader" +robotControl.sketch.name="Arduino Robot" +robotMotor.bootloader.name="Arduino Robot Motor bootloader" +robotMotor.sketch.name="Arduino Robot" + +[DefaultInstall] +CopyINF=arduino.inf + +[Version] +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Signature="$Windows NT$" +Provider=%ManufacturerName% +DriverPackageDisplayName=%DriverPackageDisplayName% +CatalogFile=arduino.cat +DriverVer=01/01/2013,1.0.0.0 + +[Manufacturer] +%ManufacturerName%=DeviceList, NTamd64, NTia64 + +[DestinationDirs] +FakeModemCopyFileSection=12 +DefaultDestDir=12 + +[DeviceList] +%due.bossa.name%=DriverInstall, USB\VID_03EB&PID_6124 +%due.programming_port.name%=DriverInstall, USB\VID_2341&PID_003D +%due.sketch.name%=DriverInstall, USB\VID_2341&PID_003E&MI_00 +%esplora.bootloader.name%=DriverInstall, USB\VID_2341&PID_003C +%esplora.sketch.name%=DriverInstall, USB\VID_2341&PID_803C&MI_00 +%leonardo.bootloader.name%=DriverInstall, USB\VID_2341&PID_0036 +%leonardo.sketch.name%=DriverInstall, USB\VID_2341&PID_8036&MI_00 +%lilypadUSB.bootloader.name%=DriverInstall, USB\VID_1B4F&PID_9207 +%lilypadUSB.sketch.name%=DriverInstall, USB\VID_1B4F&PID_9208&MI_00 +%mega2560rev3.name%=DriverInstall, USB\VID_2341&PID_0042 +%mega2560.name%=DriverInstall, USB\VID_2341&PID_0010 +%megaADK.name%=DriverInstall, USB\VID_2341&PID_003F +%megaADKrev3.name%=DriverInstall, USB\VID_2341&PID_0044 +%micro.bootloader.name%=DriverInstall, USB\VID_2341&PID_0037 +%micro.sketch.name%=DriverInstall, USB\VID_2341&PID_8037&MI_00 +%uno.name%=DriverInstall, USB\VID_2341&PID_0001 +%unoR3.name%=DriverInstall, USB\VID_2341&PID_0043 +%usbserial.name%=DriverInstall, USB\VID_2341&PID_003B +%robotControl.bootloader.name%=DriverInstall, USB\VID_2341&PID_0038 +%robotControl.sketch.name%=DriverInstall, USB\VID_2341&PID_8038&MI_00 +%robotMotor.bootloader.name%=DriverInstall, USB\VID_2341&PID_0039 +%robotMotor.sketch.name%=DriverInstall, USB\VID_2341&PID_8039&MI_00 + +[DeviceList.NTamd64] +%due.bossa.name%=DriverInstall, USB\VID_03EB&PID_6124 +%due.programming_port.name%=DriverInstall, USB\VID_2341&PID_003D +%due.sketch.name%=DriverInstall, USB\VID_2341&PID_003E&MI_00 +%esplora.bootloader.name%=DriverInstall, USB\VID_2341&PID_003C +%esplora.sketch.name%=DriverInstall, USB\VID_2341&PID_803C&MI_00 +%leonardo.bootloader.name%=DriverInstall, USB\VID_2341&PID_0036 +%leonardo.sketch.name%=DriverInstall, USB\VID_2341&PID_8036&MI_00 +%lilypadUSB.bootloader.name%=DriverInstall, USB\VID_1B4F&PID_9207 +%lilypadUSB.sketch.name%=DriverInstall, USB\VID_1B4F&PID_9208&MI_00 +%mega2560rev3.name%=DriverInstall, USB\VID_2341&PID_0042 +%mega2560.name%=DriverInstall, USB\VID_2341&PID_0010 +%megaADK.name%=DriverInstall, USB\VID_2341&PID_003F +%megaADKrev3.name%=DriverInstall, USB\VID_2341&PID_0044 +%micro.bootloader.name%=DriverInstall, USB\VID_2341&PID_0037 +%micro.sketch.name%=DriverInstall, USB\VID_2341&PID_8037&MI_00 +%uno.name%=DriverInstall, USB\VID_2341&PID_0001 +%unoR3.name%=DriverInstall, USB\VID_2341&PID_0043 +%usbserial.name%=DriverInstall, USB\VID_2341&PID_003B +%robotControl.bootloader.name%=DriverInstall, USB\VID_2341&PID_0038 +%robotControl.sketch.name%=DriverInstall, USB\VID_2341&PID_8038&MI_00 +%robotMotor.bootloader.name%=DriverInstall, USB\VID_2341&PID_0039 +%robotMotor.sketch.name%=DriverInstall, USB\VID_2341&PID_8039&MI_00 + +[DeviceList.NTia64] +%esplora.bootloader.name%=DriverInstall, USB\VID_2341&PID_003C +%esplora.sketch.name%=DriverInstall, USB\VID_2341&PID_803C&MI_00 +%leonardo.bootloader.name%=DriverInstall, USB\VID_2341&PID_0036 +%leonardo.sketch.name%=DriverInstall, USB\VID_2341&PID_8036&MI_00 +%lilypadUSB.bootloader.name%=DriverInstall, USB\VID_1B4F&PID_9207 +%lilypadUSB.sketch.name%=DriverInstall, USB\VID_1B4F&PID_9208&MI_00 +%mega2560rev3.name%=DriverInstall, USB\VID_2341&PID_0042 +%mega2560.name%=DriverInstall, USB\VID_2341&PID_0010 +%megaADK.name%=DriverInstall, USB\VID_2341&PID_003F +%megaADKrev3.name%=DriverInstall, USB\VID_2341&PID_0044 +%micro.bootloader.name%=DriverInstall, USB\VID_2341&PID_0037 +%micro.sketch.name%=DriverInstall, USB\VID_2341&PID_8037&MI_00 +%uno.name%=DriverInstall, USB\VID_2341&PID_0001 +%unoR3.name%=DriverInstall, USB\VID_2341&PID_0043 +%usbserial.name%=DriverInstall, USB\VID_2341&PID_003B +%robotControl.bootloader.name%=DriverInstall, USB\VID_2341&PID_0038 +%robotControl.sketch.name%=DriverInstall, USB\VID_2341&PID_8038&MI_00 +%robotMotor.bootloader.name%=DriverInstall, USB\VID_2341&PID_0039 +%robotMotor.sketch.name%=DriverInstall, USB\VID_2341&PID_8039&MI_00 + +[DriverInstall] +include=mdmcpq.inf,usb.inf +CopyFiles = FakeModemCopyFileSection +AddReg=DriverAddReg + +[DriverAddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.Services] +include=mdmcpq.inf +AddService=usbser, 0x00000002, DriverService + +[DriverService] +DisplayName=%ServiceName% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\usbser.sys +LoadOrderGroup=Base + diff --git a/build/windows/dist/drivers/bossa.inf b/build/windows/dist/drivers/bossa.inf index 1722074f3ad..1d3555f8b92 100755 --- a/build/windows/dist/drivers/bossa.inf +++ b/build/windows/dist/drivers/bossa.inf @@ -1,48 +1,48 @@ -[Version] ; Version section -Signature="$Chicago$" ; All Windows versions -Class=Ports ; This is a serial port driver -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} ; Associated GUID -Provider=%SHUMATECH% ; Driver is provided by SHUMATECH -DriverVer=05/18/2011,1.0 ; Driver version - -[DestinationDirs] ; DestinationDirs section -DefaultDestDir=12 ; Default install directory is \drivers or \IOSubSys - -[Manufacturer] ; Manufacturer section -%SHUMATECH%=ShumaTech,NTamd64 ; Only one manufacturer (SHUMATECH), models section is named - ; ShumaTech - -[ShumaTech] ; Models section corresponding to SHUMATECH -%BOSSA%=BOSSA.Install,USB\VID_03EB&PID_6124 ; Identifies a device with Vendor ID (03EBh) and - ; Product ID equal to 6124h. Corresponding Install section - ; is named BOSSA.Install - -[ShumaTech.NTamd64] ; Models section corresponding to SHUMATECH -%BOSSA%=BOSSA.Install,USB\VID_03EB&PID_6124 ; Identifies a device with Vendor ID (03EBh) and - ; Product ID equal to 6124h. Corresponding Install section - ; is named BOSSA.Install - -[BOSSA.Install] ; Install section -include=mdmcpq.inf -CopyFiles=FakeModemCopyFileSection -AddReg=BOSSA.AddReg ; Registry keys to add are listed in BOSSA.AddReg - -[BOSSA.AddReg] ; AddReg section -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,usbser.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[BOSSA.Install.Services] ; Services section -AddService=usbser,0x00000002,BOSSA.AddService ; Assign usbser as the PnP driver for the device - -[BOSSA.AddService] ; Service install section -DisplayName=%USBSer% ; Name of the serial driver -ServiceType=1 ; Service kernel driver -StartType=3 ; Driver is started by the PnP manager -ErrorControl=1 ; Warn about errors -ServiceBinary=%12%\usbser.sys ; Driver filename - -[Strings] ; Strings section -SHUMATECH="ShumaTech" ; String value for the SHUMATECH symbol -BOSSA="BOSSA Program Port" ; String value for the BOSSA symbol -USBSer="USB Serial Driver" ; String value for the USBSer symbol +[Version] ; Version section +Signature="$Chicago$" ; All Windows versions +Class=Ports ; This is a serial port driver +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} ; Associated GUID +Provider=%SHUMATECH% ; Driver is provided by SHUMATECH +DriverVer=05/18/2011,1.0 ; Driver version + +[DestinationDirs] ; DestinationDirs section +DefaultDestDir=12 ; Default install directory is \drivers or \IOSubSys + +[Manufacturer] ; Manufacturer section +%SHUMATECH%=ShumaTech,NTamd64 ; Only one manufacturer (SHUMATECH), models section is named + ; ShumaTech + +[ShumaTech] ; Models section corresponding to SHUMATECH +%BOSSA%=BOSSA.Install,USB\VID_03EB&PID_6124 ; Identifies a device with Vendor ID (03EBh) and + ; Product ID equal to 6124h. Corresponding Install section + ; is named BOSSA.Install + +[ShumaTech.NTamd64] ; Models section corresponding to SHUMATECH +%BOSSA%=BOSSA.Install,USB\VID_03EB&PID_6124 ; Identifies a device with Vendor ID (03EBh) and + ; Product ID equal to 6124h. Corresponding Install section + ; is named BOSSA.Install + +[BOSSA.Install] ; Install section +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=BOSSA.AddReg ; Registry keys to add are listed in BOSSA.AddReg + +[BOSSA.AddReg] ; AddReg section +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[BOSSA.Install.Services] ; Services section +AddService=usbser,0x00000002,BOSSA.AddService ; Assign usbser as the PnP driver for the device + +[BOSSA.AddService] ; Service install section +DisplayName=%USBSer% ; Name of the serial driver +ServiceType=1 ; Service kernel driver +StartType=3 ; Driver is started by the PnP manager +ErrorControl=1 ; Warn about errors +ServiceBinary=%12%\usbser.sys ; Driver filename + +[Strings] ; Strings section +SHUMATECH="ShumaTech" ; String value for the SHUMATECH symbol +BOSSA="BOSSA Program Port" ; String value for the BOSSA symbol +USBSer="USB Serial Driver" ; String value for the USBSer symbol diff --git a/build/windows/launcher/about.bmp b/build/windows/launcher/about.bmp old mode 100755 new mode 100644 diff --git a/build/windows/launcher/config.xml b/build/windows/launcher/config.xml old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/.classpath b/build/windows/launcher/launch4j/.classpath old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/.project b/build/windows/launcher/launch4j/.project old mode 100755 new mode 100644 index 1c1309dfaf2..0607fa0ec40 --- a/build/windows/launcher/launch4j/.project +++ b/build/windows/launcher/launch4j/.project @@ -1,17 +1,17 @@ - - - launch4j - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - + + + launch4j + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/build/windows/launcher/launch4j/.settings/org.eclipse.jdt.core.prefs b/build/windows/launcher/launch4j/.settings/org.eclipse.jdt.core.prefs old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/LICENSE.txt b/build/windows/launcher/launch4j/LICENSE.txt old mode 100755 new mode 100644 index 82223322f56..0ade5f46f95 --- a/build/windows/launcher/launch4j/LICENSE.txt +++ b/build/windows/launcher/launch4j/LICENSE.txt @@ -1,30 +1,30 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2008 Grzegorz Kowal - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2008 Grzegorz Kowal + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. \ No newline at end of file diff --git a/build/windows/launcher/launch4j/bin/COPYING b/build/windows/launcher/launch4j/bin/COPYING old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/build.xml b/build/windows/launcher/launch4j/build.xml old mode 100755 new mode 100644 index a7682ce0c01..9f528afee6a --- a/build/windows/launcher/launch4j/build.xml +++ b/build/windows/launcher/launch4j/build.xml @@ -1,62 +1,62 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/windows/launcher/launch4j/demo/ConsoleApp/build.bat b/build/windows/launcher/launch4j/demo/ConsoleApp/build.bat index ed5f704e306..928fc900cbd 100755 --- a/build/windows/launcher/launch4j/demo/ConsoleApp/build.bat +++ b/build/windows/launcher/launch4j/demo/ConsoleApp/build.bat @@ -1,14 +1,14 @@ -@echo off -if "%ANT_HOME%"=="" goto noAntHome -if "%JAVA_HOME%"=="" goto noJavaHome -call "%ANT_HOME%\bin\ant.bat" exe -goto end - -:noAntHome -echo ANT_HOME environment variable is not set -goto end - -:noJavaHome -echo JAVA_HOME environment variable is not set - -:end +@echo off +if "%ANT_HOME%"=="" goto noAntHome +if "%JAVA_HOME%"=="" goto noJavaHome +call "%ANT_HOME%\bin\ant.bat" exe +goto end + +:noAntHome +echo ANT_HOME environment variable is not set +goto end + +:noJavaHome +echo JAVA_HOME environment variable is not set + +:end diff --git a/build/windows/launcher/launch4j/demo/ConsoleApp/build.xml b/build/windows/launcher/launch4j/demo/ConsoleApp/build.xml old mode 100755 new mode 100644 index 5f3473da651..e6d5c395be1 --- a/build/windows/launcher/launch4j/demo/ConsoleApp/build.xml +++ b/build/windows/launcher/launch4j/demo/ConsoleApp/build.xml @@ -1,57 +1,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/windows/launcher/launch4j/demo/ConsoleApp/l4j/ConsoleApp.ico b/build/windows/launcher/launch4j/demo/ConsoleApp/l4j/ConsoleApp.ico old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/demo/ConsoleApp/lib/readme.txt b/build/windows/launcher/launch4j/demo/ConsoleApp/lib/readme.txt old mode 100755 new mode 100644 index ef44ded3a1a..a40a6b9c087 --- a/build/windows/launcher/launch4j/demo/ConsoleApp/lib/readme.txt +++ b/build/windows/launcher/launch4j/demo/ConsoleApp/lib/readme.txt @@ -1,8 +1,8 @@ -Put your jar libs here and the build script will include them -in the classpath stored inside the jar manifest. -In order to run your application move the output exe file from -the dist directory to the same level as lib. - -SimpleApp.exe -lib/ -lib/xml.jar +Put your jar libs here and the build script will include them +in the classpath stored inside the jar manifest. +In order to run your application move the output exe file from +the dist directory to the same level as lib. + +SimpleApp.exe +lib/ +lib/xml.jar diff --git a/build/windows/launcher/launch4j/demo/ConsoleApp/readme.txt b/build/windows/launcher/launch4j/demo/ConsoleApp/readme.txt old mode 100755 new mode 100644 index fa38dc8bd2f..f971cd69eaa --- a/build/windows/launcher/launch4j/demo/ConsoleApp/readme.txt +++ b/build/windows/launcher/launch4j/demo/ConsoleApp/readme.txt @@ -1 +1 @@ -To build the example application set JAVA_HOME and ANT_HOME environment variables. +To build the example application set JAVA_HOME and ANT_HOME environment variables. diff --git a/build/windows/launcher/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java b/build/windows/launcher/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java old mode 100755 new mode 100644 index eb1398c2c5f..4bbeb0b9ed2 --- a/build/windows/launcher/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java +++ b/build/windows/launcher/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java @@ -1,72 +1,72 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j.example; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ConsoleApp { - public static void main(String[] args) { - StringBuffer sb = new StringBuffer("Hello World!\n\nJava version: "); - sb.append(System.getProperty("java.version")); - sb.append("\nJava home: "); - sb.append(System.getProperty("java.home")); - sb.append("\nCurrent dir: "); - sb.append(System.getProperty("user.dir")); - if (args.length > 0) { - sb.append("\nArgs: "); - for (int i = 0; i < args.length; i++) { - sb.append(args[i]); - sb.append(' '); - } - } - sb.append("\n\nEnter a line of text, Ctrl-C to stop.\n\n>"); - System.out.print(sb.toString()); - try { - BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); - String line; - while ((line = is.readLine()) != null && !line.equalsIgnoreCase("quit")) { - System.out.print("You wrote: " + line + "\n\n>"); - } - is.close(); - System.exit(123); - } catch (IOException e) { - System.err.print(e); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j.example; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ConsoleApp { + public static void main(String[] args) { + StringBuffer sb = new StringBuffer("Hello World!\n\nJava version: "); + sb.append(System.getProperty("java.version")); + sb.append("\nJava home: "); + sb.append(System.getProperty("java.home")); + sb.append("\nCurrent dir: "); + sb.append(System.getProperty("user.dir")); + if (args.length > 0) { + sb.append("\nArgs: "); + for (int i = 0; i < args.length; i++) { + sb.append(args[i]); + sb.append(' '); + } + } + sb.append("\n\nEnter a line of text, Ctrl-C to stop.\n\n>"); + System.out.print(sb.toString()); + try { + BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); + String line; + while ((line = is.readLine()) != null && !line.equalsIgnoreCase("quit")) { + System.out.print("You wrote: " + line + "\n\n>"); + } + is.close(); + System.exit(123); + } catch (IOException e) { + System.err.print(e); + } + } +} diff --git a/build/windows/launcher/launch4j/demo/LICENSE.txt b/build/windows/launcher/launch4j/demo/LICENSE.txt old mode 100755 new mode 100644 index d6d6bb5eac1..ffa608cbbcd --- a/build/windows/launcher/launch4j/demo/LICENSE.txt +++ b/build/windows/launcher/launch4j/demo/LICENSE.txt @@ -1,30 +1,30 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2007 Grzegorz Kowal - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2007 Grzegorz Kowal + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. \ No newline at end of file diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/build.bat b/build/windows/launcher/launch4j/demo/SimpleApp/build.bat index ed5f704e306..928fc900cbd 100755 --- a/build/windows/launcher/launch4j/demo/SimpleApp/build.bat +++ b/build/windows/launcher/launch4j/demo/SimpleApp/build.bat @@ -1,14 +1,14 @@ -@echo off -if "%ANT_HOME%"=="" goto noAntHome -if "%JAVA_HOME%"=="" goto noJavaHome -call "%ANT_HOME%\bin\ant.bat" exe -goto end - -:noAntHome -echo ANT_HOME environment variable is not set -goto end - -:noJavaHome -echo JAVA_HOME environment variable is not set - -:end +@echo off +if "%ANT_HOME%"=="" goto noAntHome +if "%JAVA_HOME%"=="" goto noJavaHome +call "%ANT_HOME%\bin\ant.bat" exe +goto end + +:noAntHome +echo ANT_HOME environment variable is not set +goto end + +:noJavaHome +echo JAVA_HOME environment variable is not set + +:end diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/build.xml b/build/windows/launcher/launch4j/demo/SimpleApp/build.xml old mode 100755 new mode 100644 index 82f4b49980b..acadbdc01dc --- a/build/windows/launcher/launch4j/demo/SimpleApp/build.xml +++ b/build/windows/launcher/launch4j/demo/SimpleApp/build.xml @@ -1,52 +1,52 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/l4j/SimpleApp.ico b/build/windows/launcher/launch4j/demo/SimpleApp/l4j/SimpleApp.ico old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/l4j/SimpleApp.xml b/build/windows/launcher/launch4j/demo/SimpleApp/l4j/SimpleApp.xml old mode 100755 new mode 100644 index 9a7dc940a62..5bccb0b3e55 --- a/build/windows/launcher/launch4j/demo/SimpleApp/l4j/SimpleApp.xml +++ b/build/windows/launcher/launch4j/demo/SimpleApp/l4j/SimpleApp.xml @@ -1,18 +1,18 @@ - - gui - ../SimpleApp.jar - ../SimpleApp.exe - SimpleApp - . - true - SimpleApp.ico - - 1.4.0 - - - splash.bmp - true - 60 - true - + + gui + ../SimpleApp.jar + ../SimpleApp.exe + SimpleApp + . + true + SimpleApp.ico + + 1.4.0 + + + splash.bmp + true + 60 + true + \ No newline at end of file diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/l4j/splash.bmp b/build/windows/launcher/launch4j/demo/SimpleApp/l4j/splash.bmp old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/lib/readme.txt b/build/windows/launcher/launch4j/demo/SimpleApp/lib/readme.txt old mode 100755 new mode 100644 index ef44ded3a1a..a40a6b9c087 --- a/build/windows/launcher/launch4j/demo/SimpleApp/lib/readme.txt +++ b/build/windows/launcher/launch4j/demo/SimpleApp/lib/readme.txt @@ -1,8 +1,8 @@ -Put your jar libs here and the build script will include them -in the classpath stored inside the jar manifest. -In order to run your application move the output exe file from -the dist directory to the same level as lib. - -SimpleApp.exe -lib/ -lib/xml.jar +Put your jar libs here and the build script will include them +in the classpath stored inside the jar manifest. +In order to run your application move the output exe file from +the dist directory to the same level as lib. + +SimpleApp.exe +lib/ +lib/xml.jar diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/readme.txt b/build/windows/launcher/launch4j/demo/SimpleApp/readme.txt old mode 100755 new mode 100644 index fa38dc8bd2f..f971cd69eaa --- a/build/windows/launcher/launch4j/demo/SimpleApp/readme.txt +++ b/build/windows/launcher/launch4j/demo/SimpleApp/readme.txt @@ -1 +1 @@ -To build the example application set JAVA_HOME and ANT_HOME environment variables. +To build the example application set JAVA_HOME and ANT_HOME environment variables. diff --git a/build/windows/launcher/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java b/build/windows/launcher/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java old mode 100755 new mode 100644 index 8e87c595391..c245c393ffc --- a/build/windows/launcher/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java +++ b/build/windows/launcher/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java @@ -1,104 +1,104 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j.example; - -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.UIManager; - -public class SimpleApp extends JFrame { - public SimpleApp(String[] args) { - super("Java Application"); - final int inset = 100; - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - setBounds (inset, inset, - screenSize.width - inset * 2, screenSize.height - inset * 2); - - JMenu menu = new JMenu("File"); - menu.add(new JMenuItem("Open")); - menu.add(new JMenuItem("Save")); - JMenuBar mb = new JMenuBar(); - mb.setOpaque(true); - mb.add(menu); - setJMenuBar(mb); - - this.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - System.exit(123); - }}); - setVisible(true); - - StringBuffer sb = new StringBuffer("Java version: "); - sb.append(System.getProperty("java.version")); - sb.append("\nJava home: "); - sb.append(System.getProperty("java.home")); - sb.append("\nCurrent dir: "); - sb.append(System.getProperty("user.dir")); - if (args.length > 0) { - sb.append("\nArgs: "); - for (int i = 0; i < args.length; i++) { - sb.append(args[i]); - sb.append(' '); - } - } - JOptionPane.showMessageDialog(this, - sb.toString(), - "Info", - JOptionPane.INFORMATION_MESSAGE); - } - - public static void setLAF() { - JFrame.setDefaultLookAndFeelDecorated(true); - Toolkit.getDefaultToolkit().setDynamicLayout(true); - System.setProperty("sun.awt.noerasebackground","true"); - try { - UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); - } catch (Exception e) { - System.err.println("Failed to set LookAndFeel"); - } - } - - public static void main(String[] args) { - setLAF(); - new SimpleApp(args); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j.example; + +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.UIManager; + +public class SimpleApp extends JFrame { + public SimpleApp(String[] args) { + super("Java Application"); + final int inset = 100; + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + setBounds (inset, inset, + screenSize.width - inset * 2, screenSize.height - inset * 2); + + JMenu menu = new JMenu("File"); + menu.add(new JMenuItem("Open")); + menu.add(new JMenuItem("Save")); + JMenuBar mb = new JMenuBar(); + mb.setOpaque(true); + mb.add(menu); + setJMenuBar(mb); + + this.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(123); + }}); + setVisible(true); + + StringBuffer sb = new StringBuffer("Java version: "); + sb.append(System.getProperty("java.version")); + sb.append("\nJava home: "); + sb.append(System.getProperty("java.home")); + sb.append("\nCurrent dir: "); + sb.append(System.getProperty("user.dir")); + if (args.length > 0) { + sb.append("\nArgs: "); + for (int i = 0; i < args.length; i++) { + sb.append(args[i]); + sb.append(' '); + } + } + JOptionPane.showMessageDialog(this, + sb.toString(), + "Info", + JOptionPane.INFORMATION_MESSAGE); + } + + public static void setLAF() { + JFrame.setDefaultLookAndFeelDecorated(true); + Toolkit.getDefaultToolkit().setDynamicLayout(true); + System.setProperty("sun.awt.noerasebackground","true"); + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + System.err.println("Failed to set LookAndFeel"); + } + } + + public static void main(String[] args) { + setLAF(); + new SimpleApp(args); + } +} diff --git a/build/windows/launcher/launch4j/demo/readme.txt b/build/windows/launcher/launch4j/demo/readme.txt old mode 100755 new mode 100644 index f5917821449..67df9a9212a --- a/build/windows/launcher/launch4j/demo/readme.txt +++ b/build/windows/launcher/launch4j/demo/readme.txt @@ -1,3 +1,3 @@ -JRE/SDK 1.4.0 or higher must be installed on your system to run this demo. - -try running it with some command line arguments... +JRE/SDK 1.4.0 or higher must be installed on your system to run this demo. + +try running it with some command line arguments... diff --git a/build/windows/launcher/launch4j/head/LICENSE.txt b/build/windows/launcher/launch4j/head/LICENSE.txt old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/head_src/LICENSE.txt b/build/windows/launcher/launch4j/head_src/LICENSE.txt old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/head_src/consolehead/Makefile.win b/build/windows/launcher/launch4j/head_src/consolehead/Makefile.win index 349e4c00f5c..23cb75a7c6e 100755 --- a/build/windows/launcher/launch4j/head_src/consolehead/Makefile.win +++ b/build/windows/launcher/launch4j/head_src/consolehead/Makefile.win @@ -1,33 +1,33 @@ -# Project: consolehead -# Makefile created by Dev-C++ 4.9.9.2 - -CPP = g++.exe -CC = gcc.exe -WINDRES = windres.exe -RES = -OBJ = ../../head/consolehead.o ../../head/head.o $(RES) -LINKOBJ = ../../head/consolehead.o ../../head/head.o $(RES) -LIBS = -L"C:/Dev-Cpp/lib" -n -s -INCS = -I"C:/Dev-Cpp/include" -CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -BIN = consolehead.exe -CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 -CFLAGS = $(INCS) -fexpensive-optimizations -O3 -RM = rm -f - -.PHONY: all all-before all-after clean clean-custom - -all: all-before consolehead.exe all-after - - -clean: clean-custom - ${RM} $(OBJ) $(BIN) - -$(BIN): $(OBJ) -# $(CC) $(LINKOBJ) -o "consolehead.exe" $(LIBS) - -../../head/consolehead.o: consolehead.c - $(CC) -c consolehead.c -o ../../head/consolehead.o $(CFLAGS) - -../../head/head.o: ../head.c - $(CC) -c ../head.c -o ../../head/head.o $(CFLAGS) +# Project: consolehead +# Makefile created by Dev-C++ 4.9.9.2 + +CPP = g++.exe +CC = gcc.exe +WINDRES = windres.exe +RES = +OBJ = ../../head/consolehead.o ../../head/head.o $(RES) +LINKOBJ = ../../head/consolehead.o ../../head/head.o $(RES) +LIBS = -L"C:/Dev-Cpp/lib" -n -s +INCS = -I"C:/Dev-Cpp/include" +CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" +BIN = consolehead.exe +CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 +CFLAGS = $(INCS) -fexpensive-optimizations -O3 +RM = rm -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before consolehead.exe all-after + + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) +# $(CC) $(LINKOBJ) -o "consolehead.exe" $(LIBS) + +../../head/consolehead.o: consolehead.c + $(CC) -c consolehead.c -o ../../head/consolehead.o $(CFLAGS) + +../../head/head.o: ../head.c + $(CC) -c ../head.c -o ../../head/head.o $(CFLAGS) diff --git a/build/windows/launcher/launch4j/head_src/consolehead/consolehead.c b/build/windows/launcher/launch4j/head_src/consolehead/consolehead.c old mode 100755 new mode 100644 index 755a7673c10..fbaea0d4736 --- a/build/windows/launcher/launch4j/head_src/consolehead/consolehead.c +++ b/build/windows/launcher/launch4j/head_src/consolehead/consolehead.c @@ -1,65 +1,65 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - 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. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - 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 - AUTHORS OR COPYRIGHT HOLDERS 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. -*/ - -#include "../resource.h" -#include "../head.h" - -int main(int argc, char* argv[]) -{ - setConsoleFlag(); - LPTSTR cmdLine = GetCommandLine(); - if (*cmdLine == '"') { - if (*(cmdLine = strchr(cmdLine + 1, '"') + 1)) { - cmdLine++; - } - } else if ((cmdLine = strchr(cmdLine, ' ')) != NULL) { - cmdLine++; - } else { - cmdLine = ""; - } - int result = prepare(cmdLine); - if (result == ERROR_ALREADY_EXISTS) { - char errMsg[BIG_STR] = {0}; - loadString(INSTANCE_ALREADY_EXISTS_MSG, errMsg); - msgBox(errMsg); - closeLogFile(); - return 2; - } - if (result != TRUE) { - signalError(); - return 1; - } - - result = (int) execute(TRUE); - if (result == -1) { - signalError(); - } else { - return result; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + 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. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + 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 + AUTHORS OR COPYRIGHT HOLDERS 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. +*/ + +#include "../resource.h" +#include "../head.h" + +int main(int argc, char* argv[]) +{ + setConsoleFlag(); + LPTSTR cmdLine = GetCommandLine(); + if (*cmdLine == '"') { + if (*(cmdLine = strchr(cmdLine + 1, '"') + 1)) { + cmdLine++; + } + } else if ((cmdLine = strchr(cmdLine, ' ')) != NULL) { + cmdLine++; + } else { + cmdLine = ""; + } + int result = prepare(cmdLine); + if (result == ERROR_ALREADY_EXISTS) { + char errMsg[BIG_STR] = {0}; + loadString(INSTANCE_ALREADY_EXISTS_MSG, errMsg); + msgBox(errMsg); + closeLogFile(); + return 2; + } + if (result != TRUE) { + signalError(); + return 1; + } + + result = (int) execute(TRUE); + if (result == -1) { + signalError(); + } else { + return result; + } +} diff --git a/build/windows/launcher/launch4j/head_src/consolehead/consolehead.dev b/build/windows/launcher/launch4j/head_src/consolehead/consolehead.dev index a309ec94f65..2f2991a6f0a 100755 --- a/build/windows/launcher/launch4j/head_src/consolehead/consolehead.dev +++ b/build/windows/launcher/launch4j/head_src/consolehead/consolehead.dev @@ -1,108 +1,108 @@ -[Project] -FileName=consolehead.dev -Name=consolehead -UnitCount=4 -Type=1 -Ver=1 -ObjFiles= -Includes= -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=-n_@@_ -IsCpp=0 -Icon= -ExeOutput= -ObjectOutput=..\..\head -OverrideOutput=0 -OverrideOutputName=consolehead.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile=Makefile.win -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000000001001000000100 - -[Unit1] -FileName=consolehead.c -CompileCpp=0 -Folder=consolehead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - -[Unit2] -FileName=..\resource.h -CompileCpp=0 -Folder=consolehead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit3] -FileName=..\head.c -CompileCpp=0 -Folder=consolehead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit4] -FileName=..\head.h -CompileCpp=0 -Folder=consolehead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit5] -FileName=..\head.rc -Folder=consolehead -Compile=1 -Link=0 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit6] -FileName=..\resid.h -CompileCpp=0 -Folder=consolehead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - +[Project] +FileName=consolehead.dev +Name=consolehead +UnitCount=4 +Type=1 +Ver=1 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker=-n_@@_ +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput=..\..\head +OverrideOutput=0 +OverrideOutputName=consolehead.exe +HostApplication= +Folders= +CommandLine= +UseCustomMakefile=0 +CustomMakefile=Makefile.win +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=0 +CompilerSettings=0000000001001000000100 + +[Unit1] +FileName=consolehead.c +CompileCpp=0 +Folder=consolehead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[VersionInfo] +Major=0 +Minor=1 +Release=1 +Build=1 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 + +[Unit2] +FileName=..\resource.h +CompileCpp=0 +Folder=consolehead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=..\head.c +CompileCpp=0 +Folder=consolehead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=..\head.h +CompileCpp=0 +Folder=consolehead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=..\head.rc +Folder=consolehead +Compile=1 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=..\resid.h +CompileCpp=0 +Folder=consolehead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/build/windows/launcher/launch4j/head_src/guihead/Makefile.win b/build/windows/launcher/launch4j/head_src/guihead/Makefile.win index 3c642f8fcf7..92f7f67dae3 100755 --- a/build/windows/launcher/launch4j/head_src/guihead/Makefile.win +++ b/build/windows/launcher/launch4j/head_src/guihead/Makefile.win @@ -1,38 +1,38 @@ -# Project: guihead -# Makefile created by Dev-C++ 4.9.9.2 - -CPP = g++.exe -CC = gcc.exe -WINDRES = windres.exe -RES = -OBJ = ../../head/guihead.o ../../head/head.o $(RES) -LINKOBJ = ../../head/guihead.o ../../head/head.o $(RES) - -# removed dev-cpp flags, replacing for cygwin/mingw [fry] -CXXFLAGS = -mwindows -mno-cygwin -O2 -Wall -CFLAGS = -mwindows -mno-cygwin -O2 -Wall -#CFLAGS = -I/cygdrive/c/cygwin/usr/include/mingw -#LIBS = -L"C:/Dev-Cpp/lib" -mwindows -n -s -#INCS = -I"C:/Dev-Cpp/include" -#CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -BIN = guihead.exe -#CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 -#CFLAGS = $(INCS) -fexpensive-optimizations -O3 -RM = rm -f - -.PHONY: all all-before all-after clean clean-custom - -all: all-before guihead.exe all-after - - -clean: clean-custom - ${RM} $(OBJ) $(BIN) - -$(BIN): $(OBJ) -# $(CC) $(LINKOBJ) -o "guihead.exe" $(LIBS) - -../../head/guihead.o: guihead.c - $(CC) -c guihead.c -o ../../head/guihead.o $(CFLAGS) - -../../head/head.o: ../head.c - $(CC) -c ../head.c -o ../../head/head.o $(CFLAGS) +# Project: guihead +# Makefile created by Dev-C++ 4.9.9.2 + +CPP = g++.exe +CC = gcc.exe +WINDRES = windres.exe +RES = +OBJ = ../../head/guihead.o ../../head/head.o $(RES) +LINKOBJ = ../../head/guihead.o ../../head/head.o $(RES) + +# removed dev-cpp flags, replacing for cygwin/mingw [fry] +CXXFLAGS = -mwindows -mno-cygwin -O2 -Wall +CFLAGS = -mwindows -mno-cygwin -O2 -Wall +#CFLAGS = -I/cygdrive/c/cygwin/usr/include/mingw +#LIBS = -L"C:/Dev-Cpp/lib" -mwindows -n -s +#INCS = -I"C:/Dev-Cpp/include" +#CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" +BIN = guihead.exe +#CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 +#CFLAGS = $(INCS) -fexpensive-optimizations -O3 +RM = rm -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before guihead.exe all-after + + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) +# $(CC) $(LINKOBJ) -o "guihead.exe" $(LIBS) + +../../head/guihead.o: guihead.c + $(CC) -c guihead.c -o ../../head/guihead.o $(CFLAGS) + +../../head/head.o: ../head.c + $(CC) -c ../head.c -o ../../head/head.o $(CFLAGS) diff --git a/build/windows/launcher/launch4j/head_src/guihead/guihead.c b/build/windows/launcher/launch4j/head_src/guihead/guihead.c old mode 100755 new mode 100644 index 508a5bdacbf..d58fe9a2ba8 --- a/build/windows/launcher/launch4j/head_src/guihead/guihead.c +++ b/build/windows/launcher/launch4j/head_src/guihead/guihead.c @@ -1,185 +1,185 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - Sylvain Mina (single instance patch) - - 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. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - 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 - AUTHORS OR COPYRIGHT HOLDERS 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. -*/ - -#include "../resource.h" -#include "../head.h" -#include "guihead.h" - -extern FILE* hLog; -extern PROCESS_INFORMATION pi; - -HWND hWnd; -DWORD dwExitCode = 0; -BOOL stayAlive = FALSE; -BOOL splash = FALSE; -BOOL splashTimeoutErr; -BOOL waitForWindow; -int splashTimeout = DEFAULT_SPLASH_TIMEOUT; - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) { - int result = prepare(lpCmdLine); - if (result == ERROR_ALREADY_EXISTS) { - HWND handle = getInstanceWindow(); - ShowWindow(handle, SW_SHOW); - SetForegroundWindow(handle); - closeLogFile(); - return 2; - } - if (result != TRUE) { - signalError(); - return 1; - } - - splash = loadBool(SHOW_SPLASH) - && strstr(lpCmdLine, "--l4j-no-splash") == NULL; - stayAlive = loadBool(GUI_HEADER_STAYS_ALIVE) - && strstr(lpCmdLine, "--l4j-dont-wait") == NULL; - if (splash || stayAlive) { - hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "", - WS_POPUP | SS_BITMAP, - 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); - if (splash) { - char timeout[10] = {0}; - if (loadString(SPLASH_TIMEOUT, timeout)) { - splashTimeout = atoi(timeout); - if (splashTimeout <= 0 || splashTimeout > MAX_SPLASH_TIMEOUT) { - splashTimeout = DEFAULT_SPLASH_TIMEOUT; - } - } - splashTimeoutErr = loadBool(SPLASH_TIMEOUT_ERR) - && strstr(lpCmdLine, "--l4j-no-splash-err") == NULL; - waitForWindow = loadBool(SPLASH_WAITS_FOR_WINDOW); - HANDLE hImage = LoadImage(hInstance, // handle of the instance containing the image - MAKEINTRESOURCE(SPLASH_BITMAP), // name or identifier of image - IMAGE_BITMAP, // type of image - 0, // desired width - 0, // desired height - LR_DEFAULTSIZE); - if (hImage == NULL) { - signalError(); - return 1; - } - SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage); - RECT rect; - GetWindowRect(hWnd, &rect); - int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; - int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; - SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); - ShowWindow(hWnd, nCmdShow); - UpdateWindow (hWnd); - } - if (!SetTimer (hWnd, ID_TIMER, 1000 /* 1s */, TimerProc)) { - signalError(); - return 1; - } - } - if (execute(FALSE) == -1) { - signalError(); - return 1; - } - if (!(splash || stayAlive)) { - debug("Exit code:\t0\n"); - closeHandles(); - return 0; - } - - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - debug("Exit code:\t%d\n", dwExitCode); - closeHandles(); - return dwExitCode; -} - -HWND getInstanceWindow() { - char windowTitle[STR]; - char instWindowTitle[STR] = {0}; - if (loadString(INSTANCE_WINDOW_TITLE, instWindowTitle)) { - HWND handle = FindWindowEx(NULL, NULL, NULL, NULL); - while (handle != NULL) { - GetWindowText(handle, windowTitle, STR - 1); - if (strstr(windowTitle, instWindowTitle) != NULL) { - return handle; - } else { - handle = FindWindowEx(NULL, handle, NULL, NULL); - } - } - } - return NULL; -} - -BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) { - DWORD processId; - GetWindowThreadProcessId(hwnd, &processId); - if (pi.dwProcessId == processId) { - LONG styles = GetWindowLong(hwnd, GWL_STYLE); - if ((styles & WS_VISIBLE) != 0) { - splash = FALSE; - ShowWindow(hWnd, SW_HIDE); - return FALSE; - } - } - return TRUE; -} - -VOID CALLBACK TimerProc( - HWND hwnd, // handle of window for timer messages - UINT uMsg, // WM_TIMER message - UINT idEvent, // timer identifier - DWORD dwTime) { // current system time - - if (splash) { - if (splashTimeout == 0) { - splash = FALSE; - ShowWindow(hWnd, SW_HIDE); - if (waitForWindow && splashTimeoutErr) { - KillTimer(hwnd, ID_TIMER); - signalError(); - PostQuitMessage(0); - } - } else { - splashTimeout--; - if (waitForWindow) { - EnumWindows(enumwndfn, 0); - } - } - } - GetExitCodeProcess(pi.hProcess, &dwExitCode); - if (dwExitCode != STILL_ACTIVE - || !(splash || stayAlive)) { - KillTimer(hWnd, ID_TIMER); - PostQuitMessage(0); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + Sylvain Mina (single instance patch) + + 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. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + 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 + AUTHORS OR COPYRIGHT HOLDERS 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. +*/ + +#include "../resource.h" +#include "../head.h" +#include "guihead.h" + +extern FILE* hLog; +extern PROCESS_INFORMATION pi; + +HWND hWnd; +DWORD dwExitCode = 0; +BOOL stayAlive = FALSE; +BOOL splash = FALSE; +BOOL splashTimeoutErr; +BOOL waitForWindow; +int splashTimeout = DEFAULT_SPLASH_TIMEOUT; + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) { + int result = prepare(lpCmdLine); + if (result == ERROR_ALREADY_EXISTS) { + HWND handle = getInstanceWindow(); + ShowWindow(handle, SW_SHOW); + SetForegroundWindow(handle); + closeLogFile(); + return 2; + } + if (result != TRUE) { + signalError(); + return 1; + } + + splash = loadBool(SHOW_SPLASH) + && strstr(lpCmdLine, "--l4j-no-splash") == NULL; + stayAlive = loadBool(GUI_HEADER_STAYS_ALIVE) + && strstr(lpCmdLine, "--l4j-dont-wait") == NULL; + if (splash || stayAlive) { + hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "", + WS_POPUP | SS_BITMAP, + 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); + if (splash) { + char timeout[10] = {0}; + if (loadString(SPLASH_TIMEOUT, timeout)) { + splashTimeout = atoi(timeout); + if (splashTimeout <= 0 || splashTimeout > MAX_SPLASH_TIMEOUT) { + splashTimeout = DEFAULT_SPLASH_TIMEOUT; + } + } + splashTimeoutErr = loadBool(SPLASH_TIMEOUT_ERR) + && strstr(lpCmdLine, "--l4j-no-splash-err") == NULL; + waitForWindow = loadBool(SPLASH_WAITS_FOR_WINDOW); + HANDLE hImage = LoadImage(hInstance, // handle of the instance containing the image + MAKEINTRESOURCE(SPLASH_BITMAP), // name or identifier of image + IMAGE_BITMAP, // type of image + 0, // desired width + 0, // desired height + LR_DEFAULTSIZE); + if (hImage == NULL) { + signalError(); + return 1; + } + SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage); + RECT rect; + GetWindowRect(hWnd, &rect); + int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; + int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; + SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); + ShowWindow(hWnd, nCmdShow); + UpdateWindow (hWnd); + } + if (!SetTimer (hWnd, ID_TIMER, 1000 /* 1s */, TimerProc)) { + signalError(); + return 1; + } + } + if (execute(FALSE) == -1) { + signalError(); + return 1; + } + if (!(splash || stayAlive)) { + debug("Exit code:\t0\n"); + closeHandles(); + return 0; + } + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + debug("Exit code:\t%d\n", dwExitCode); + closeHandles(); + return dwExitCode; +} + +HWND getInstanceWindow() { + char windowTitle[STR]; + char instWindowTitle[STR] = {0}; + if (loadString(INSTANCE_WINDOW_TITLE, instWindowTitle)) { + HWND handle = FindWindowEx(NULL, NULL, NULL, NULL); + while (handle != NULL) { + GetWindowText(handle, windowTitle, STR - 1); + if (strstr(windowTitle, instWindowTitle) != NULL) { + return handle; + } else { + handle = FindWindowEx(NULL, handle, NULL, NULL); + } + } + } + return NULL; +} + +BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) { + DWORD processId; + GetWindowThreadProcessId(hwnd, &processId); + if (pi.dwProcessId == processId) { + LONG styles = GetWindowLong(hwnd, GWL_STYLE); + if ((styles & WS_VISIBLE) != 0) { + splash = FALSE; + ShowWindow(hWnd, SW_HIDE); + return FALSE; + } + } + return TRUE; +} + +VOID CALLBACK TimerProc( + HWND hwnd, // handle of window for timer messages + UINT uMsg, // WM_TIMER message + UINT idEvent, // timer identifier + DWORD dwTime) { // current system time + + if (splash) { + if (splashTimeout == 0) { + splash = FALSE; + ShowWindow(hWnd, SW_HIDE); + if (waitForWindow && splashTimeoutErr) { + KillTimer(hwnd, ID_TIMER); + signalError(); + PostQuitMessage(0); + } + } else { + splashTimeout--; + if (waitForWindow) { + EnumWindows(enumwndfn, 0); + } + } + } + GetExitCodeProcess(pi.hProcess, &dwExitCode); + if (dwExitCode != STILL_ACTIVE + || !(splash || stayAlive)) { + KillTimer(hWnd, ID_TIMER); + PostQuitMessage(0); + } +} diff --git a/build/windows/launcher/launch4j/head_src/guihead/guihead.dev b/build/windows/launcher/launch4j/head_src/guihead/guihead.dev index 7c30088f11b..3addd6ff10f 100755 --- a/build/windows/launcher/launch4j/head_src/guihead/guihead.dev +++ b/build/windows/launcher/launch4j/head_src/guihead/guihead.dev @@ -1,109 +1,109 @@ -[Project] -FileName=guihead.dev -Name=guihead -UnitCount=5 -Type=0 -Ver=1 -ObjFiles= -Includes= -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=-n_@@_ -IsCpp=0 -Icon= -ExeOutput= -ObjectOutput=..\..\head -OverrideOutput=0 -OverrideOutputName=guihead.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=1 -CustomMakefile=Makefile.win -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000000001001000000100 - -[Unit1] -FileName=guihead.c -CompileCpp=0 -Folder=guihead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd=$(CC) -c guihead.c -o ../../head/guihead.o $(CFLAGS) - -[Unit2] -FileName=guihead.h -CompileCpp=0 -Folder=guihead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - -[Unit4] -FileName=..\head.h -CompileCpp=0 -Folder=guihead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit6] -FileName=..\resid.h -CompileCpp=0 -Folder=guihead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit3] -FileName=..\head.c -CompileCpp=0 -Folder=guihead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit5] -FileName=..\resource.h -CompileCpp=0 -Folder=guihead -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - +[Project] +FileName=guihead.dev +Name=guihead +UnitCount=5 +Type=0 +Ver=1 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker=-n_@@_ +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput=..\..\head +OverrideOutput=0 +OverrideOutputName=guihead.exe +HostApplication= +Folders= +CommandLine= +UseCustomMakefile=1 +CustomMakefile=Makefile.win +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=0 +CompilerSettings=0000000001001000000100 + +[Unit1] +FileName=guihead.c +CompileCpp=0 +Folder=guihead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c guihead.c -o ../../head/guihead.o $(CFLAGS) + +[Unit2] +FileName=guihead.h +CompileCpp=0 +Folder=guihead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[VersionInfo] +Major=0 +Minor=1 +Release=1 +Build=1 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 + +[Unit4] +FileName=..\head.h +CompileCpp=0 +Folder=guihead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=..\resid.h +CompileCpp=0 +Folder=guihead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=..\head.c +CompileCpp=0 +Folder=guihead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=..\resource.h +CompileCpp=0 +Folder=guihead +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/build/windows/launcher/launch4j/head_src/guihead/guihead.h b/build/windows/launcher/launch4j/head_src/guihead/guihead.h old mode 100755 new mode 100644 index 2fc71e31f32..ebef39629e9 --- a/build/windows/launcher/launch4j/head_src/guihead/guihead.h +++ b/build/windows/launcher/launch4j/head_src/guihead/guihead.h @@ -1,43 +1,43 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - 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. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - 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 - AUTHORS OR COPYRIGHT HOLDERS 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. -*/ - -#define ID_TIMER 1 -#define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ -#define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ - -HWND getInstanceWindow(); - -BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); - -VOID CALLBACK TimerProc( - HWND hwnd, // handle of window for timer messages - UINT uMsg, // WM_TIMER message - UINT idEvent, // timer identifier - DWORD dwTime // current system time -); +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + 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. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + 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 + AUTHORS OR COPYRIGHT HOLDERS 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. +*/ + +#define ID_TIMER 1 +#define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ +#define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ + +HWND getInstanceWindow(); + +BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); + +VOID CALLBACK TimerProc( + HWND hwnd, // handle of window for timer messages + UINT uMsg, // WM_TIMER message + UINT idEvent, // timer identifier + DWORD dwTime // current system time +); diff --git a/build/windows/launcher/launch4j/head_src/head.c b/build/windows/launcher/launch4j/head_src/head.c old mode 100755 new mode 100644 index 1ff937694dc..73e215deccc --- a/build/windows/launcher/launch4j/head_src/head.c +++ b/build/windows/launcher/launch4j/head_src/head.c @@ -1,818 +1,818 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2008 Grzegorz Kowal, - Ian Roberts (jdk preference patch) - Sylvain Mina (single instance patch) - - 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. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - 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 - AUTHORS OR COPYRIGHT HOLDERS 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. -*/ - -#include "resource.h" -#include "head.h" - -HMODULE hModule; -FILE* hLog; -BOOL console = FALSE; -BOOL wow64 = FALSE; -int foundJava = NO_JAVA_FOUND; - -struct _stat statBuf; -PROCESS_INFORMATION pi; -DWORD priority; - -char mutexName[STR] = {0}; - -char errUrl[256] = {0}; -char errTitle[STR] = "Launch4j"; -char errMsg[BIG_STR] = {0}; - -char javaMinVer[STR] = {0}; -char javaMaxVer[STR] = {0}; -char foundJavaVer[STR] = {0}; -char foundJavaKey[_MAX_PATH] = {0}; - -char oldPwd[_MAX_PATH] = {0}; -char workingDir[_MAX_PATH] = {0}; -char cmd[_MAX_PATH] = {0}; -char args[MAX_ARGS] = {0}; - -FILE* openLogFile(const char* exePath, const int pathLen) { - char path[_MAX_PATH] = {0}; - strncpy(path, exePath, pathLen); - strcat(path, "\\launch4j.log"); - return fopen(path, "a"); -} - -void closeLogFile() { - if (hLog != NULL) { - fclose(hLog); - } -} - -void setWow64Flag() { - LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( - GetModuleHandle(TEXT("kernel32")), "IsWow64Process"); - - if (fnIsWow64Process != NULL) { - fnIsWow64Process(GetCurrentProcess(), &wow64); - } - debug("WOW64:\t\t%s\n", wow64 ? "yes" : "no"); -} - -void setConsoleFlag() { - console = TRUE; -} - -void msgBox(const char* text) { - if (console) { - printf("%s: %s\n", errTitle, text); - } else { - MessageBox(NULL, text, errTitle, MB_OK); - } -} - -void signalError() { - DWORD err = GetLastError(); - if (err) { - LPVOID lpMsgBuf; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - err, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL); - debug("Error:\t\t%s\n", (LPCTSTR) lpMsgBuf); - strcat(errMsg, "\n\n"); - strcat(errMsg, (LPCTSTR) lpMsgBuf); - msgBox(errMsg); - LocalFree(lpMsgBuf); - } else { - msgBox(errMsg); - } - if (*errUrl) { - debug("Open URL:\t%s\n", errUrl); - ShellExecute(NULL, "open", errUrl, NULL, NULL, SW_SHOWNORMAL); - } - closeLogFile(); -} - -BOOL loadString(const int resID, char* buffer) { - HRSRC hResource; - HGLOBAL hResourceLoaded; - LPBYTE lpBuffer; - - hResource = FindResourceEx(hModule, RT_RCDATA, MAKEINTRESOURCE(resID), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)); - if (NULL != hResource) { - hResourceLoaded = LoadResource(hModule, hResource); - if (NULL != hResourceLoaded) { - lpBuffer = (LPBYTE) LockResource(hResourceLoaded); - if (NULL != lpBuffer) { - int x = 0; - do { - buffer[x] = (char) lpBuffer[x]; - } while (buffer[x++] != 0); - // debug("Resource %d:\t%s\n", resID, buffer); - return TRUE; - } - } - } else { - SetLastError(0); - } - return FALSE; -} - -BOOL loadBool(const int resID) { - char boolStr[20] = {0}; - loadString(resID, boolStr); - return strcmp(boolStr, TRUE_STR) == 0; -} - -int loadInt(const int resID) { - char intStr[20] = {0}; - loadString(resID, intStr); - return atoi(intStr); -} - -BOOL regQueryValue(const char* regPath, unsigned char* buffer, - unsigned long bufferLength) { - HKEY hRootKey; - char* key; - char* value; - if (strstr(regPath, HKEY_CLASSES_ROOT_STR) == regPath) { - hRootKey = HKEY_CLASSES_ROOT; - } else if (strstr(regPath, HKEY_CURRENT_USER_STR) == regPath) { - hRootKey = HKEY_CURRENT_USER; - } else if (strstr(regPath, HKEY_LOCAL_MACHINE_STR) == regPath) { - hRootKey = HKEY_LOCAL_MACHINE; - } else if (strstr(regPath, HKEY_USERS_STR) == regPath) { - hRootKey = HKEY_USERS; - } else if (strstr(regPath, HKEY_CURRENT_CONFIG_STR) == regPath) { - hRootKey = HKEY_CURRENT_CONFIG; - } else { - return FALSE; - } - key = strchr(regPath, '\\') + 1; - value = strrchr(regPath, '\\') + 1; - *(value - 1) = 0; - - HKEY hKey; - unsigned long datatype; - BOOL result = FALSE; - if ((wow64 && RegOpenKeyEx(hRootKey, - key, - 0, - KEY_READ | KEY_WOW64_64KEY, - &hKey) == ERROR_SUCCESS) - || RegOpenKeyEx(hRootKey, - key, - 0, - KEY_READ, - &hKey) == ERROR_SUCCESS) { - result = RegQueryValueEx(hKey, value, NULL, &datatype, buffer, &bufferLength) - == ERROR_SUCCESS; - RegCloseKey(hKey); - } - *(value - 1) = '\\'; - return result; -} - -void regSearch(const HKEY hKey, const char* keyName, const int searchType) { - DWORD x = 0; - unsigned long size = BIG_STR; - FILETIME time; - char buffer[BIG_STR] = {0}; - while (RegEnumKeyEx( - hKey, // handle to key to enumerate - x++, // index of subkey to enumerate - buffer, // address of buffer for subkey name - &size, // address for size of subkey buffer - NULL, // reserved - NULL, // address of buffer for class string - NULL, // address for size of class buffer - &time) == ERROR_SUCCESS) { - - if (strcmp(buffer, javaMinVer) >= 0 - && (!*javaMaxVer || strcmp(buffer, javaMaxVer) <= 0) - && strcmp(buffer, foundJavaVer) > 0) { - strcpy(foundJavaVer, buffer); - strcpy(foundJavaKey, keyName); - appendPath(foundJavaKey, buffer); - foundJava = searchType; - debug("Match:\t\t%s\\%s\n", keyName, buffer); - } else { - debug("Ignore:\t\t%s\\%s\n", keyName, buffer); - } - size = BIG_STR; - } -} - -void regSearchWow(const char* keyName, const int searchType) { - HKEY hKey; - debug("64-bit search:\t%s...\n", keyName); - if (wow64 && RegOpenKeyEx(HKEY_LOCAL_MACHINE, - keyName, - 0, - KEY_READ | KEY_WOW64_64KEY, - &hKey) == ERROR_SUCCESS) { - - regSearch(hKey, keyName, searchType | KEY_WOW64_64KEY); - RegCloseKey(hKey); - if ((foundJava & KEY_WOW64_64KEY) != NO_JAVA_FOUND) - { - debug("Using 64-bit runtime.\n"); - return; - } - } - debug("32-bit search:\t%s...\n", keyName); - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - keyName, - 0, - KEY_READ, - &hKey) == ERROR_SUCCESS) { - regSearch(hKey, keyName, searchType); - RegCloseKey(hKey); - } -} - -void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, - const int jdkPreference) { - if (jdkPreference == JDK_ONLY || jdkPreference == PREFER_JDK) { - regSearchWow(sdkKeyName, FOUND_SDK); - if (jdkPreference != JDK_ONLY) { - regSearchWow(jreKeyName, FOUND_JRE); - } - } else { // jdkPreference == JRE_ONLY or PREFER_JRE - regSearchWow(jreKeyName, FOUND_JRE); - if (jdkPreference != JRE_ONLY) { - regSearchWow(sdkKeyName, FOUND_SDK); - } - } -} - -BOOL findJavaHome(char* path, const int jdkPreference) { - regSearchJreSdk("SOFTWARE\\JavaSoft\\Java Runtime Environment", - "SOFTWARE\\JavaSoft\\Java Development Kit", - jdkPreference); - if (foundJava == NO_JAVA_FOUND) { - regSearchJreSdk("SOFTWARE\\IBM\\Java2 Runtime Environment", - "SOFTWARE\\IBM\\Java Development Kit", - jdkPreference); - } - if (foundJava != NO_JAVA_FOUND) { - HKEY hKey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - foundJavaKey, - 0, - KEY_READ | (foundJava & KEY_WOW64_64KEY), - &hKey) == ERROR_SUCCESS) { - unsigned char buffer[BIG_STR] = {0}; - unsigned long bufferlength = BIG_STR; - unsigned long datatype; - if (RegQueryValueEx(hKey, "JavaHome", NULL, &datatype, buffer, - &bufferlength) == ERROR_SUCCESS) { - int i = 0; - do { - path[i] = buffer[i]; - } while (path[i++] != 0); - // (foundJava & FOUND_SDK) { // removed by fry - // appendPath(path, "jre"); - // - RegCloseKey(hKey); - return TRUE; - } - RegCloseKey(hKey); - } - } - return FALSE; -} - -/* - * Extract the executable name, returns path length. - */ -int getExePath(char* exePath) { - if (GetModuleFileName(hModule, exePath, _MAX_PATH) == 0) { - return -1; - } - return strrchr(exePath, '\\') - exePath; -} - -void appendPath(char* basepath, const char* path) { - if (basepath[strlen(basepath) - 1] != '\\') { - strcat(basepath, "\\"); - } - strcat(basepath, path); -} - -void appendJavaw(char* jrePath) { - if (console) { - appendPath(jrePath, "bin\\java.exe"); - } else { - appendPath(jrePath, "bin\\javaw.exe"); - } -} - -void appendLauncher(const BOOL setProcName, char* exePath, - const int pathLen, char* cmd) { - if (setProcName) { - char tmpspec[_MAX_PATH]; - char tmpfile[_MAX_PATH]; - strcpy(tmpspec, cmd); - strcat(tmpspec, LAUNCH4J_TMP_DIR); - tmpspec[strlen(tmpspec) - 1] = 0; - if (_stat(tmpspec, &statBuf) == 0) { - // Remove temp launchers and manifests - struct _finddata_t c_file; - long hFile; - appendPath(tmpspec, "*.exe"); - strcpy(tmpfile, cmd); - strcat(tmpfile, LAUNCH4J_TMP_DIR); - char* filename = tmpfile + strlen(tmpfile); - if ((hFile = _findfirst(tmpspec, &c_file)) != -1L) { - do { - strcpy(filename, c_file.name); - debug("Unlink:\t\t%s\n", tmpfile); - _unlink(tmpfile); - strcat(tmpfile, MANIFEST); - debug("Unlink:\t\t%s\n", tmpfile); - _unlink(tmpfile); - } while (_findnext(hFile, &c_file) == 0); - } - _findclose(hFile); - } else { - if (_mkdir(tmpspec) != 0) { - debug("Mkdir failed:\t%s\n", tmpspec); - appendJavaw(cmd); - return; - } - } - char javaw[_MAX_PATH]; - strcpy(javaw, cmd); - appendJavaw(javaw); - strcpy(tmpfile, cmd); - strcat(tmpfile, LAUNCH4J_TMP_DIR); - char* tmpfilename = tmpfile + strlen(tmpfile); - char* exeFilePart = exePath + pathLen + 1; - - // Copy manifest - char manifest[_MAX_PATH] = {0}; - strcpy(manifest, exePath); - strcat(manifest, MANIFEST); - if (_stat(manifest, &statBuf) == 0) { - strcat(tmpfile, exeFilePart); - strcat(tmpfile, MANIFEST); - debug("Copy:\t\t%s -> %s\n", manifest, tmpfile); - CopyFile(manifest, tmpfile, FALSE); - } - - // Copy launcher - strcpy(tmpfilename, exeFilePart); - debug("Copy:\t\t%s -> %s\n", javaw, tmpfile); - if (CopyFile(javaw, tmpfile, FALSE)) { - strcpy(cmd, tmpfile); - return; - } else if (_stat(javaw, &statBuf) == 0) { - long fs = statBuf.st_size; - if (_stat(tmpfile, &statBuf) == 0 && fs == statBuf.st_size) { - debug("Reusing:\t\t%s\n", tmpfile); - strcpy(cmd, tmpfile); - return; - } - } - } - appendJavaw(cmd); -} - -void appendAppClasspath(char* dst, const char* src, const char* classpath) { - strcat(dst, src); - if (*classpath) { - strcat(dst, ";"); - } -} - -BOOL isJrePathOk(const char* path) { - char javaw[_MAX_PATH]; - BOOL result = FALSE; - if (*path) { - strcpy(javaw, path); - appendJavaw(javaw); - result = _stat(javaw, &statBuf) == 0; - } - debug("Check launcher:\t%s %s\n", javaw, result ? "(OK)" : "(n/a)"); - return result; -} - -/* - * Expand environment %variables% - */ -BOOL expandVars(char *dst, const char *src, const char *exePath, const int pathLen) { - char varName[STR]; - char varValue[MAX_VAR_SIZE]; - while (strlen(src) > 0) { - char *start = strchr(src, '%'); - if (start != NULL) { - char *end = strchr(start + 1, '%'); - if (end == NULL) { - return FALSE; - } - // Copy content up to %VAR% - strncat(dst, src, start - src); - // Insert value of %VAR% - *varName = 0; - strncat(varName, start + 1, end - start - 1); - // Remember value start for logging - char *varValue = dst + strlen(dst); - if (strcmp(varName, "EXEDIR") == 0) { - strncat(dst, exePath, pathLen); - } else if (strcmp(varName, "EXEFILE") == 0) { - strcat(dst, exePath); - } else if (strcmp(varName, "PWD") == 0) { - GetCurrentDirectory(_MAX_PATH, dst + strlen(dst)); - } else if (strcmp(varName, "OLDPWD") == 0) { - strcat(dst, oldPwd); - } else if (strstr(varName, HKEY_STR) == varName) { - regQueryValue(varName, dst + strlen(dst), BIG_STR); - } else if (GetEnvironmentVariable(varName, varValue, MAX_VAR_SIZE) > 0) { - strcat(dst, varValue); - } - debug("Substitute:\t%s = %s\n", varName, varValue); - src = end + 1; - } else { - // Copy remaining content - strcat(dst, src); - break; - } - } - return TRUE; -} - -void appendHeapSizes(char *dst) { - MEMORYSTATUS m; - memset(&m, 0, sizeof(m)); - GlobalMemoryStatus(&m); - - appendHeapSize(dst, INITIAL_HEAP_SIZE, INITIAL_HEAP_PERCENT, - m.dwAvailPhys, "-Xms"); - appendHeapSize(dst, MAX_HEAP_SIZE, MAX_HEAP_PERCENT, - m.dwAvailPhys, "-Xmx"); -} - -void appendHeapSize(char *dst, const int absID, const int percentID, - const DWORD freeMemory, const char *option) { - - const int mb = 1048576; // 1 MB - int abs = loadInt(absID); - int percent = loadInt(percentID); - int free = (long long) freeMemory * percent / (100 * mb); // 100% * 1 MB - int size = free > abs ? free : abs; - if (size > 0) { - debug("Heap %s:\t%d MB / %d%%, Free: %d MB, Heap size: %d MB\n", - option, abs, percent, freeMemory / mb, size); - strcat(dst, option); - _itoa(size, dst + strlen(dst), 10); // 10 -- radix - strcat(dst, "m "); - } -} - -int prepare(const char *lpCmdLine) { - char tmp[MAX_ARGS] = {0}; - hModule = GetModuleHandle(NULL); - if (hModule == NULL) { - return FALSE; - } - - // Get executable path - char exePath[_MAX_PATH] = {0}; - int pathLen = getExePath(exePath); - if (pathLen == -1) { - return FALSE; - } - - // Initialize logging - if (strstr(lpCmdLine, "--l4j-debug") != NULL) { - hLog = openLogFile(exePath, pathLen); - if (hLog == NULL) { - return FALSE; - } - debug("\n\nCmdLine:\t%s %s\n", exePath, lpCmdLine); - } - - setWow64Flag(); - - // Set default error message, title and optional support web site url. - loadString(SUPPORT_URL, errUrl); - loadString(ERR_TITLE, errTitle); - if (!loadString(STARTUP_ERR, errMsg)) { - return FALSE; - } - - // Single instance - loadString(MUTEX_NAME, mutexName); - if (*mutexName) { - SECURITY_ATTRIBUTES security; - security.nLength = sizeof(SECURITY_ATTRIBUTES); - security.bInheritHandle = TRUE; - security.lpSecurityDescriptor = NULL; - CreateMutexA(&security, FALSE, mutexName); - if (GetLastError() == ERROR_ALREADY_EXISTS) { - debug("Instance already exists."); - return ERROR_ALREADY_EXISTS; - } - } - - // Working dir - char tmp_path[_MAX_PATH] = {0}; - GetCurrentDirectory(_MAX_PATH, oldPwd); - if (loadString(CHDIR, tmp_path)) { - strncpy(workingDir, exePath, pathLen); - appendPath(workingDir, tmp_path); - _chdir(workingDir); - debug("Working dir:\t%s\n", workingDir); - } - - // Use bundled jre or find java - if (loadString(JRE_PATH, tmp_path)) { - char jrePath[MAX_ARGS] = {0}; - expandVars(jrePath, tmp_path, exePath, pathLen); - debug("Bundled JRE:\t%s\n", jrePath); - if (jrePath[0] == '\\' || jrePath[1] == ':') { - // Absolute - strcpy(cmd, jrePath); - } else { - // Relative - strncpy(cmd, exePath, pathLen); - appendPath(cmd, jrePath); - } - } - if (!isJrePathOk(cmd)) { - if (!loadString(JAVA_MIN_VER, javaMinVer)) { - loadString(BUNDLED_JRE_ERR, errMsg); - return FALSE; - } - loadString(JAVA_MAX_VER, javaMaxVer); - if (!findJavaHome(cmd, loadInt(JDK_PREFERENCE))) { - loadString(JRE_VERSION_ERR, errMsg); - strcat(errMsg, " "); - strcat(errMsg, javaMinVer); - if (*javaMaxVer) { - strcat(errMsg, " - "); - strcat(errMsg, javaMaxVer); - } - loadString(DOWNLOAD_URL, errUrl); - return FALSE; - } - if (!isJrePathOk(cmd)) { - loadString(LAUNCHER_ERR, errMsg); - return FALSE; - } - } - - // Append a path to the Path environment variable - char jreBinPath[_MAX_PATH]; - strcpy(jreBinPath, cmd); - strcat(jreBinPath, "\\bin"); - if (!appendToPathVar(jreBinPath)) { - return FALSE; - } - - // Set environment variables - char envVars[MAX_VAR_SIZE] = {0}; - loadString(ENV_VARIABLES, envVars); - char *var = strtok(envVars, "\t"); - while (var != NULL) { - char *varValue = strchr(var, '='); - *varValue++ = 0; - *tmp = 0; - expandVars(tmp, varValue, exePath, pathLen); - debug("Set var:\t%s = %s\n", var, tmp); - SetEnvironmentVariable(var, tmp); - var = strtok(NULL, "\t"); - } - *tmp = 0; - - // Process priority - priority = loadInt(PRIORITY_CLASS); - - // Custom process name - const BOOL setProcName = loadBool(SET_PROC_NAME) - && strstr(lpCmdLine, "--l4j-default-proc") == NULL; - const BOOL wrapper = loadBool(WRAPPER); - - char jdk_path[_MAX_PATH] = {0}; // fry - strcpy(jdk_path, cmd); - //msgBox(jdk_path); - - appendLauncher(setProcName, exePath, pathLen, cmd); - - // Heap sizes - appendHeapSizes(args); - - // JVM options - if (loadString(JVM_OPTIONS, tmp)) { - strcat(tmp, " "); - } else { - *tmp = 0; - } - /* - * Load additional JVM options from .l4j.ini file - * Options are separated by spaces or CRLF - * # starts an inline comment - */ - strncpy(tmp_path, exePath, strlen(exePath) - 3); - strcat(tmp_path, "l4j.ini"); - long hFile; - if ((hFile = _open(tmp_path, _O_RDONLY)) != -1) { - const int jvmOptLen = strlen(tmp); - char* src = tmp + jvmOptLen; - char* dst = src; - const int len = _read(hFile, src, MAX_ARGS - jvmOptLen - BIG_STR); - BOOL copy = TRUE; - int i; - for (i = 0; i < len; i++, src++) { - if (*src == '#') { - copy = FALSE; - } else if (*src == 13 || *src == 10) { - copy = TRUE; - if (dst > tmp && *(dst - 1) != ' ') { - *dst++ = ' '; - } - } else if (copy) { - *dst++ = *src; - } - } - *dst = 0; - if (len > 0 && *(dst - 1) != ' ') { - strcat(tmp, " "); - } - _close(hFile); - } - - // Expand environment %variables% - expandVars(args, tmp, exePath, pathLen); - - // MainClass + Classpath or Jar - char mainClass[STR] = {0}; - char jar[_MAX_PATH] = {0}; - loadString(JAR, jar); - if (loadString(MAIN_CLASS, mainClass)) { - if (!loadString(CLASSPATH, tmp)) { - return FALSE; - } - char exp[MAX_ARGS] = {0}; - expandVars(exp, tmp, exePath, pathLen); - strcat(args, "-classpath \""); - if (wrapper) { - appendAppClasspath(args, exePath, exp); - } else if (*jar) { - appendAppClasspath(args, jar, exp); - } - - // add tools.jar for JDK [fry] - char tools[_MAX_PATH] = { 0 }; - sprintf(tools, "%s\\lib\\tools.jar", jdk_path); - appendAppClasspath(args, tools, exp); - - // Deal with wildcards or >> strcat(args, exp); << - char* cp = strtok(exp, ";"); - while(cp != NULL) { - debug("Add classpath:\t%s\n", cp); - if (strpbrk(cp, "*?") != NULL) { - int len = strrchr(cp, '\\') - cp + 1; - strncpy(tmp_path, cp, len); - char* filename = tmp_path + len; - *filename = 0; - struct _finddata_t c_file; - long hFile; - if ((hFile = _findfirst(cp, &c_file)) != -1L) { - do { - strcpy(filename, c_file.name); - strcat(args, tmp_path); - strcat(args, ";"); - debug(" \" :\t%s\n", tmp_path); - } while (_findnext(hFile, &c_file) == 0); - } - _findclose(hFile); - } else { - strcat(args, cp); - strcat(args, ";"); - } - cp = strtok(NULL, ";"); - } - *(args + strlen(args) - 1) = 0; - - strcat(args, "\" "); - strcat(args, mainClass); - } else if (wrapper) { - strcat(args, "-jar \""); - strcat(args, exePath); - strcat(args, "\""); - } else { - strcat(args, "-jar \""); - strncat(args, exePath, pathLen); - appendPath(args, jar); - strcat(args, "\""); - } - - // Constant command line args - if (loadString(CMD_LINE, tmp)) { - strcat(args, " "); - strcat(args, tmp); - } - - // Command line args - if (*lpCmdLine) { - strcpy(tmp, lpCmdLine); - char* dst; - while ((dst = strstr(tmp, "--l4j-")) != NULL) { - char* src = strchr(dst, ' '); - if (src == NULL || *(src + 1) == 0) { - *dst = 0; - } else { - strcpy(dst, src + 1); - } - } - if (*tmp) { - strcat(args, " "); - strcat(args, tmp); - } - } - - debug("Launcher:\t%s\n", cmd); - debug("Launcher args:\t%s\n", args); - debug("Args length:\t%d/32768 chars\n", strlen(args)); - return TRUE; -} - -void closeHandles() { - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - closeLogFile(); -} - -/* - * Append a path to the Path environment variable - */ -BOOL appendToPathVar(const char* path) { - char chBuf[MAX_VAR_SIZE] = {0}; - - const int pathSize = GetEnvironmentVariable("Path", chBuf, MAX_VAR_SIZE); - if (MAX_VAR_SIZE - pathSize - 1 < strlen(path)) { - return FALSE; - } - strcat(chBuf, ";"); - strcat(chBuf, path); - return SetEnvironmentVariable("Path", chBuf); -} - -// may need to ignore STILL_ACTIVE (error code 259) here -// http://msdn.microsoft.com/en-us/library/ms683189(VS.85).aspx -DWORD execute(const BOOL wait) { - STARTUPINFO si; - memset(&pi, 0, sizeof(pi)); - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - - DWORD dwExitCode = -1; - char cmdline[MAX_ARGS]; - strcpy(cmdline, "\""); - strcat(cmdline, cmd); - strcat(cmdline, "\" "); - strcat(cmdline, args); - if (CreateProcess(NULL, cmdline, NULL, NULL, - TRUE, priority, NULL, NULL, &si, &pi)) { - if (wait) { - WaitForSingleObject(pi.hProcess, INFINITE); - GetExitCodeProcess(pi.hProcess, &dwExitCode); - debug("Exit code:\t%d\n", dwExitCode); - closeHandles(); - } else { - dwExitCode = 0; - } - } - return dwExitCode; -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2008 Grzegorz Kowal, + Ian Roberts (jdk preference patch) + Sylvain Mina (single instance patch) + + 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. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + 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 + AUTHORS OR COPYRIGHT HOLDERS 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. +*/ + +#include "resource.h" +#include "head.h" + +HMODULE hModule; +FILE* hLog; +BOOL console = FALSE; +BOOL wow64 = FALSE; +int foundJava = NO_JAVA_FOUND; + +struct _stat statBuf; +PROCESS_INFORMATION pi; +DWORD priority; + +char mutexName[STR] = {0}; + +char errUrl[256] = {0}; +char errTitle[STR] = "Launch4j"; +char errMsg[BIG_STR] = {0}; + +char javaMinVer[STR] = {0}; +char javaMaxVer[STR] = {0}; +char foundJavaVer[STR] = {0}; +char foundJavaKey[_MAX_PATH] = {0}; + +char oldPwd[_MAX_PATH] = {0}; +char workingDir[_MAX_PATH] = {0}; +char cmd[_MAX_PATH] = {0}; +char args[MAX_ARGS] = {0}; + +FILE* openLogFile(const char* exePath, const int pathLen) { + char path[_MAX_PATH] = {0}; + strncpy(path, exePath, pathLen); + strcat(path, "\\launch4j.log"); + return fopen(path, "a"); +} + +void closeLogFile() { + if (hLog != NULL) { + fclose(hLog); + } +} + +void setWow64Flag() { + LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( + GetModuleHandle(TEXT("kernel32")), "IsWow64Process"); + + if (fnIsWow64Process != NULL) { + fnIsWow64Process(GetCurrentProcess(), &wow64); + } + debug("WOW64:\t\t%s\n", wow64 ? "yes" : "no"); +} + +void setConsoleFlag() { + console = TRUE; +} + +void msgBox(const char* text) { + if (console) { + printf("%s: %s\n", errTitle, text); + } else { + MessageBox(NULL, text, errTitle, MB_OK); + } +} + +void signalError() { + DWORD err = GetLastError(); + if (err) { + LPVOID lpMsgBuf; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + | FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL); + debug("Error:\t\t%s\n", (LPCTSTR) lpMsgBuf); + strcat(errMsg, "\n\n"); + strcat(errMsg, (LPCTSTR) lpMsgBuf); + msgBox(errMsg); + LocalFree(lpMsgBuf); + } else { + msgBox(errMsg); + } + if (*errUrl) { + debug("Open URL:\t%s\n", errUrl); + ShellExecute(NULL, "open", errUrl, NULL, NULL, SW_SHOWNORMAL); + } + closeLogFile(); +} + +BOOL loadString(const int resID, char* buffer) { + HRSRC hResource; + HGLOBAL hResourceLoaded; + LPBYTE lpBuffer; + + hResource = FindResourceEx(hModule, RT_RCDATA, MAKEINTRESOURCE(resID), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)); + if (NULL != hResource) { + hResourceLoaded = LoadResource(hModule, hResource); + if (NULL != hResourceLoaded) { + lpBuffer = (LPBYTE) LockResource(hResourceLoaded); + if (NULL != lpBuffer) { + int x = 0; + do { + buffer[x] = (char) lpBuffer[x]; + } while (buffer[x++] != 0); + // debug("Resource %d:\t%s\n", resID, buffer); + return TRUE; + } + } + } else { + SetLastError(0); + } + return FALSE; +} + +BOOL loadBool(const int resID) { + char boolStr[20] = {0}; + loadString(resID, boolStr); + return strcmp(boolStr, TRUE_STR) == 0; +} + +int loadInt(const int resID) { + char intStr[20] = {0}; + loadString(resID, intStr); + return atoi(intStr); +} + +BOOL regQueryValue(const char* regPath, unsigned char* buffer, + unsigned long bufferLength) { + HKEY hRootKey; + char* key; + char* value; + if (strstr(regPath, HKEY_CLASSES_ROOT_STR) == regPath) { + hRootKey = HKEY_CLASSES_ROOT; + } else if (strstr(regPath, HKEY_CURRENT_USER_STR) == regPath) { + hRootKey = HKEY_CURRENT_USER; + } else if (strstr(regPath, HKEY_LOCAL_MACHINE_STR) == regPath) { + hRootKey = HKEY_LOCAL_MACHINE; + } else if (strstr(regPath, HKEY_USERS_STR) == regPath) { + hRootKey = HKEY_USERS; + } else if (strstr(regPath, HKEY_CURRENT_CONFIG_STR) == regPath) { + hRootKey = HKEY_CURRENT_CONFIG; + } else { + return FALSE; + } + key = strchr(regPath, '\\') + 1; + value = strrchr(regPath, '\\') + 1; + *(value - 1) = 0; + + HKEY hKey; + unsigned long datatype; + BOOL result = FALSE; + if ((wow64 && RegOpenKeyEx(hRootKey, + key, + 0, + KEY_READ | KEY_WOW64_64KEY, + &hKey) == ERROR_SUCCESS) + || RegOpenKeyEx(hRootKey, + key, + 0, + KEY_READ, + &hKey) == ERROR_SUCCESS) { + result = RegQueryValueEx(hKey, value, NULL, &datatype, buffer, &bufferLength) + == ERROR_SUCCESS; + RegCloseKey(hKey); + } + *(value - 1) = '\\'; + return result; +} + +void regSearch(const HKEY hKey, const char* keyName, const int searchType) { + DWORD x = 0; + unsigned long size = BIG_STR; + FILETIME time; + char buffer[BIG_STR] = {0}; + while (RegEnumKeyEx( + hKey, // handle to key to enumerate + x++, // index of subkey to enumerate + buffer, // address of buffer for subkey name + &size, // address for size of subkey buffer + NULL, // reserved + NULL, // address of buffer for class string + NULL, // address for size of class buffer + &time) == ERROR_SUCCESS) { + + if (strcmp(buffer, javaMinVer) >= 0 + && (!*javaMaxVer || strcmp(buffer, javaMaxVer) <= 0) + && strcmp(buffer, foundJavaVer) > 0) { + strcpy(foundJavaVer, buffer); + strcpy(foundJavaKey, keyName); + appendPath(foundJavaKey, buffer); + foundJava = searchType; + debug("Match:\t\t%s\\%s\n", keyName, buffer); + } else { + debug("Ignore:\t\t%s\\%s\n", keyName, buffer); + } + size = BIG_STR; + } +} + +void regSearchWow(const char* keyName, const int searchType) { + HKEY hKey; + debug("64-bit search:\t%s...\n", keyName); + if (wow64 && RegOpenKeyEx(HKEY_LOCAL_MACHINE, + keyName, + 0, + KEY_READ | KEY_WOW64_64KEY, + &hKey) == ERROR_SUCCESS) { + + regSearch(hKey, keyName, searchType | KEY_WOW64_64KEY); + RegCloseKey(hKey); + if ((foundJava & KEY_WOW64_64KEY) != NO_JAVA_FOUND) + { + debug("Using 64-bit runtime.\n"); + return; + } + } + debug("32-bit search:\t%s...\n", keyName); + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + keyName, + 0, + KEY_READ, + &hKey) == ERROR_SUCCESS) { + regSearch(hKey, keyName, searchType); + RegCloseKey(hKey); + } +} + +void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, + const int jdkPreference) { + if (jdkPreference == JDK_ONLY || jdkPreference == PREFER_JDK) { + regSearchWow(sdkKeyName, FOUND_SDK); + if (jdkPreference != JDK_ONLY) { + regSearchWow(jreKeyName, FOUND_JRE); + } + } else { // jdkPreference == JRE_ONLY or PREFER_JRE + regSearchWow(jreKeyName, FOUND_JRE); + if (jdkPreference != JRE_ONLY) { + regSearchWow(sdkKeyName, FOUND_SDK); + } + } +} + +BOOL findJavaHome(char* path, const int jdkPreference) { + regSearchJreSdk("SOFTWARE\\JavaSoft\\Java Runtime Environment", + "SOFTWARE\\JavaSoft\\Java Development Kit", + jdkPreference); + if (foundJava == NO_JAVA_FOUND) { + regSearchJreSdk("SOFTWARE\\IBM\\Java2 Runtime Environment", + "SOFTWARE\\IBM\\Java Development Kit", + jdkPreference); + } + if (foundJava != NO_JAVA_FOUND) { + HKEY hKey; + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + foundJavaKey, + 0, + KEY_READ | (foundJava & KEY_WOW64_64KEY), + &hKey) == ERROR_SUCCESS) { + unsigned char buffer[BIG_STR] = {0}; + unsigned long bufferlength = BIG_STR; + unsigned long datatype; + if (RegQueryValueEx(hKey, "JavaHome", NULL, &datatype, buffer, + &bufferlength) == ERROR_SUCCESS) { + int i = 0; + do { + path[i] = buffer[i]; + } while (path[i++] != 0); + // (foundJava & FOUND_SDK) { // removed by fry + // appendPath(path, "jre"); + // + RegCloseKey(hKey); + return TRUE; + } + RegCloseKey(hKey); + } + } + return FALSE; +} + +/* + * Extract the executable name, returns path length. + */ +int getExePath(char* exePath) { + if (GetModuleFileName(hModule, exePath, _MAX_PATH) == 0) { + return -1; + } + return strrchr(exePath, '\\') - exePath; +} + +void appendPath(char* basepath, const char* path) { + if (basepath[strlen(basepath) - 1] != '\\') { + strcat(basepath, "\\"); + } + strcat(basepath, path); +} + +void appendJavaw(char* jrePath) { + if (console) { + appendPath(jrePath, "bin\\java.exe"); + } else { + appendPath(jrePath, "bin\\javaw.exe"); + } +} + +void appendLauncher(const BOOL setProcName, char* exePath, + const int pathLen, char* cmd) { + if (setProcName) { + char tmpspec[_MAX_PATH]; + char tmpfile[_MAX_PATH]; + strcpy(tmpspec, cmd); + strcat(tmpspec, LAUNCH4J_TMP_DIR); + tmpspec[strlen(tmpspec) - 1] = 0; + if (_stat(tmpspec, &statBuf) == 0) { + // Remove temp launchers and manifests + struct _finddata_t c_file; + long hFile; + appendPath(tmpspec, "*.exe"); + strcpy(tmpfile, cmd); + strcat(tmpfile, LAUNCH4J_TMP_DIR); + char* filename = tmpfile + strlen(tmpfile); + if ((hFile = _findfirst(tmpspec, &c_file)) != -1L) { + do { + strcpy(filename, c_file.name); + debug("Unlink:\t\t%s\n", tmpfile); + _unlink(tmpfile); + strcat(tmpfile, MANIFEST); + debug("Unlink:\t\t%s\n", tmpfile); + _unlink(tmpfile); + } while (_findnext(hFile, &c_file) == 0); + } + _findclose(hFile); + } else { + if (_mkdir(tmpspec) != 0) { + debug("Mkdir failed:\t%s\n", tmpspec); + appendJavaw(cmd); + return; + } + } + char javaw[_MAX_PATH]; + strcpy(javaw, cmd); + appendJavaw(javaw); + strcpy(tmpfile, cmd); + strcat(tmpfile, LAUNCH4J_TMP_DIR); + char* tmpfilename = tmpfile + strlen(tmpfile); + char* exeFilePart = exePath + pathLen + 1; + + // Copy manifest + char manifest[_MAX_PATH] = {0}; + strcpy(manifest, exePath); + strcat(manifest, MANIFEST); + if (_stat(manifest, &statBuf) == 0) { + strcat(tmpfile, exeFilePart); + strcat(tmpfile, MANIFEST); + debug("Copy:\t\t%s -> %s\n", manifest, tmpfile); + CopyFile(manifest, tmpfile, FALSE); + } + + // Copy launcher + strcpy(tmpfilename, exeFilePart); + debug("Copy:\t\t%s -> %s\n", javaw, tmpfile); + if (CopyFile(javaw, tmpfile, FALSE)) { + strcpy(cmd, tmpfile); + return; + } else if (_stat(javaw, &statBuf) == 0) { + long fs = statBuf.st_size; + if (_stat(tmpfile, &statBuf) == 0 && fs == statBuf.st_size) { + debug("Reusing:\t\t%s\n", tmpfile); + strcpy(cmd, tmpfile); + return; + } + } + } + appendJavaw(cmd); +} + +void appendAppClasspath(char* dst, const char* src, const char* classpath) { + strcat(dst, src); + if (*classpath) { + strcat(dst, ";"); + } +} + +BOOL isJrePathOk(const char* path) { + char javaw[_MAX_PATH]; + BOOL result = FALSE; + if (*path) { + strcpy(javaw, path); + appendJavaw(javaw); + result = _stat(javaw, &statBuf) == 0; + } + debug("Check launcher:\t%s %s\n", javaw, result ? "(OK)" : "(n/a)"); + return result; +} + +/* + * Expand environment %variables% + */ +BOOL expandVars(char *dst, const char *src, const char *exePath, const int pathLen) { + char varName[STR]; + char varValue[MAX_VAR_SIZE]; + while (strlen(src) > 0) { + char *start = strchr(src, '%'); + if (start != NULL) { + char *end = strchr(start + 1, '%'); + if (end == NULL) { + return FALSE; + } + // Copy content up to %VAR% + strncat(dst, src, start - src); + // Insert value of %VAR% + *varName = 0; + strncat(varName, start + 1, end - start - 1); + // Remember value start for logging + char *varValue = dst + strlen(dst); + if (strcmp(varName, "EXEDIR") == 0) { + strncat(dst, exePath, pathLen); + } else if (strcmp(varName, "EXEFILE") == 0) { + strcat(dst, exePath); + } else if (strcmp(varName, "PWD") == 0) { + GetCurrentDirectory(_MAX_PATH, dst + strlen(dst)); + } else if (strcmp(varName, "OLDPWD") == 0) { + strcat(dst, oldPwd); + } else if (strstr(varName, HKEY_STR) == varName) { + regQueryValue(varName, dst + strlen(dst), BIG_STR); + } else if (GetEnvironmentVariable(varName, varValue, MAX_VAR_SIZE) > 0) { + strcat(dst, varValue); + } + debug("Substitute:\t%s = %s\n", varName, varValue); + src = end + 1; + } else { + // Copy remaining content + strcat(dst, src); + break; + } + } + return TRUE; +} + +void appendHeapSizes(char *dst) { + MEMORYSTATUS m; + memset(&m, 0, sizeof(m)); + GlobalMemoryStatus(&m); + + appendHeapSize(dst, INITIAL_HEAP_SIZE, INITIAL_HEAP_PERCENT, + m.dwAvailPhys, "-Xms"); + appendHeapSize(dst, MAX_HEAP_SIZE, MAX_HEAP_PERCENT, + m.dwAvailPhys, "-Xmx"); +} + +void appendHeapSize(char *dst, const int absID, const int percentID, + const DWORD freeMemory, const char *option) { + + const int mb = 1048576; // 1 MB + int abs = loadInt(absID); + int percent = loadInt(percentID); + int free = (long long) freeMemory * percent / (100 * mb); // 100% * 1 MB + int size = free > abs ? free : abs; + if (size > 0) { + debug("Heap %s:\t%d MB / %d%%, Free: %d MB, Heap size: %d MB\n", + option, abs, percent, freeMemory / mb, size); + strcat(dst, option); + _itoa(size, dst + strlen(dst), 10); // 10 -- radix + strcat(dst, "m "); + } +} + +int prepare(const char *lpCmdLine) { + char tmp[MAX_ARGS] = {0}; + hModule = GetModuleHandle(NULL); + if (hModule == NULL) { + return FALSE; + } + + // Get executable path + char exePath[_MAX_PATH] = {0}; + int pathLen = getExePath(exePath); + if (pathLen == -1) { + return FALSE; + } + + // Initialize logging + if (strstr(lpCmdLine, "--l4j-debug") != NULL) { + hLog = openLogFile(exePath, pathLen); + if (hLog == NULL) { + return FALSE; + } + debug("\n\nCmdLine:\t%s %s\n", exePath, lpCmdLine); + } + + setWow64Flag(); + + // Set default error message, title and optional support web site url. + loadString(SUPPORT_URL, errUrl); + loadString(ERR_TITLE, errTitle); + if (!loadString(STARTUP_ERR, errMsg)) { + return FALSE; + } + + // Single instance + loadString(MUTEX_NAME, mutexName); + if (*mutexName) { + SECURITY_ATTRIBUTES security; + security.nLength = sizeof(SECURITY_ATTRIBUTES); + security.bInheritHandle = TRUE; + security.lpSecurityDescriptor = NULL; + CreateMutexA(&security, FALSE, mutexName); + if (GetLastError() == ERROR_ALREADY_EXISTS) { + debug("Instance already exists."); + return ERROR_ALREADY_EXISTS; + } + } + + // Working dir + char tmp_path[_MAX_PATH] = {0}; + GetCurrentDirectory(_MAX_PATH, oldPwd); + if (loadString(CHDIR, tmp_path)) { + strncpy(workingDir, exePath, pathLen); + appendPath(workingDir, tmp_path); + _chdir(workingDir); + debug("Working dir:\t%s\n", workingDir); + } + + // Use bundled jre or find java + if (loadString(JRE_PATH, tmp_path)) { + char jrePath[MAX_ARGS] = {0}; + expandVars(jrePath, tmp_path, exePath, pathLen); + debug("Bundled JRE:\t%s\n", jrePath); + if (jrePath[0] == '\\' || jrePath[1] == ':') { + // Absolute + strcpy(cmd, jrePath); + } else { + // Relative + strncpy(cmd, exePath, pathLen); + appendPath(cmd, jrePath); + } + } + if (!isJrePathOk(cmd)) { + if (!loadString(JAVA_MIN_VER, javaMinVer)) { + loadString(BUNDLED_JRE_ERR, errMsg); + return FALSE; + } + loadString(JAVA_MAX_VER, javaMaxVer); + if (!findJavaHome(cmd, loadInt(JDK_PREFERENCE))) { + loadString(JRE_VERSION_ERR, errMsg); + strcat(errMsg, " "); + strcat(errMsg, javaMinVer); + if (*javaMaxVer) { + strcat(errMsg, " - "); + strcat(errMsg, javaMaxVer); + } + loadString(DOWNLOAD_URL, errUrl); + return FALSE; + } + if (!isJrePathOk(cmd)) { + loadString(LAUNCHER_ERR, errMsg); + return FALSE; + } + } + + // Append a path to the Path environment variable + char jreBinPath[_MAX_PATH]; + strcpy(jreBinPath, cmd); + strcat(jreBinPath, "\\bin"); + if (!appendToPathVar(jreBinPath)) { + return FALSE; + } + + // Set environment variables + char envVars[MAX_VAR_SIZE] = {0}; + loadString(ENV_VARIABLES, envVars); + char *var = strtok(envVars, "\t"); + while (var != NULL) { + char *varValue = strchr(var, '='); + *varValue++ = 0; + *tmp = 0; + expandVars(tmp, varValue, exePath, pathLen); + debug("Set var:\t%s = %s\n", var, tmp); + SetEnvironmentVariable(var, tmp); + var = strtok(NULL, "\t"); + } + *tmp = 0; + + // Process priority + priority = loadInt(PRIORITY_CLASS); + + // Custom process name + const BOOL setProcName = loadBool(SET_PROC_NAME) + && strstr(lpCmdLine, "--l4j-default-proc") == NULL; + const BOOL wrapper = loadBool(WRAPPER); + + char jdk_path[_MAX_PATH] = {0}; // fry + strcpy(jdk_path, cmd); + //msgBox(jdk_path); + + appendLauncher(setProcName, exePath, pathLen, cmd); + + // Heap sizes + appendHeapSizes(args); + + // JVM options + if (loadString(JVM_OPTIONS, tmp)) { + strcat(tmp, " "); + } else { + *tmp = 0; + } + /* + * Load additional JVM options from .l4j.ini file + * Options are separated by spaces or CRLF + * # starts an inline comment + */ + strncpy(tmp_path, exePath, strlen(exePath) - 3); + strcat(tmp_path, "l4j.ini"); + long hFile; + if ((hFile = _open(tmp_path, _O_RDONLY)) != -1) { + const int jvmOptLen = strlen(tmp); + char* src = tmp + jvmOptLen; + char* dst = src; + const int len = _read(hFile, src, MAX_ARGS - jvmOptLen - BIG_STR); + BOOL copy = TRUE; + int i; + for (i = 0; i < len; i++, src++) { + if (*src == '#') { + copy = FALSE; + } else if (*src == 13 || *src == 10) { + copy = TRUE; + if (dst > tmp && *(dst - 1) != ' ') { + *dst++ = ' '; + } + } else if (copy) { + *dst++ = *src; + } + } + *dst = 0; + if (len > 0 && *(dst - 1) != ' ') { + strcat(tmp, " "); + } + _close(hFile); + } + + // Expand environment %variables% + expandVars(args, tmp, exePath, pathLen); + + // MainClass + Classpath or Jar + char mainClass[STR] = {0}; + char jar[_MAX_PATH] = {0}; + loadString(JAR, jar); + if (loadString(MAIN_CLASS, mainClass)) { + if (!loadString(CLASSPATH, tmp)) { + return FALSE; + } + char exp[MAX_ARGS] = {0}; + expandVars(exp, tmp, exePath, pathLen); + strcat(args, "-classpath \""); + if (wrapper) { + appendAppClasspath(args, exePath, exp); + } else if (*jar) { + appendAppClasspath(args, jar, exp); + } + + // add tools.jar for JDK [fry] + char tools[_MAX_PATH] = { 0 }; + sprintf(tools, "%s\\lib\\tools.jar", jdk_path); + appendAppClasspath(args, tools, exp); + + // Deal with wildcards or >> strcat(args, exp); << + char* cp = strtok(exp, ";"); + while(cp != NULL) { + debug("Add classpath:\t%s\n", cp); + if (strpbrk(cp, "*?") != NULL) { + int len = strrchr(cp, '\\') - cp + 1; + strncpy(tmp_path, cp, len); + char* filename = tmp_path + len; + *filename = 0; + struct _finddata_t c_file; + long hFile; + if ((hFile = _findfirst(cp, &c_file)) != -1L) { + do { + strcpy(filename, c_file.name); + strcat(args, tmp_path); + strcat(args, ";"); + debug(" \" :\t%s\n", tmp_path); + } while (_findnext(hFile, &c_file) == 0); + } + _findclose(hFile); + } else { + strcat(args, cp); + strcat(args, ";"); + } + cp = strtok(NULL, ";"); + } + *(args + strlen(args) - 1) = 0; + + strcat(args, "\" "); + strcat(args, mainClass); + } else if (wrapper) { + strcat(args, "-jar \""); + strcat(args, exePath); + strcat(args, "\""); + } else { + strcat(args, "-jar \""); + strncat(args, exePath, pathLen); + appendPath(args, jar); + strcat(args, "\""); + } + + // Constant command line args + if (loadString(CMD_LINE, tmp)) { + strcat(args, " "); + strcat(args, tmp); + } + + // Command line args + if (*lpCmdLine) { + strcpy(tmp, lpCmdLine); + char* dst; + while ((dst = strstr(tmp, "--l4j-")) != NULL) { + char* src = strchr(dst, ' '); + if (src == NULL || *(src + 1) == 0) { + *dst = 0; + } else { + strcpy(dst, src + 1); + } + } + if (*tmp) { + strcat(args, " "); + strcat(args, tmp); + } + } + + debug("Launcher:\t%s\n", cmd); + debug("Launcher args:\t%s\n", args); + debug("Args length:\t%d/32768 chars\n", strlen(args)); + return TRUE; +} + +void closeHandles() { + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + closeLogFile(); +} + +/* + * Append a path to the Path environment variable + */ +BOOL appendToPathVar(const char* path) { + char chBuf[MAX_VAR_SIZE] = {0}; + + const int pathSize = GetEnvironmentVariable("Path", chBuf, MAX_VAR_SIZE); + if (MAX_VAR_SIZE - pathSize - 1 < strlen(path)) { + return FALSE; + } + strcat(chBuf, ";"); + strcat(chBuf, path); + return SetEnvironmentVariable("Path", chBuf); +} + +// may need to ignore STILL_ACTIVE (error code 259) here +// http://msdn.microsoft.com/en-us/library/ms683189(VS.85).aspx +DWORD execute(const BOOL wait) { + STARTUPINFO si; + memset(&pi, 0, sizeof(pi)); + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + DWORD dwExitCode = -1; + char cmdline[MAX_ARGS]; + strcpy(cmdline, "\""); + strcat(cmdline, cmd); + strcat(cmdline, "\" "); + strcat(cmdline, args); + if (CreateProcess(NULL, cmdline, NULL, NULL, + TRUE, priority, NULL, NULL, &si, &pi)) { + if (wait) { + WaitForSingleObject(pi.hProcess, INFINITE); + GetExitCodeProcess(pi.hProcess, &dwExitCode); + debug("Exit code:\t%d\n", dwExitCode); + closeHandles(); + } else { + dwExitCode = 0; + } + } + return dwExitCode; +} diff --git a/build/windows/launcher/launch4j/head_src/head.h b/build/windows/launcher/launch4j/head_src/head.h old mode 100755 new mode 100644 index 2e3bdb1d093..5e9e577c74a --- a/build/windows/launcher/launch4j/head_src/head.h +++ b/build/windows/launcher/launch4j/head_src/head.h @@ -1,113 +1,113 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2008 Grzegorz Kowal, - Ian Roberts (jdk preference patch) - - 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. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - 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 - AUTHORS OR COPYRIGHT HOLDERS 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. -*/ - -#ifndef _LAUNCH4J_HEAD__INCLUDED_ -#define _LAUNCH4J_HEAD__INCLUDED_ - -#define WIN32_LEAN_AND_MEAN // VC - Exclude rarely-used stuff from Windows headers - -// Windows Header Files: -#include - -// C RunTime Header Files -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NO_JAVA_FOUND 0 -#define FOUND_JRE 1 -#define FOUND_SDK 2 - -#define JRE_ONLY 0 -#define PREFER_JRE 1 -#define PREFER_JDK 2 -#define JDK_ONLY 3 - -#define LAUNCH4J_TMP_DIR "\\launch4j-tmp\\" -#define MANIFEST ".manifest" - -#define KEY_WOW64_64KEY 0x0100 - -#define HKEY_STR "HKEY" -#define HKEY_CLASSES_ROOT_STR "HKEY_CLASSES_ROOT" -#define HKEY_CURRENT_USER_STR "HKEY_CURRENT_USER" -#define HKEY_LOCAL_MACHINE_STR "HKEY_LOCAL_MACHINE" -#define HKEY_USERS_STR "HKEY_USERS" -#define HKEY_CURRENT_CONFIG_STR "HKEY_CURRENT_CONFIG" - -#define STR 128 -#define BIG_STR 1024 -#define MAX_VAR_SIZE 32767 -#define MAX_ARGS 32768 - -#define TRUE_STR "true" -#define FALSE_STR "false" - -#define debug(args...) if (hLog != NULL) fprintf(hLog, ## args); - -typedef void (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); - -FILE* openLogFile(const char* exePath, const int pathLen); -void closeLogFile(); -void msgBox(const char* text); -void signalError(); -BOOL loadString(const int resID, char* buffer); -BOOL loadBool(const int resID); -int loadInt(const int resID); -BOOL regQueryValue(const char* regPath, unsigned char* buffer, - unsigned long bufferLength); -void regSearch(const HKEY hKey, const char* keyName, const int searchType); -void regSearchWow(const char* keyName, const int searchType); -void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, - const int jdkPreference); -BOOL findJavaHome(char* path, const int jdkPreference); -int getExePath(char* exePath); -void appendPath(char* basepath, const char* path); -void appendJavaw(char* jrePath); -void appendAppClasspath(char* dst, const char* src, const char* classpath); -BOOL isJrePathOk(const char* path); -BOOL expandVars(char *dst, const char *src, const char *exePath, const int pathLen); -void appendHeapSizes(char *dst); -void appendHeapSize(char *dst, const int absID, const int percentID, - const DWORD freeMemory, const char *option); -int prepare(const char *lpCmdLine); -void closeHandles(); -BOOL appendToPathVar(const char* path); -DWORD execute(const BOOL wait); - -#endif // _LAUNCH4J_HEAD__INCLUDED_ +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2008 Grzegorz Kowal, + Ian Roberts (jdk preference patch) + + 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. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + 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 + AUTHORS OR COPYRIGHT HOLDERS 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. +*/ + +#ifndef _LAUNCH4J_HEAD__INCLUDED_ +#define _LAUNCH4J_HEAD__INCLUDED_ + +#define WIN32_LEAN_AND_MEAN // VC - Exclude rarely-used stuff from Windows headers + +// Windows Header Files: +#include + +// C RunTime Header Files +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NO_JAVA_FOUND 0 +#define FOUND_JRE 1 +#define FOUND_SDK 2 + +#define JRE_ONLY 0 +#define PREFER_JRE 1 +#define PREFER_JDK 2 +#define JDK_ONLY 3 + +#define LAUNCH4J_TMP_DIR "\\launch4j-tmp\\" +#define MANIFEST ".manifest" + +#define KEY_WOW64_64KEY 0x0100 + +#define HKEY_STR "HKEY" +#define HKEY_CLASSES_ROOT_STR "HKEY_CLASSES_ROOT" +#define HKEY_CURRENT_USER_STR "HKEY_CURRENT_USER" +#define HKEY_LOCAL_MACHINE_STR "HKEY_LOCAL_MACHINE" +#define HKEY_USERS_STR "HKEY_USERS" +#define HKEY_CURRENT_CONFIG_STR "HKEY_CURRENT_CONFIG" + +#define STR 128 +#define BIG_STR 1024 +#define MAX_VAR_SIZE 32767 +#define MAX_ARGS 32768 + +#define TRUE_STR "true" +#define FALSE_STR "false" + +#define debug(args...) if (hLog != NULL) fprintf(hLog, ## args); + +typedef void (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); + +FILE* openLogFile(const char* exePath, const int pathLen); +void closeLogFile(); +void msgBox(const char* text); +void signalError(); +BOOL loadString(const int resID, char* buffer); +BOOL loadBool(const int resID); +int loadInt(const int resID); +BOOL regQueryValue(const char* regPath, unsigned char* buffer, + unsigned long bufferLength); +void regSearch(const HKEY hKey, const char* keyName, const int searchType); +void regSearchWow(const char* keyName, const int searchType); +void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, + const int jdkPreference); +BOOL findJavaHome(char* path, const int jdkPreference); +int getExePath(char* exePath); +void appendPath(char* basepath, const char* path); +void appendJavaw(char* jrePath); +void appendAppClasspath(char* dst, const char* src, const char* classpath); +BOOL isJrePathOk(const char* path); +BOOL expandVars(char *dst, const char *src, const char *exePath, const int pathLen); +void appendHeapSizes(char *dst); +void appendHeapSize(char *dst, const int absID, const int percentID, + const DWORD freeMemory, const char *option); +int prepare(const char *lpCmdLine); +void closeHandles(); +BOOL appendToPathVar(const char* path); +DWORD execute(const BOOL wait); + +#endif // _LAUNCH4J_HEAD__INCLUDED_ diff --git a/build/windows/launcher/launch4j/head_src/resource.h b/build/windows/launcher/launch4j/head_src/resource.h old mode 100755 new mode 100644 index 3c0f73cfc0b..259d351ec93 --- a/build/windows/launcher/launch4j/head_src/resource.h +++ b/build/windows/launcher/launch4j/head_src/resource.h @@ -1,71 +1,71 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2008 Grzegorz Kowal - Ian Roberts (jdk preference patch) - - 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. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - 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 - AUTHORS OR COPYRIGHT HOLDERS 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. -*/ - -// ICON -#define APP_ICON 1 - -// BITMAP -#define SPLASH_BITMAP 1 - -// RCDATA -#define JRE_PATH 1 -#define JAVA_MIN_VER 2 -#define JAVA_MAX_VER 3 -#define SHOW_SPLASH 4 -#define SPLASH_WAITS_FOR_WINDOW 5 -#define SPLASH_TIMEOUT 6 -#define SPLASH_TIMEOUT_ERR 7 -#define CHDIR 8 -#define SET_PROC_NAME 9 -#define ERR_TITLE 10 -#define GUI_HEADER_STAYS_ALIVE 11 -#define JVM_OPTIONS 12 -#define CMD_LINE 13 -#define JAR 14 -#define MAIN_CLASS 15 -#define CLASSPATH 16 -#define WRAPPER 17 -#define JDK_PREFERENCE 18 -#define ENV_VARIABLES 19 -#define PRIORITY_CLASS 20 -#define DOWNLOAD_URL 21 -#define SUPPORT_URL 22 -#define MUTEX_NAME 23 -#define INSTANCE_WINDOW_TITLE 24 -#define INITIAL_HEAP_SIZE 25 -#define INITIAL_HEAP_PERCENT 26 -#define MAX_HEAP_SIZE 27 -#define MAX_HEAP_PERCENT 28 - -#define STARTUP_ERR 101 -#define BUNDLED_JRE_ERR 102 -#define JRE_VERSION_ERR 103 -#define LAUNCHER_ERR 104 -#define INSTANCE_ALREADY_EXISTS_MSG 105 +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2008 Grzegorz Kowal + Ian Roberts (jdk preference patch) + + 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. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + 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 + AUTHORS OR COPYRIGHT HOLDERS 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. +*/ + +// ICON +#define APP_ICON 1 + +// BITMAP +#define SPLASH_BITMAP 1 + +// RCDATA +#define JRE_PATH 1 +#define JAVA_MIN_VER 2 +#define JAVA_MAX_VER 3 +#define SHOW_SPLASH 4 +#define SPLASH_WAITS_FOR_WINDOW 5 +#define SPLASH_TIMEOUT 6 +#define SPLASH_TIMEOUT_ERR 7 +#define CHDIR 8 +#define SET_PROC_NAME 9 +#define ERR_TITLE 10 +#define GUI_HEADER_STAYS_ALIVE 11 +#define JVM_OPTIONS 12 +#define CMD_LINE 13 +#define JAR 14 +#define MAIN_CLASS 15 +#define CLASSPATH 16 +#define WRAPPER 17 +#define JDK_PREFERENCE 18 +#define ENV_VARIABLES 19 +#define PRIORITY_CLASS 20 +#define DOWNLOAD_URL 21 +#define SUPPORT_URL 22 +#define MUTEX_NAME 23 +#define INSTANCE_WINDOW_TITLE 24 +#define INITIAL_HEAP_SIZE 25 +#define INITIAL_HEAP_PERCENT 26 +#define MAX_HEAP_SIZE 27 +#define MAX_HEAP_PERCENT 28 + +#define STARTUP_ERR 101 +#define BUNDLED_JRE_ERR 102 +#define JRE_VERSION_ERR 103 +#define LAUNCHER_ERR 104 +#define INSTANCE_ALREADY_EXISTS_MSG 105 diff --git a/build/windows/launcher/launch4j/lib/JGoodies.Forms.LICENSE.txt b/build/windows/launcher/launch4j/lib/JGoodies.Forms.LICENSE.txt old mode 100755 new mode 100644 index 9ba2419e7fd..e04618d9d1c --- a/build/windows/launcher/launch4j/lib/JGoodies.Forms.LICENSE.txt +++ b/build/windows/launcher/launch4j/lib/JGoodies.Forms.LICENSE.txt @@ -1,31 +1,31 @@ - - The BSD License for the JGoodies Forms - ====================================== - -Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - o Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - o 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. - - o Neither the name of JGoodies Karsten Lentzsch 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + + The BSD License for the JGoodies Forms + ====================================== + +Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + o Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + o 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. + + o Neither the name of JGoodies Karsten Lentzsch 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. diff --git a/build/windows/launcher/launch4j/lib/JGoodies.Looks.LICENSE.txt b/build/windows/launcher/launch4j/lib/JGoodies.Looks.LICENSE.txt old mode 100755 new mode 100644 index 8bbefa2ebd6..abbc8c5777f --- a/build/windows/launcher/launch4j/lib/JGoodies.Looks.LICENSE.txt +++ b/build/windows/launcher/launch4j/lib/JGoodies.Looks.LICENSE.txt @@ -1,31 +1,31 @@ - - The BSD License for the JGoodies Looks - ====================================== - -Copyright (c) 2001-2007 JGoodies Karsten Lentzsch. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - o Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - o 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. - - o Neither the name of JGoodies Karsten Lentzsch 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + + The BSD License for the JGoodies Looks + ====================================== + +Copyright (c) 2001-2007 JGoodies Karsten Lentzsch. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + o Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + o 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. + + o Neither the name of JGoodies Karsten Lentzsch 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. diff --git a/build/windows/launcher/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt b/build/windows/launcher/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt old mode 100755 new mode 100644 index cbee875ba6d..b1e3f5a2638 --- a/build/windows/launcher/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt +++ b/build/windows/launcher/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt @@ -1,504 +1,504 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - 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 Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -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 and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -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 other code 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. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - 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, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) 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. - - d) 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. - - e) 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 materials to be 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 with -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 Lesser 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 - - 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 Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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! - - + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + 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 Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +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 other code 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. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + 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, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) 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. + + d) 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. + + e) 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 materials to be 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 with +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 Lesser 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 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 --git a/build/windows/launcher/launch4j/lib/XStream.LICENSE.txt b/build/windows/launcher/launch4j/lib/XStream.LICENSE.txt old mode 100755 new mode 100644 index 5ccad869400..4848b3e4e5d --- a/build/windows/launcher/launch4j/lib/XStream.LICENSE.txt +++ b/build/windows/launcher/launch4j/lib/XStream.LICENSE.txt @@ -1,27 +1,27 @@ -(BSD Style License) - -Copyright (c) 2003-2004, Joe Walnes -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. 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. - -Neither the name of XStream 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +(BSD Style License) + +Copyright (c) 2003-2004, Joe Walnes +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. 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. + +Neither the name of XStream 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. diff --git a/build/windows/launcher/launch4j/lib/commons.LICENSE.txt b/build/windows/launcher/launch4j/lib/commons.LICENSE.txt old mode 100755 new mode 100644 index fdb6475220a..e12244a4510 --- a/build/windows/launcher/launch4j/lib/commons.LICENSE.txt +++ b/build/windows/launcher/launch4j/lib/commons.LICENSE.txt @@ -1,50 +1,50 @@ -/* - - ============================================================================ - The Apache Software License, Version 1.1 - ============================================================================ - - Copyright (C) @year@ The Apache Software Foundation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modifica- - tion, 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. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. - - 4. The names "Apache Cocoon" and "Apache Software Foundation" must not be - used to endorse or promote products derived from this software without - prior written permission. For written permission, please contact - apache@apache.org. - - 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 - APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - DING, 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. - - This software consists of voluntary contributions made by many individuals - on behalf of the Apache Software Foundation and was originally created by - Stefano Mazzocchi . For more information on the Apache - Software Foundation, please see . - -*/ +/* + + ============================================================================ + The Apache Software License, Version 1.1 + ============================================================================ + + Copyright (C) @year@ The Apache Software Foundation. All rights reserved. + + Redistribution and use in source and binary forms, with or without modifica- + tion, 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. The end-user documentation included with the redistribution, if any, must + include the following acknowledgment: "This product includes software + developed by the Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, if + and wherever such third-party acknowledgments normally appear. + + 4. The names "Apache Cocoon" and "Apache Software Foundation" must not be + used to endorse or promote products derived from this software without + prior written permission. For written permission, please contact + apache@apache.org. + + 5. Products derived from this software may not be called "Apache", nor may + "Apache" appear in their name, without prior written permission of the + Apache Software Foundation. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 + APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + DING, 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. + + This software consists of voluntary contributions made by many individuals + on behalf of the Apache Software Foundation and was originally created by + Stefano Mazzocchi . For more information on the Apache + Software Foundation, please see . + +*/ diff --git a/build/windows/launcher/launch4j/lib/foxtrot.LICENSE.txt b/build/windows/launcher/launch4j/lib/foxtrot.LICENSE.txt old mode 100755 new mode 100644 index 5fa4019d5bf..49e0c5a5182 --- a/build/windows/launcher/launch4j/lib/foxtrot.LICENSE.txt +++ b/build/windows/launcher/launch4j/lib/foxtrot.LICENSE.txt @@ -1,25 +1,25 @@ -Copyright (c) 2002, Simone Bordet & Marco Cravero -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - - 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. - - - Neither the name of Foxtrot nor the names of the contributors may be used - to endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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. +Copyright (c) 2002, Simone Bordet & Marco Cravero +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of Foxtrot nor the names of the contributors may be used + to endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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. diff --git a/build/windows/launcher/launch4j/manifest/uac.exe.manifest b/build/windows/launcher/launch4j/manifest/uac.exe.manifest old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/manifest/xp-themes.exe.manifest b/build/windows/launcher/launch4j/manifest/xp-themes.exe.manifest old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/asterix-o.gif b/build/windows/launcher/launch4j/src/images/asterix-o.gif old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/asterix.gif b/build/windows/launcher/launch4j/src/images/asterix.gif old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/build.png b/build/windows/launcher/launch4j/src/images/build.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/button_ok.png b/build/windows/launcher/launch4j/src/images/button_ok.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/cancel16.png b/build/windows/launcher/launch4j/src/images/cancel16.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/down16.png b/build/windows/launcher/launch4j/src/images/down16.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/edit_add16.png b/build/windows/launcher/launch4j/src/images/edit_add16.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/info.png b/build/windows/launcher/launch4j/src/images/info.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/new.png b/build/windows/launcher/launch4j/src/images/new.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/new16.png b/build/windows/launcher/launch4j/src/images/new16.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/ok16.png b/build/windows/launcher/launch4j/src/images/ok16.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/open.png b/build/windows/launcher/launch4j/src/images/open.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/open16.png b/build/windows/launcher/launch4j/src/images/open16.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/run.png b/build/windows/launcher/launch4j/src/images/run.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/save.png b/build/windows/launcher/launch4j/src/images/save.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/images/up16.png b/build/windows/launcher/launch4j/src/images/up16.png old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/launch4j.properties b/build/windows/launcher/launch4j/src/launch4j.properties old mode 100755 new mode 100644 index 463c7a034af..7a64c71e7c6 --- a/build/windows/launcher/launch4j/src/launch4j.properties +++ b/build/windows/launcher/launch4j/src/launch4j.properties @@ -1,2 +1,2 @@ -versionNumber=3.0.1.0 -version=3.0.1 +versionNumber=3.0.1.0 +version=3.0.1 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/Builder.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/Builder.java old mode 100755 new mode 100644 index d7badc7f3e4..2fb4d3410b0 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/Builder.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/Builder.java @@ -1,207 +1,207 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2005-04-24 - */ -package net.sf.launch4j; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; - -import net.sf.launch4j.binding.InvariantViolationException; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Builder { - private final Log _log; - private final File _basedir; - - public Builder(Log log) { - _log = log; - _basedir = Util.getJarBasedir(); - } - - public Builder(Log log, File basedir) { - _log = log; - _basedir = basedir; - } - - /** - * @return Output file path. - */ - public File build() throws BuilderException { - final Config c = ConfigPersister.getInstance().getConfig(); - try { - c.validate(); - } catch (InvariantViolationException e) { - throw new BuilderException(e.getMessage()); - } - File rc = null; - File ro = null; - File outfile = null; - FileInputStream is = null; - FileOutputStream os = null; - final RcBuilder rcb = new RcBuilder(); - try { - rc = rcb.build(c); - ro = Util.createTempFile("o"); - outfile = ConfigPersister.getInstance().getOutputFile(); - - Cmd resCmd = new Cmd(_basedir); - resCmd.addExe("windres") - .add(Util.WINDOWS_OS ? "--preprocessor=type" : "--preprocessor=cat") - .add("-J rc -O coff -F pe-i386") - .addAbsFile(rc) - .addAbsFile(ro); - _log.append(Messages.getString("Builder.compiling.resources")); - resCmd.exec(_log); - - Cmd ldCmd = new Cmd(_basedir); - ldCmd.addExe("ld") - .add("-mi386pe") - .add("--oformat pei-i386") - .add((c.getHeaderType().equals(Config.GUI_HEADER)) - ? "--subsystem windows" : "--subsystem console") - .add("-s") // strip symbols - .addFiles(c.getHeaderObjects()) - .addAbsFile(ro) - .addFiles(c.getLibs()) - .add("-o") - .addAbsFile(outfile); - _log.append(Messages.getString("Builder.linking")); - ldCmd.exec(_log); - - if (!c.isDontWrapJar()) { - _log.append(Messages.getString("Builder.wrapping")); - int len; - byte[] buffer = new byte[1024]; - is = new FileInputStream(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), c.getJar())); - os = new FileOutputStream(outfile, true); - while ((len = is.read(buffer)) > 0) { - os.write(buffer, 0, len); - } - } - _log.append(Messages.getString("Builder.success") + outfile.getPath()); - return outfile; - } catch (IOException e) { - Util.delete(outfile); - _log.append(e.getMessage()); - throw new BuilderException(e); - } catch (ExecException e) { - Util.delete(outfile); - String msg = e.getMessage(); - if (msg != null && msg.indexOf("windres") != -1) { - if (e.getErrLine() != -1) { - _log.append(Messages.getString("Builder.line.has.errors", - String.valueOf(e.getErrLine()))); - _log.append(rcb.getLine(e.getErrLine())); - } else { - _log.append(Messages.getString("Builder.generated.resource.file")); - _log.append(rcb.getContent()); - } - } - throw new BuilderException(e); - } finally { - Util.close(is); - Util.close(os); - Util.delete(rc); - Util.delete(ro); - } - } -} - -class Cmd { - private final List _cmd = new ArrayList(); - private final File _basedir; - private final File _bindir; - - public Cmd(File basedir) { - _basedir = basedir; - String path = System.getProperty("launch4j.bindir"); - if (path == null) { - _bindir = new File(basedir, "bin"); - } else { - File bindir = new File(path); - _bindir = bindir.isAbsolute() ? bindir : new File(basedir, path); - } - } - - public Cmd add(String s) { - StringTokenizer st = new StringTokenizer(s); - while (st.hasMoreTokens()) { - _cmd.add(st.nextToken()); - } - return this; - } - - public Cmd addAbsFile(File file) { - _cmd.add(file.getPath()); - return this; - } - - public Cmd addFile(String pathname) { - _cmd.add(new File(_basedir, pathname).getPath()); - return this; - } - - public Cmd addExe(String pathname) { - if (Util.WINDOWS_OS) { - pathname += ".exe"; - } - _cmd.add(new File(_bindir, pathname).getPath()); - return this; - } - - public Cmd addFiles(List files) { - for (Iterator iter = files.iterator(); iter.hasNext();) { - addFile((String) iter.next()); - } - return this; - } - - public void exec(Log log) throws ExecException { - String[] cmd = (String[]) _cmd.toArray(new String[_cmd.size()]); - Util.exec(cmd, log); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2005-04-24 + */ +package net.sf.launch4j; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.StringTokenizer; + +import net.sf.launch4j.binding.InvariantViolationException; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Builder { + private final Log _log; + private final File _basedir; + + public Builder(Log log) { + _log = log; + _basedir = Util.getJarBasedir(); + } + + public Builder(Log log, File basedir) { + _log = log; + _basedir = basedir; + } + + /** + * @return Output file path. + */ + public File build() throws BuilderException { + final Config c = ConfigPersister.getInstance().getConfig(); + try { + c.validate(); + } catch (InvariantViolationException e) { + throw new BuilderException(e.getMessage()); + } + File rc = null; + File ro = null; + File outfile = null; + FileInputStream is = null; + FileOutputStream os = null; + final RcBuilder rcb = new RcBuilder(); + try { + rc = rcb.build(c); + ro = Util.createTempFile("o"); + outfile = ConfigPersister.getInstance().getOutputFile(); + + Cmd resCmd = new Cmd(_basedir); + resCmd.addExe("windres") + .add(Util.WINDOWS_OS ? "--preprocessor=type" : "--preprocessor=cat") + .add("-J rc -O coff -F pe-i386") + .addAbsFile(rc) + .addAbsFile(ro); + _log.append(Messages.getString("Builder.compiling.resources")); + resCmd.exec(_log); + + Cmd ldCmd = new Cmd(_basedir); + ldCmd.addExe("ld") + .add("-mi386pe") + .add("--oformat pei-i386") + .add((c.getHeaderType().equals(Config.GUI_HEADER)) + ? "--subsystem windows" : "--subsystem console") + .add("-s") // strip symbols + .addFiles(c.getHeaderObjects()) + .addAbsFile(ro) + .addFiles(c.getLibs()) + .add("-o") + .addAbsFile(outfile); + _log.append(Messages.getString("Builder.linking")); + ldCmd.exec(_log); + + if (!c.isDontWrapJar()) { + _log.append(Messages.getString("Builder.wrapping")); + int len; + byte[] buffer = new byte[1024]; + is = new FileInputStream(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), c.getJar())); + os = new FileOutputStream(outfile, true); + while ((len = is.read(buffer)) > 0) { + os.write(buffer, 0, len); + } + } + _log.append(Messages.getString("Builder.success") + outfile.getPath()); + return outfile; + } catch (IOException e) { + Util.delete(outfile); + _log.append(e.getMessage()); + throw new BuilderException(e); + } catch (ExecException e) { + Util.delete(outfile); + String msg = e.getMessage(); + if (msg != null && msg.indexOf("windres") != -1) { + if (e.getErrLine() != -1) { + _log.append(Messages.getString("Builder.line.has.errors", + String.valueOf(e.getErrLine()))); + _log.append(rcb.getLine(e.getErrLine())); + } else { + _log.append(Messages.getString("Builder.generated.resource.file")); + _log.append(rcb.getContent()); + } + } + throw new BuilderException(e); + } finally { + Util.close(is); + Util.close(os); + Util.delete(rc); + Util.delete(ro); + } + } +} + +class Cmd { + private final List _cmd = new ArrayList(); + private final File _basedir; + private final File _bindir; + + public Cmd(File basedir) { + _basedir = basedir; + String path = System.getProperty("launch4j.bindir"); + if (path == null) { + _bindir = new File(basedir, "bin"); + } else { + File bindir = new File(path); + _bindir = bindir.isAbsolute() ? bindir : new File(basedir, path); + } + } + + public Cmd add(String s) { + StringTokenizer st = new StringTokenizer(s); + while (st.hasMoreTokens()) { + _cmd.add(st.nextToken()); + } + return this; + } + + public Cmd addAbsFile(File file) { + _cmd.add(file.getPath()); + return this; + } + + public Cmd addFile(String pathname) { + _cmd.add(new File(_basedir, pathname).getPath()); + return this; + } + + public Cmd addExe(String pathname) { + if (Util.WINDOWS_OS) { + pathname += ".exe"; + } + _cmd.add(new File(_bindir, pathname).getPath()); + return this; + } + + public Cmd addFiles(List files) { + for (Iterator iter = files.iterator(); iter.hasNext();) { + addFile((String) iter.next()); + } + return this; + } + + public void exec(Log log) throws ExecException { + String[] cmd = (String[]) _cmd.toArray(new String[_cmd.size()]); + Util.exec(cmd, log); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/BuilderException.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/BuilderException.java old mode 100755 new mode 100644 index a84c2e279bb..d4db8c84e29 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/BuilderException.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/BuilderException.java @@ -1,52 +1,52 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 13, 2005 - */ -package net.sf.launch4j; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class BuilderException extends Exception { - public BuilderException() {} - - public BuilderException(Throwable t) { - super(t); - } - - public BuilderException(String msg) { - super(msg); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 13, 2005 + */ +package net.sf.launch4j; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class BuilderException extends Exception { + public BuilderException() {} + + public BuilderException(Throwable t) { + super(t); + } + + public BuilderException(String msg) { + super(msg); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ExecException.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/ExecException.java old mode 100755 new mode 100644 index 236ae780f15..061454d41a2 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ExecException.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ExecException.java @@ -1,66 +1,66 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 14, 2005 - */ -package net.sf.launch4j; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ExecException extends Exception { - private final int _errLine; - - public ExecException(Throwable t, int errLine) { - super(t); - _errLine = errLine; - } - - public ExecException(Throwable t) { - this(t, -1); - } - - public ExecException(String msg, int errLine) { - super(msg); - _errLine = errLine; - } - - public ExecException(String msg) { - this(msg, -1); - } - - public int getErrLine() { - return _errLine; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 14, 2005 + */ +package net.sf.launch4j; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ExecException extends Exception { + private final int _errLine; + + public ExecException(Throwable t, int errLine) { + super(t); + _errLine = errLine; + } + + public ExecException(Throwable t) { + this(t, -1); + } + + public ExecException(String msg, int errLine) { + super(msg); + _errLine = errLine; + } + + public ExecException(String msg) { + this(msg, -1); + } + + public int getErrLine() { + return _errLine; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/FileChooserFilter.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/FileChooserFilter.java old mode 100755 new mode 100644 index 5199a6deb3a..606edf08e27 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/FileChooserFilter.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/FileChooserFilter.java @@ -1,76 +1,76 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2004-01-15 - */ -package net.sf.launch4j; - -import java.io.File; - -import javax.swing.filechooser.FileFilter; - -/** - * @author Copyright (C) 2004 Grzegorz Kowal - */ -public class FileChooserFilter extends FileFilter { - String _description; - String[] _extensions; - - public FileChooserFilter(String description, String extension) { - _description = description; - _extensions = new String[] {extension}; - } - - public FileChooserFilter(String description, String[] extensions) { - _description = description; - _extensions = extensions; - } - - public boolean accept(File f) { - if (f.isDirectory()) { - return true; - } - String ext = Util.getExtension(f); - for (int i = 0; i < _extensions.length; i++) { - if (ext.toLowerCase().equals(_extensions[i].toLowerCase())) { - return true; - } - } - return false; - } - - public String getDescription() { - return _description; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2004-01-15 + */ +package net.sf.launch4j; + +import java.io.File; + +import javax.swing.filechooser.FileFilter; + +/** + * @author Copyright (C) 2004 Grzegorz Kowal + */ +public class FileChooserFilter extends FileFilter { + String _description; + String[] _extensions; + + public FileChooserFilter(String description, String extension) { + _description = description; + _extensions = new String[] {extension}; + } + + public FileChooserFilter(String description, String[] extensions) { + _description = description; + _extensions = extensions; + } + + public boolean accept(File f) { + if (f.isDirectory()) { + return true; + } + String ext = Util.getExtension(f); + for (int i = 0; i < _extensions.length; i++) { + if (ext.toLowerCase().equals(_extensions[i].toLowerCase())) { + return true; + } + } + return false; + } + + public String getDescription() { + return _description; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/Log.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/Log.java old mode 100755 new mode 100644 index c4d591b0cbb..d96f53c9b98 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/Log.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/Log.java @@ -1,105 +1,105 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 12, 2005 - */ -package net.sf.launch4j; - -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public abstract class Log { - private static final Log _consoleLog = new ConsoleLog(); - private static final Log _antLog = new AntLog(); - - public abstract void clear(); - public abstract void append(String line); - - public static Log getConsoleLog() { - return _consoleLog; - } - - public static Log getAntLog() { - return _antLog; - } - - public static Log getSwingLog(JTextArea textArea) { - return new SwingLog(textArea); - } -} - -class ConsoleLog extends Log { - public void clear() { - System.out.println("\n"); - } - - public void append(String line) { - System.out.println("launch4j: " + line); - } -} - -class AntLog extends Log { - public void clear() { - System.out.println("\n"); - } - - public void append(String line) { - System.out.println(line); - } -} - -class SwingLog extends Log { - private final JTextArea _textArea; - - public SwingLog(JTextArea textArea) { - _textArea = textArea; - } - - public void clear() { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - _textArea.setText(""); - }}); - } - - public void append(final String line) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - _textArea.append(line + "\n"); - }}); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 12, 2005 + */ +package net.sf.launch4j; + +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public abstract class Log { + private static final Log _consoleLog = new ConsoleLog(); + private static final Log _antLog = new AntLog(); + + public abstract void clear(); + public abstract void append(String line); + + public static Log getConsoleLog() { + return _consoleLog; + } + + public static Log getAntLog() { + return _antLog; + } + + public static Log getSwingLog(JTextArea textArea) { + return new SwingLog(textArea); + } +} + +class ConsoleLog extends Log { + public void clear() { + System.out.println("\n"); + } + + public void append(String line) { + System.out.println("launch4j: " + line); + } +} + +class AntLog extends Log { + public void clear() { + System.out.println("\n"); + } + + public void append(String line) { + System.out.println(line); + } +} + +class SwingLog extends Log { + private final JTextArea _textArea; + + public SwingLog(JTextArea textArea) { + _textArea = textArea; + } + + public void clear() { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + _textArea.setText(""); + }}); + } + + public void append(final String line) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + _textArea.append(line + "\n"); + }}); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/Main.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/Main.java old mode 100755 new mode 100644 index 45f84ad7964..7153aad6901 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/Main.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/Main.java @@ -1,99 +1,99 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2008 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j; - -import java.io.File; -import java.io.InputStream; -import java.util.Properties; - -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.formimpl.MainFrame; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Main { - private static String _name; - private static String _description; - - public static void main(String[] args) { - try { - Properties props = new Properties(); - InputStream in = Main.class.getClassLoader() - .getResourceAsStream("launch4j.properties"); - props.load(in); - in.close(); - setDescription(props); - - if (args.length == 0) { - ConfigPersister.getInstance().createBlank(); - MainFrame.createInstance(); - } else if (args.length == 1 && !args[0].startsWith("-")) { - ConfigPersister.getInstance().load(new File(args[0])); - Builder b = new Builder(Log.getConsoleLog()); - b.build(); - } else { - System.out.println(_description - + Messages.getString("Main.usage") - + ": launch4j config.xml"); - } - } catch (Exception e) { - Log.getConsoleLog().append(e.getMessage()); - } - } - - public static String getName() { - return _name; - } - - public static String getDescription() { - return _description; - } - - private static void setDescription(Properties props) { - _name = "Launch4j " + props.getProperty("version"); - _description = _name + - " (http://launch4j.sourceforge.net/)\n" + - "Cross-platform Java application wrapper" + - " for creating Windows native executables.\n\n" + - "Copyright (C) 2004, 2008 Grzegorz Kowal\n\n" + - "Launch4j comes with ABSOLUTELY NO WARRANTY.\n" + - "This is free software, licensed under the BSD License.\n" + - "This product includes software developed by the Apache Software Foundation" + - " (http://www.apache.org/)."; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2008 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j; + +import java.io.File; +import java.io.InputStream; +import java.util.Properties; + +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.formimpl.MainFrame; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Main { + private static String _name; + private static String _description; + + public static void main(String[] args) { + try { + Properties props = new Properties(); + InputStream in = Main.class.getClassLoader() + .getResourceAsStream("launch4j.properties"); + props.load(in); + in.close(); + setDescription(props); + + if (args.length == 0) { + ConfigPersister.getInstance().createBlank(); + MainFrame.createInstance(); + } else if (args.length == 1 && !args[0].startsWith("-")) { + ConfigPersister.getInstance().load(new File(args[0])); + Builder b = new Builder(Log.getConsoleLog()); + b.build(); + } else { + System.out.println(_description + + Messages.getString("Main.usage") + + ": launch4j config.xml"); + } + } catch (Exception e) { + Log.getConsoleLog().append(e.getMessage()); + } + } + + public static String getName() { + return _name; + } + + public static String getDescription() { + return _description; + } + + private static void setDescription(Properties props) { + _name = "Launch4j " + props.getProperty("version"); + _description = _name + + " (http://launch4j.sourceforge.net/)\n" + + "Cross-platform Java application wrapper" + + " for creating Windows native executables.\n\n" + + "Copyright (C) 2004, 2008 Grzegorz Kowal\n\n" + + "Launch4j comes with ABSOLUTELY NO WARRANTY.\n" + + "This is free software, licensed under the BSD License.\n" + + "This product includes software developed by the Apache Software Foundation" + + " (http://www.apache.org/)."; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/Messages.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/Messages.java old mode 100755 new mode 100644 index 35d4c895084..1c082b20f7c --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/Messages.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/Messages.java @@ -1,78 +1,78 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j; - -import java.text.MessageFormat; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - private static final MessageFormat FORMATTER = new MessageFormat(""); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } - - public static String getString(String key, String arg0) { - return getString(key, new Object[] {arg0}); - } - - public static String getString(String key, String arg0, String arg1) { - return getString(key, new Object[] {arg0, arg1}); - } - - public static String getString(String key, String arg0, String arg1, String arg2) { - return getString(key, new Object[] {arg0, arg1, arg2}); - } - - public static String getString(String key, Object[] args) { - try { - FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); - return FORMATTER.format(args); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j; + +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + private static final MessageFormat FORMATTER = new MessageFormat(""); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static String getString(String key, String arg0) { + return getString(key, new Object[] {arg0}); + } + + public static String getString(String key, String arg0, String arg1) { + return getString(key, new Object[] {arg0, arg1}); + } + + public static String getString(String key, String arg0, String arg1, String arg2) { + return getString(key, new Object[] {arg0, arg1, arg2}); + } + + public static String getString(String key, Object[] args) { + try { + FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); + return FORMATTER.format(args); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/OptionParser.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/OptionParser.java old mode 100755 new mode 100644 index bb2432c8e18..46954e982b5 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/OptionParser.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/OptionParser.java @@ -1,71 +1,71 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2005-04-24 - */ -package net.sf.launch4j; - -//import net.sf.launch4j.config.Config; - -//import org.apache.commons.cli.CommandLine; -//import org.apache.commons.cli.CommandLineParser; -//import org.apache.commons.cli.HelpFormatter; -//import org.apache.commons.cli.Options; -//import org.apache.commons.cli.ParseException; -//import org.apache.commons.cli.PosixParser; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class OptionParser { - -// private final Options _options; -// -// public OptionParser() { -// _options = new Options(); -// _options.addOption("h", "header", true, "header"); -// } -// -// public Config parse(Config c, String[] args) throws ParseException { -// CommandLineParser parser = new PosixParser(); -// CommandLine cl = parser.parse(_options, args); -// c.setJar(getFile(props, Config.JAR)); -// c.setOutfile(getFile(props, Config.OUTFILE)); -// } -// -// public void printHelp() { -// HelpFormatter formatter = new HelpFormatter(); -// formatter.printHelp("launch4j", _options); -// } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2005-04-24 + */ +package net.sf.launch4j; + +//import net.sf.launch4j.config.Config; + +//import org.apache.commons.cli.CommandLine; +//import org.apache.commons.cli.CommandLineParser; +//import org.apache.commons.cli.HelpFormatter; +//import org.apache.commons.cli.Options; +//import org.apache.commons.cli.ParseException; +//import org.apache.commons.cli.PosixParser; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class OptionParser { + +// private final Options _options; +// +// public OptionParser() { +// _options = new Options(); +// _options.addOption("h", "header", true, "header"); +// } +// +// public Config parse(Config c, String[] args) throws ParseException { +// CommandLineParser parser = new PosixParser(); +// CommandLine cl = parser.parse(_options, args); +// c.setJar(getFile(props, Config.JAR)); +// c.setOutfile(getFile(props, Config.OUTFILE)); +// } +// +// public void printHelp() { +// HelpFormatter formatter = new HelpFormatter(); +// formatter.printHelp("launch4j", _options); +// } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/RcBuilder.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/RcBuilder.java old mode 100755 new mode 100644 index f8885e3e6d4..c0cdb7118b4 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/RcBuilder.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/RcBuilder.java @@ -1,340 +1,340 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2005-04-24 - */ -package net.sf.launch4j; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.List; - -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.config.Jre; -import net.sf.launch4j.config.Msg; -import net.sf.launch4j.config.Splash; -import net.sf.launch4j.config.VersionInfo; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class RcBuilder { - - // winnt.h - public static final int LANG_NEUTRAL = 0; - public static final int SUBLANG_NEUTRAL = 0; - public static final int SUBLANG_DEFAULT = 1; - public static final int SUBLANG_SYS_DEFAULT = 2; - - // MANIFEST - public static final int MANIFEST = 1; - - // ICON - public static final int APP_ICON = 1; - - // BITMAP - public static final int SPLASH_BITMAP = 1; - - // RCDATA - public static final int JRE_PATH = 1; - public static final int JAVA_MIN_VER = 2; - public static final int JAVA_MAX_VER = 3; - public static final int SHOW_SPLASH = 4; - public static final int SPLASH_WAITS_FOR_WINDOW = 5; - public static final int SPLASH_TIMEOUT = 6; - public static final int SPLASH_TIMEOUT_ERR = 7; - public static final int CHDIR = 8; - public static final int SET_PROC_NAME = 9; - public static final int ERR_TITLE = 10; - public static final int GUI_HEADER_STAYS_ALIVE = 11; - public static final int JVM_OPTIONS = 12; - public static final int CMD_LINE = 13; - public static final int JAR = 14; - public static final int MAIN_CLASS = 15; - public static final int CLASSPATH = 16; - public static final int WRAPPER = 17; - public static final int JDK_PREFERENCE = 18; - public static final int ENV_VARIABLES = 19; - public static final int PRIORITY_CLASS = 20; - public static final int DOWNLOAD_URL = 21; - public static final int SUPPORT_URL = 22; - public static final int MUTEX_NAME = 23; - public static final int INSTANCE_WINDOW_TITLE = 24; - public static final int INITIAL_HEAP_SIZE = 25; - public static final int INITIAL_HEAP_PERCENT = 26; - public static final int MAX_HEAP_SIZE = 27; - public static final int MAX_HEAP_PERCENT = 28; - - public static final int STARTUP_ERR = 101; - public static final int BUNDLED_JRE_ERR = 102; - public static final int JRE_VERSION_ERR = 103; - public static final int LAUNCHER_ERR = 104; - public static final int INSTANCE_ALREADY_EXISTS_MSG = 105; - - private final StringBuffer _sb = new StringBuffer(); - - public String getContent() { - return _sb.toString(); - } - - public String getLine(int line) { - return _sb.toString().split("\n")[line - 1]; - } - - public File build(Config c) throws IOException { - _sb.append("LANGUAGE "); - _sb.append(LANG_NEUTRAL); - _sb.append(", "); - _sb.append(SUBLANG_DEFAULT); - _sb.append('\n'); - addVersionInfo(c.getVersionInfo()); - addJre(c.getJre()); - addManifest(MANIFEST, c.getManifest()); - addIcon(APP_ICON, c.getIcon()); - addText(ERR_TITLE, c.getErrTitle()); - addText(DOWNLOAD_URL, c.getDownloadUrl()); - addText(SUPPORT_URL, c.getSupportUrl()); - addText(CMD_LINE, c.getCmdLine()); - addWindowsPath(CHDIR, c.getChdir()); - addText(PRIORITY_CLASS, String.valueOf(c.getPriorityClass())); - addTrue(SET_PROC_NAME, c.isCustomProcName()); - addTrue(GUI_HEADER_STAYS_ALIVE, c.isStayAlive()); - addSplash(c.getSplash()); - addMessages(c); - - if (c.getSingleInstance() != null) { - addText(MUTEX_NAME, c.getSingleInstance().getMutexName()); - addText(INSTANCE_WINDOW_TITLE, c.getSingleInstance().getWindowTitle()); - } - - if (c.getVariables() != null && !c.getVariables().isEmpty()) { - StringBuffer vars = new StringBuffer(); - append(vars, c.getVariables(), "\t"); - addText(ENV_VARIABLES, vars.toString()); - } - - // MAIN_CLASS / JAR - addTrue(WRAPPER, !c.isDontWrapJar()); - if (c.getClassPath() != null) { - addText(MAIN_CLASS, c.getClassPath().getMainClass()); - addWindowsPath(CLASSPATH, c.getClassPath().getPathsString()); - } - if (c.isDontWrapJar() && c.getJar() != null) { - addWindowsPath(JAR, c.getJar().getPath()); - } - - File f = Util.createTempFile("rc"); - BufferedWriter w = new BufferedWriter(new FileWriter(f)); - w.write(_sb.toString()); - w.close(); - return f; - } - - private void addVersionInfo(VersionInfo v) { - if (v == null) { - return; - } - _sb.append("1 VERSIONINFO\n"); - _sb.append("FILEVERSION "); - _sb.append(v.getFileVersion().replaceAll("\\.", ", ")); - _sb.append("\nPRODUCTVERSION "); - _sb.append(v.getProductVersion().replaceAll("\\.", ", ")); - _sb.append("\nFILEFLAGSMASK 0\n" + - "FILEOS 0x40000\n" + - "FILETYPE 1\n" + - "{\n" + - " BLOCK \"StringFileInfo\"\n" + - " {\n" + - " BLOCK \"040904E4\"\n" + // English - " {\n"); - addVerBlockValue("CompanyName", v.getCompanyName()); - addVerBlockValue("FileDescription", v.getFileDescription()); - addVerBlockValue("FileVersion", v.getTxtFileVersion()); - addVerBlockValue("InternalName", v.getInternalName()); - addVerBlockValue("LegalCopyright", v.getCopyright()); - addVerBlockValue("OriginalFilename", v.getOriginalFilename()); - addVerBlockValue("ProductName", v.getProductName()); - addVerBlockValue("ProductVersion", v.getTxtProductVersion()); - _sb.append(" }\n }\nBLOCK \"VarFileInfo\"\n{\nVALUE \"Translation\", 0x0409, 0x04E4\n}\n}"); - } - - private void addJre(Jre jre) { - addWindowsPath(JRE_PATH, jre.getPath()); - addText(JAVA_MIN_VER, jre.getMinVersion()); - addText(JAVA_MAX_VER, jre.getMaxVersion()); - addText(JDK_PREFERENCE, String.valueOf(jre.getJdkPreferenceIndex())); - addInteger(INITIAL_HEAP_SIZE, jre.getInitialHeapSize()); - addInteger(INITIAL_HEAP_PERCENT, jre.getInitialHeapPercent()); - addInteger(MAX_HEAP_SIZE, jre.getMaxHeapSize()); - addInteger(MAX_HEAP_PERCENT, jre.getMaxHeapPercent()); - - StringBuffer options = new StringBuffer(); - if (jre.getOptions() != null && !jre.getOptions().isEmpty()) { - addSpace(options); - append(options, jre.getOptions(), " "); - } - addText(JVM_OPTIONS, options.toString()); - } - - private void addSplash(Splash splash) { - if (splash == null) { - return; - } - addTrue(SHOW_SPLASH, true); - addTrue(SPLASH_WAITS_FOR_WINDOW, splash.getWaitForWindow()); - addText(SPLASH_TIMEOUT, String.valueOf(splash.getTimeout())); - addTrue(SPLASH_TIMEOUT_ERR, splash.isTimeoutErr()); - addBitmap(SPLASH_BITMAP, splash.getFile()); - } - - private void addMessages(Config c) { - Msg msg = c.getMessages(); - if (msg == null) { - msg = new Msg(); - } - addText(STARTUP_ERR, msg.getStartupErr()); - addText(BUNDLED_JRE_ERR, msg.getBundledJreErr()); - addText(JRE_VERSION_ERR, msg.getJreVersionErr()); - addText(LAUNCHER_ERR, msg.getLauncherErr()); - if (c.getSingleInstance() != null) { - addText(INSTANCE_ALREADY_EXISTS_MSG, msg.getInstanceAlreadyExistsMsg()); - } - } - - private void append(StringBuffer sb, List list, String separator) { - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - if (i < list.size() - 1) { - sb.append(separator); - } - } - } - - private void addText(int id, String text) { - if (text == null || text.equals("")) { - return; - } - _sb.append(id); - _sb.append(" RCDATA BEGIN \""); - _sb.append(escape(text)); - _sb.append("\\0\" END\n"); - } - - private void addTrue(int id, boolean value) { - if (value) { - addText(id, "true"); - } - } - - private void addInteger(int id, Integer value) { - if (value != null) { - addText(id, value.toString()); - } - } - - /** - * Stores path in Windows format with '\' separators. - */ - private void addWindowsPath(int id, String path) { - if (path == null || path.equals("")) { - return; - } - _sb.append(id); - _sb.append(" RCDATA BEGIN \""); - _sb.append(path.replaceAll("\\\\", "\\\\\\\\") - .replaceAll("/", "\\\\\\\\")); - _sb.append("\\0\" END\n"); - } - - private void addManifest(int id, File manifest) { - if (manifest == null || manifest.getPath().equals("")) { - return; - } - _sb.append(id); - _sb.append(" 24 \""); - _sb.append(getPath(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), manifest))); - _sb.append("\"\n"); - } - - private void addIcon(int id, File icon) { - if (icon == null || icon.getPath().equals("")) { - return; - } - _sb.append(id); - _sb.append(" ICON DISCARDABLE \""); - _sb.append(getPath(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), icon))); - _sb.append("\"\n"); - } - - private void addBitmap(int id, File bitmap) { - if (bitmap == null) { - return; - } - _sb.append(id); - _sb.append(" BITMAP \""); - _sb.append(getPath(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), bitmap))); - _sb.append("\"\n"); - } - - private String getPath(File f) { - return f.getPath().replaceAll("\\\\", "\\\\\\\\"); - } - - private void addSpace(StringBuffer sb) { - int len = sb.length(); - if (len-- > 0 && sb.charAt(len) != ' ') { - sb.append(' '); - } - } - - private void addVerBlockValue(String key, String value) { - _sb.append(" VALUE \""); - _sb.append(key); - _sb.append("\", \""); - if (value != null) { - _sb.append(escape(value)); - } - _sb.append("\"\n"); - } - - private String escape(String text) { - return text.replaceAll("\"", "\"\""); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2005-04-24 + */ +package net.sf.launch4j; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; + +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.config.Jre; +import net.sf.launch4j.config.Msg; +import net.sf.launch4j.config.Splash; +import net.sf.launch4j.config.VersionInfo; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class RcBuilder { + + // winnt.h + public static final int LANG_NEUTRAL = 0; + public static final int SUBLANG_NEUTRAL = 0; + public static final int SUBLANG_DEFAULT = 1; + public static final int SUBLANG_SYS_DEFAULT = 2; + + // MANIFEST + public static final int MANIFEST = 1; + + // ICON + public static final int APP_ICON = 1; + + // BITMAP + public static final int SPLASH_BITMAP = 1; + + // RCDATA + public static final int JRE_PATH = 1; + public static final int JAVA_MIN_VER = 2; + public static final int JAVA_MAX_VER = 3; + public static final int SHOW_SPLASH = 4; + public static final int SPLASH_WAITS_FOR_WINDOW = 5; + public static final int SPLASH_TIMEOUT = 6; + public static final int SPLASH_TIMEOUT_ERR = 7; + public static final int CHDIR = 8; + public static final int SET_PROC_NAME = 9; + public static final int ERR_TITLE = 10; + public static final int GUI_HEADER_STAYS_ALIVE = 11; + public static final int JVM_OPTIONS = 12; + public static final int CMD_LINE = 13; + public static final int JAR = 14; + public static final int MAIN_CLASS = 15; + public static final int CLASSPATH = 16; + public static final int WRAPPER = 17; + public static final int JDK_PREFERENCE = 18; + public static final int ENV_VARIABLES = 19; + public static final int PRIORITY_CLASS = 20; + public static final int DOWNLOAD_URL = 21; + public static final int SUPPORT_URL = 22; + public static final int MUTEX_NAME = 23; + public static final int INSTANCE_WINDOW_TITLE = 24; + public static final int INITIAL_HEAP_SIZE = 25; + public static final int INITIAL_HEAP_PERCENT = 26; + public static final int MAX_HEAP_SIZE = 27; + public static final int MAX_HEAP_PERCENT = 28; + + public static final int STARTUP_ERR = 101; + public static final int BUNDLED_JRE_ERR = 102; + public static final int JRE_VERSION_ERR = 103; + public static final int LAUNCHER_ERR = 104; + public static final int INSTANCE_ALREADY_EXISTS_MSG = 105; + + private final StringBuffer _sb = new StringBuffer(); + + public String getContent() { + return _sb.toString(); + } + + public String getLine(int line) { + return _sb.toString().split("\n")[line - 1]; + } + + public File build(Config c) throws IOException { + _sb.append("LANGUAGE "); + _sb.append(LANG_NEUTRAL); + _sb.append(", "); + _sb.append(SUBLANG_DEFAULT); + _sb.append('\n'); + addVersionInfo(c.getVersionInfo()); + addJre(c.getJre()); + addManifest(MANIFEST, c.getManifest()); + addIcon(APP_ICON, c.getIcon()); + addText(ERR_TITLE, c.getErrTitle()); + addText(DOWNLOAD_URL, c.getDownloadUrl()); + addText(SUPPORT_URL, c.getSupportUrl()); + addText(CMD_LINE, c.getCmdLine()); + addWindowsPath(CHDIR, c.getChdir()); + addText(PRIORITY_CLASS, String.valueOf(c.getPriorityClass())); + addTrue(SET_PROC_NAME, c.isCustomProcName()); + addTrue(GUI_HEADER_STAYS_ALIVE, c.isStayAlive()); + addSplash(c.getSplash()); + addMessages(c); + + if (c.getSingleInstance() != null) { + addText(MUTEX_NAME, c.getSingleInstance().getMutexName()); + addText(INSTANCE_WINDOW_TITLE, c.getSingleInstance().getWindowTitle()); + } + + if (c.getVariables() != null && !c.getVariables().isEmpty()) { + StringBuffer vars = new StringBuffer(); + append(vars, c.getVariables(), "\t"); + addText(ENV_VARIABLES, vars.toString()); + } + + // MAIN_CLASS / JAR + addTrue(WRAPPER, !c.isDontWrapJar()); + if (c.getClassPath() != null) { + addText(MAIN_CLASS, c.getClassPath().getMainClass()); + addWindowsPath(CLASSPATH, c.getClassPath().getPathsString()); + } + if (c.isDontWrapJar() && c.getJar() != null) { + addWindowsPath(JAR, c.getJar().getPath()); + } + + File f = Util.createTempFile("rc"); + BufferedWriter w = new BufferedWriter(new FileWriter(f)); + w.write(_sb.toString()); + w.close(); + return f; + } + + private void addVersionInfo(VersionInfo v) { + if (v == null) { + return; + } + _sb.append("1 VERSIONINFO\n"); + _sb.append("FILEVERSION "); + _sb.append(v.getFileVersion().replaceAll("\\.", ", ")); + _sb.append("\nPRODUCTVERSION "); + _sb.append(v.getProductVersion().replaceAll("\\.", ", ")); + _sb.append("\nFILEFLAGSMASK 0\n" + + "FILEOS 0x40000\n" + + "FILETYPE 1\n" + + "{\n" + + " BLOCK \"StringFileInfo\"\n" + + " {\n" + + " BLOCK \"040904E4\"\n" + // English + " {\n"); + addVerBlockValue("CompanyName", v.getCompanyName()); + addVerBlockValue("FileDescription", v.getFileDescription()); + addVerBlockValue("FileVersion", v.getTxtFileVersion()); + addVerBlockValue("InternalName", v.getInternalName()); + addVerBlockValue("LegalCopyright", v.getCopyright()); + addVerBlockValue("OriginalFilename", v.getOriginalFilename()); + addVerBlockValue("ProductName", v.getProductName()); + addVerBlockValue("ProductVersion", v.getTxtProductVersion()); + _sb.append(" }\n }\nBLOCK \"VarFileInfo\"\n{\nVALUE \"Translation\", 0x0409, 0x04E4\n}\n}"); + } + + private void addJre(Jre jre) { + addWindowsPath(JRE_PATH, jre.getPath()); + addText(JAVA_MIN_VER, jre.getMinVersion()); + addText(JAVA_MAX_VER, jre.getMaxVersion()); + addText(JDK_PREFERENCE, String.valueOf(jre.getJdkPreferenceIndex())); + addInteger(INITIAL_HEAP_SIZE, jre.getInitialHeapSize()); + addInteger(INITIAL_HEAP_PERCENT, jre.getInitialHeapPercent()); + addInteger(MAX_HEAP_SIZE, jre.getMaxHeapSize()); + addInteger(MAX_HEAP_PERCENT, jre.getMaxHeapPercent()); + + StringBuffer options = new StringBuffer(); + if (jre.getOptions() != null && !jre.getOptions().isEmpty()) { + addSpace(options); + append(options, jre.getOptions(), " "); + } + addText(JVM_OPTIONS, options.toString()); + } + + private void addSplash(Splash splash) { + if (splash == null) { + return; + } + addTrue(SHOW_SPLASH, true); + addTrue(SPLASH_WAITS_FOR_WINDOW, splash.getWaitForWindow()); + addText(SPLASH_TIMEOUT, String.valueOf(splash.getTimeout())); + addTrue(SPLASH_TIMEOUT_ERR, splash.isTimeoutErr()); + addBitmap(SPLASH_BITMAP, splash.getFile()); + } + + private void addMessages(Config c) { + Msg msg = c.getMessages(); + if (msg == null) { + msg = new Msg(); + } + addText(STARTUP_ERR, msg.getStartupErr()); + addText(BUNDLED_JRE_ERR, msg.getBundledJreErr()); + addText(JRE_VERSION_ERR, msg.getJreVersionErr()); + addText(LAUNCHER_ERR, msg.getLauncherErr()); + if (c.getSingleInstance() != null) { + addText(INSTANCE_ALREADY_EXISTS_MSG, msg.getInstanceAlreadyExistsMsg()); + } + } + + private void append(StringBuffer sb, List list, String separator) { + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + if (i < list.size() - 1) { + sb.append(separator); + } + } + } + + private void addText(int id, String text) { + if (text == null || text.equals("")) { + return; + } + _sb.append(id); + _sb.append(" RCDATA BEGIN \""); + _sb.append(escape(text)); + _sb.append("\\0\" END\n"); + } + + private void addTrue(int id, boolean value) { + if (value) { + addText(id, "true"); + } + } + + private void addInteger(int id, Integer value) { + if (value != null) { + addText(id, value.toString()); + } + } + + /** + * Stores path in Windows format with '\' separators. + */ + private void addWindowsPath(int id, String path) { + if (path == null || path.equals("")) { + return; + } + _sb.append(id); + _sb.append(" RCDATA BEGIN \""); + _sb.append(path.replaceAll("\\\\", "\\\\\\\\") + .replaceAll("/", "\\\\\\\\")); + _sb.append("\\0\" END\n"); + } + + private void addManifest(int id, File manifest) { + if (manifest == null || manifest.getPath().equals("")) { + return; + } + _sb.append(id); + _sb.append(" 24 \""); + _sb.append(getPath(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), manifest))); + _sb.append("\"\n"); + } + + private void addIcon(int id, File icon) { + if (icon == null || icon.getPath().equals("")) { + return; + } + _sb.append(id); + _sb.append(" ICON DISCARDABLE \""); + _sb.append(getPath(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), icon))); + _sb.append("\"\n"); + } + + private void addBitmap(int id, File bitmap) { + if (bitmap == null) { + return; + } + _sb.append(id); + _sb.append(" BITMAP \""); + _sb.append(getPath(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), bitmap))); + _sb.append("\"\n"); + } + + private String getPath(File f) { + return f.getPath().replaceAll("\\\\", "\\\\\\\\"); + } + + private void addSpace(StringBuffer sb) { + int len = sb.length(); + if (len-- > 0 && sb.charAt(len) != ' ') { + sb.append(' '); + } + } + + private void addVerBlockValue(String key, String value) { + _sb.append(" VALUE \""); + _sb.append(key); + _sb.append("\", \""); + if (value != null) { + _sb.append(escape(value)); + } + _sb.append("\"\n"); + } + + private String escape(String text) { + return text.replaceAll("\"", "\"\""); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/Util.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/Util.java old mode 100755 new mode 100644 index f3bf2456d6d..1a1fd7fb1c0 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/Util.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/Util.java @@ -1,197 +1,197 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2005-04-24 - */ -package net.sf.launch4j; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Util { - public static final boolean WINDOWS_OS = System.getProperty("os.name") - .toLowerCase().startsWith("windows"); - - private Util() {} - - public static File createTempFile(String suffix) throws IOException { - String tmpdir = System.getProperty("launch4j.tmpdir"); - if (tmpdir != null) { - if (tmpdir.indexOf(' ') != -1) { - throw new IOException(Messages.getString("Util.tmpdir")); - } - return File.createTempFile("launch4j", suffix, new File(tmpdir)); - } else { - return File.createTempFile("launch4j", suffix); - } - } - - /** - * Returns the base directory of a jar file or null if the class is a standalone file. - * @return System specific path - * - * Based on a patch submitted by Josh Elsasser - */ - public static File getJarBasedir() { - String url = Util.class.getClassLoader() - .getResource(Util.class.getName().replace('.', '/') + ".class") - .getFile() - .replaceAll("%20", " "); - if (url.startsWith("file:")) { - String jar = url.substring(5, url.lastIndexOf('!')); - int x = jar.lastIndexOf('/'); - if (x == -1) { - x = jar.lastIndexOf('\\'); - } - String basedir = jar.substring(0, x + 1); - return new File(basedir); - } else { - return new File("."); - } - } - - public static File getAbsoluteFile(File basepath, File f) { - return f.isAbsolute() ? f : new File(basepath, f.getPath()); - } - - public static String getExtension(File f) { - String name = f.getName(); - int x = name.lastIndexOf('.'); - if (x != -1) { - return name.substring(x); - } else { - return ""; - } - } - - public static void exec(String[] cmd, Log log) throws ExecException { - BufferedReader is = null; - try { - if (WINDOWS_OS) { - for (int i = 0; i < cmd.length; i++) { - cmd[i] = cmd[i].replaceAll("/", "\\\\"); - } - } - Process p = Runtime.getRuntime().exec(cmd); - is = new BufferedReader(new InputStreamReader(p.getErrorStream())); - String line; - int errLine = -1; - Pattern pattern = Pattern.compile(":\\d+:"); - while ((line = is.readLine()) != null) { - log.append(line); - Matcher matcher = pattern.matcher(line); - if (matcher.find()) { - errLine = Integer.valueOf( - line.substring(matcher.start() + 1, matcher.end() - 1)) - .intValue(); - if (line.matches("(?i).*unrecognized escape sequence")) { - log.append(Messages.getString("Util.use.double.backslash")); - } - break; - } - } - is.close(); - p.waitFor(); - if (errLine != -1) { - throw new ExecException(Messages.getString("Util.exec.failed") - + ": " + cmd, errLine); - } - if (p.exitValue() != 0) { - throw new ExecException(Messages.getString("Util.exec.failed") - + "(" + p.exitValue() + "): " + cmd); - } - } catch (IOException e) { - close(is); - throw new ExecException(e); - } catch (InterruptedException e) { - close(is); - throw new ExecException(e); - } - } - - public static void close(final InputStream o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static void close(final OutputStream o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static void close(final Reader o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static void close(final Writer o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static boolean delete(File f) { - return (f != null) ? f.delete() : false; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2005-04-24 + */ +package net.sf.launch4j; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.Reader; +import java.io.Writer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Util { + public static final boolean WINDOWS_OS = System.getProperty("os.name") + .toLowerCase().startsWith("windows"); + + private Util() {} + + public static File createTempFile(String suffix) throws IOException { + String tmpdir = System.getProperty("launch4j.tmpdir"); + if (tmpdir != null) { + if (tmpdir.indexOf(' ') != -1) { + throw new IOException(Messages.getString("Util.tmpdir")); + } + return File.createTempFile("launch4j", suffix, new File(tmpdir)); + } else { + return File.createTempFile("launch4j", suffix); + } + } + + /** + * Returns the base directory of a jar file or null if the class is a standalone file. + * @return System specific path + * + * Based on a patch submitted by Josh Elsasser + */ + public static File getJarBasedir() { + String url = Util.class.getClassLoader() + .getResource(Util.class.getName().replace('.', '/') + ".class") + .getFile() + .replaceAll("%20", " "); + if (url.startsWith("file:")) { + String jar = url.substring(5, url.lastIndexOf('!')); + int x = jar.lastIndexOf('/'); + if (x == -1) { + x = jar.lastIndexOf('\\'); + } + String basedir = jar.substring(0, x + 1); + return new File(basedir); + } else { + return new File("."); + } + } + + public static File getAbsoluteFile(File basepath, File f) { + return f.isAbsolute() ? f : new File(basepath, f.getPath()); + } + + public static String getExtension(File f) { + String name = f.getName(); + int x = name.lastIndexOf('.'); + if (x != -1) { + return name.substring(x); + } else { + return ""; + } + } + + public static void exec(String[] cmd, Log log) throws ExecException { + BufferedReader is = null; + try { + if (WINDOWS_OS) { + for (int i = 0; i < cmd.length; i++) { + cmd[i] = cmd[i].replaceAll("/", "\\\\"); + } + } + Process p = Runtime.getRuntime().exec(cmd); + is = new BufferedReader(new InputStreamReader(p.getErrorStream())); + String line; + int errLine = -1; + Pattern pattern = Pattern.compile(":\\d+:"); + while ((line = is.readLine()) != null) { + log.append(line); + Matcher matcher = pattern.matcher(line); + if (matcher.find()) { + errLine = Integer.valueOf( + line.substring(matcher.start() + 1, matcher.end() - 1)) + .intValue(); + if (line.matches("(?i).*unrecognized escape sequence")) { + log.append(Messages.getString("Util.use.double.backslash")); + } + break; + } + } + is.close(); + p.waitFor(); + if (errLine != -1) { + throw new ExecException(Messages.getString("Util.exec.failed") + + ": " + cmd, errLine); + } + if (p.exitValue() != 0) { + throw new ExecException(Messages.getString("Util.exec.failed") + + "(" + p.exitValue() + "): " + cmd); + } + } catch (IOException e) { + close(is); + throw new ExecException(e); + } catch (InterruptedException e) { + close(is); + throw new ExecException(e); + } + } + + public static void close(final InputStream o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static void close(final OutputStream o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static void close(final Reader o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static void close(final Writer o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static boolean delete(File f) { + return (f != null) ? f.delete() : false; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntClassPath.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntClassPath.java old mode 100755 new mode 100644 index a67bab91f61..ba5f7d74d38 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntClassPath.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntClassPath.java @@ -1,61 +1,61 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Jul 19, 2006 - */ -package net.sf.launch4j.ant; - -import java.util.ArrayList; -import java.util.List; - -import net.sf.launch4j.config.ClassPath; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class AntClassPath extends ClassPath { - private final List wrappedPaths = new ArrayList(); - - public void setCp(String cp){ - wrappedPaths.add(cp); - } - - public void addCp(StringWrapper cp) { - wrappedPaths.add(cp); - } - - public void unwrap() { - setPaths(StringWrapper.unwrap(wrappedPaths)); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Jul 19, 2006 + */ +package net.sf.launch4j.ant; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.launch4j.config.ClassPath; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class AntClassPath extends ClassPath { + private final List wrappedPaths = new ArrayList(); + + public void setCp(String cp){ + wrappedPaths.add(cp); + } + + public void addCp(StringWrapper cp) { + wrappedPaths.add(cp); + } + + public void unwrap() { + setPaths(StringWrapper.unwrap(wrappedPaths)); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntConfig.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntConfig.java old mode 100755 new mode 100644 index 4482436a90c..26e6c340f35 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntConfig.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntConfig.java @@ -1,129 +1,129 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 24, 2005 - */ -package net.sf.launch4j.ant; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.apache.tools.ant.BuildException; - -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.Msg; -import net.sf.launch4j.config.SingleInstance; -import net.sf.launch4j.config.Splash; -import net.sf.launch4j.config.VersionInfo; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class AntConfig extends Config { - private final List wrappedHeaderObjects = new ArrayList(); - private final List wrappedLibs = new ArrayList(); - private final List wrappedVariables = new ArrayList(); - - public void setJarPath(String path) { - setJar(new File(path)); - } - - public void addObj(StringWrapper obj) { - wrappedHeaderObjects.add(obj); - } - - public void addLib(StringWrapper lib) { - wrappedLibs.add(lib); - } - - public void addVar(StringWrapper var) { - wrappedVariables.add(var); - } - - // __________________________________________________________________________________ - - public void addSingleInstance(SingleInstance singleInstance) { - checkNull(getSingleInstance(), "singleInstance"); - setSingleInstance(singleInstance); - } - - public void addClassPath(AntClassPath classPath) { - checkNull(getClassPath(), "classPath"); - setClassPath(classPath); - } - - public void addJre(AntJre jre) { - checkNull(getJre(), "jre"); - setJre(jre); - } - - public void addSplash(Splash splash) { - checkNull(getSplash(), "splash"); - setSplash(splash); - } - - public void addVersionInfo(VersionInfo versionInfo) { - checkNull(getVersionInfo(), "versionInfo"); - setVersionInfo(versionInfo); - } - - public void addMessages(Msg messages) { - checkNull(getMessages(), "messages"); - setMessages(messages); - } - - // __________________________________________________________________________________ - - public void unwrap() { - setHeaderObjects(StringWrapper.unwrap(wrappedHeaderObjects)); - setLibs(StringWrapper.unwrap(wrappedLibs)); - setVariables(StringWrapper.unwrap(wrappedVariables)); - if (getClassPath() != null) { - ((AntClassPath) getClassPath()).unwrap(); - } - if (getJre() != null) { - ((AntJre) getJre()).unwrap(); - } - } - - private void checkNull(Object o, String name) { - if (o != null) { - throw new BuildException( - Messages.getString("AntConfig.duplicate.element") - + ": " - + name); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 24, 2005 + */ +package net.sf.launch4j.ant; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.apache.tools.ant.BuildException; + +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.Msg; +import net.sf.launch4j.config.SingleInstance; +import net.sf.launch4j.config.Splash; +import net.sf.launch4j.config.VersionInfo; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class AntConfig extends Config { + private final List wrappedHeaderObjects = new ArrayList(); + private final List wrappedLibs = new ArrayList(); + private final List wrappedVariables = new ArrayList(); + + public void setJarPath(String path) { + setJar(new File(path)); + } + + public void addObj(StringWrapper obj) { + wrappedHeaderObjects.add(obj); + } + + public void addLib(StringWrapper lib) { + wrappedLibs.add(lib); + } + + public void addVar(StringWrapper var) { + wrappedVariables.add(var); + } + + // __________________________________________________________________________________ + + public void addSingleInstance(SingleInstance singleInstance) { + checkNull(getSingleInstance(), "singleInstance"); + setSingleInstance(singleInstance); + } + + public void addClassPath(AntClassPath classPath) { + checkNull(getClassPath(), "classPath"); + setClassPath(classPath); + } + + public void addJre(AntJre jre) { + checkNull(getJre(), "jre"); + setJre(jre); + } + + public void addSplash(Splash splash) { + checkNull(getSplash(), "splash"); + setSplash(splash); + } + + public void addVersionInfo(VersionInfo versionInfo) { + checkNull(getVersionInfo(), "versionInfo"); + setVersionInfo(versionInfo); + } + + public void addMessages(Msg messages) { + checkNull(getMessages(), "messages"); + setMessages(messages); + } + + // __________________________________________________________________________________ + + public void unwrap() { + setHeaderObjects(StringWrapper.unwrap(wrappedHeaderObjects)); + setLibs(StringWrapper.unwrap(wrappedLibs)); + setVariables(StringWrapper.unwrap(wrappedVariables)); + if (getClassPath() != null) { + ((AntClassPath) getClassPath()).unwrap(); + } + if (getJre() != null) { + ((AntJre) getJre()).unwrap(); + } + } + + private void checkNull(Object o, String name) { + if (o != null) { + throw new BuildException( + Messages.getString("AntConfig.duplicate.element") + + ": " + + name); + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntJre.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntJre.java old mode 100755 new mode 100644 index b83e3ee02be..27c1bbf3175 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntJre.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/AntJre.java @@ -1,69 +1,69 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Jul 18, 2006 - */ -package net.sf.launch4j.ant; - -import java.util.ArrayList; -import java.util.List; - -import net.sf.launch4j.config.Jre; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class AntJre extends Jre { - private final List wrappedOptions = new ArrayList(); - - public void addOpt(StringWrapper opt) { - wrappedOptions.add(opt); - } - - public void unwrap() { - setOptions(StringWrapper.unwrap(wrappedOptions)); - } - - /** - * For backwards compatibility. - */ - public void setDontUsePrivateJres(boolean dontUse) { - if (dontUse) { - setJdkPreference(JDK_PREFERENCE_JRE_ONLY); - } - else { - setJdkPreference(JDK_PREFERENCE_PREFER_JRE); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Jul 18, 2006 + */ +package net.sf.launch4j.ant; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.launch4j.config.Jre; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class AntJre extends Jre { + private final List wrappedOptions = new ArrayList(); + + public void addOpt(StringWrapper opt) { + wrappedOptions.add(opt); + } + + public void unwrap() { + setOptions(StringWrapper.unwrap(wrappedOptions)); + } + + /** + * For backwards compatibility. + */ + public void setDontUsePrivateJres(boolean dontUse) { + if (dontUse) { + setJdkPreference(JDK_PREFERENCE_JRE_ONLY); + } + else { + setJdkPreference(JDK_PREFERENCE_PREFER_JRE); + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java old mode 100755 new mode 100644 index a28287698f8..65dc3fafa70 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java @@ -1,162 +1,162 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 24, 2005 - */ -package net.sf.launch4j.ant; - -import java.io.File; - -import net.sf.launch4j.Builder; -import net.sf.launch4j.BuilderException; -import net.sf.launch4j.Log; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.config.ConfigPersisterException; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Launch4jTask extends Task { - private File _configFile; - private AntConfig _config; - - // System properties - private File tmpdir; // launch4j.tmpdir - private File bindir; // launch4j.bindir - - // Override configFile settings - private File jar; - private File outfile; - private String fileVersion; - private String txtFileVersion; - private String productVersion; - private String txtProductVersion; - - public void execute() throws BuildException { - try { - if (tmpdir != null) { - System.setProperty("launch4j.tmpdir", tmpdir.getPath()); - } - if (bindir != null) { - System.setProperty("launch4j.bindir", bindir.getPath()); - } - if (_configFile != null && _config != null) { - throw new BuildException( - Messages.getString("Launch4jTask.specify.config")); - } else if (_configFile != null) { - ConfigPersister.getInstance().load(_configFile); - Config c = ConfigPersister.getInstance().getConfig(); - if (jar != null) { - c.setJar(jar); - } - if (outfile != null) { - c.setOutfile(outfile); - } - if (fileVersion != null) { - c.getVersionInfo().setFileVersion(fileVersion); - } - if (txtFileVersion != null) { - c.getVersionInfo().setTxtFileVersion(txtFileVersion); - } - if (productVersion != null) { - c.getVersionInfo().setProductVersion(productVersion); - } - if (txtProductVersion != null) { - c.getVersionInfo().setTxtProductVersion(txtProductVersion); - } - } else if (_config != null) { - _config.unwrap(); - ConfigPersister.getInstance().setAntConfig(_config, - getProject().getBaseDir()); - } else { - throw new BuildException( - Messages.getString("Launch4jTask.specify.config")); - } - final Builder b = new Builder(Log.getAntLog()); - b.build(); - } catch (ConfigPersisterException e) { - throw new BuildException(e); - } catch (BuilderException e) { - throw new BuildException(e); - } - } - - public void setConfigFile(File configFile) { - _configFile = configFile; - } - - public void addConfig(AntConfig config) { - _config = config; - } - - public void setBindir(File bindir) { - this.bindir = bindir; - } - - public void setTmpdir(File tmpdir) { - this.tmpdir = tmpdir; - } - - public void setFileVersion(String fileVersion) { - this.fileVersion = fileVersion; - } - - public void setJar(File jar) { - this.jar = jar; - } - - public void setJarPath(String path) { - this.jar = new File(path); - } - - public void setOutfile(File outfile) { - this.outfile = outfile; - } - - public void setProductVersion(String productVersion) { - this.productVersion = productVersion; - } - - public void setTxtFileVersion(String txtFileVersion) { - this.txtFileVersion = txtFileVersion; - } - - public void setTxtProductVersion(String txtProductVersion) { - this.txtProductVersion = txtProductVersion; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 24, 2005 + */ +package net.sf.launch4j.ant; + +import java.io.File; + +import net.sf.launch4j.Builder; +import net.sf.launch4j.BuilderException; +import net.sf.launch4j.Log; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.config.ConfigPersisterException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Launch4jTask extends Task { + private File _configFile; + private AntConfig _config; + + // System properties + private File tmpdir; // launch4j.tmpdir + private File bindir; // launch4j.bindir + + // Override configFile settings + private File jar; + private File outfile; + private String fileVersion; + private String txtFileVersion; + private String productVersion; + private String txtProductVersion; + + public void execute() throws BuildException { + try { + if (tmpdir != null) { + System.setProperty("launch4j.tmpdir", tmpdir.getPath()); + } + if (bindir != null) { + System.setProperty("launch4j.bindir", bindir.getPath()); + } + if (_configFile != null && _config != null) { + throw new BuildException( + Messages.getString("Launch4jTask.specify.config")); + } else if (_configFile != null) { + ConfigPersister.getInstance().load(_configFile); + Config c = ConfigPersister.getInstance().getConfig(); + if (jar != null) { + c.setJar(jar); + } + if (outfile != null) { + c.setOutfile(outfile); + } + if (fileVersion != null) { + c.getVersionInfo().setFileVersion(fileVersion); + } + if (txtFileVersion != null) { + c.getVersionInfo().setTxtFileVersion(txtFileVersion); + } + if (productVersion != null) { + c.getVersionInfo().setProductVersion(productVersion); + } + if (txtProductVersion != null) { + c.getVersionInfo().setTxtProductVersion(txtProductVersion); + } + } else if (_config != null) { + _config.unwrap(); + ConfigPersister.getInstance().setAntConfig(_config, + getProject().getBaseDir()); + } else { + throw new BuildException( + Messages.getString("Launch4jTask.specify.config")); + } + final Builder b = new Builder(Log.getAntLog()); + b.build(); + } catch (ConfigPersisterException e) { + throw new BuildException(e); + } catch (BuilderException e) { + throw new BuildException(e); + } + } + + public void setConfigFile(File configFile) { + _configFile = configFile; + } + + public void addConfig(AntConfig config) { + _config = config; + } + + public void setBindir(File bindir) { + this.bindir = bindir; + } + + public void setTmpdir(File tmpdir) { + this.tmpdir = tmpdir; + } + + public void setFileVersion(String fileVersion) { + this.fileVersion = fileVersion; + } + + public void setJar(File jar) { + this.jar = jar; + } + + public void setJarPath(String path) { + this.jar = new File(path); + } + + public void setOutfile(File outfile) { + this.outfile = outfile; + } + + public void setProductVersion(String productVersion) { + this.productVersion = productVersion; + } + + public void setTxtFileVersion(String txtFileVersion) { + this.txtFileVersion = txtFileVersion; + } + + public void setTxtProductVersion(String txtProductVersion) { + this.txtProductVersion = txtProductVersion; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Messages.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Messages.java old mode 100755 new mode 100644 index 0f823f7af7c..ec0b6d38c2a --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Messages.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/Messages.java @@ -1,55 +1,55 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j.ant; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.ant.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j.ant; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.ant.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/StringWrapper.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/StringWrapper.java old mode 100755 new mode 100644 index 6d38af1a595..48cd0c91970 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/StringWrapper.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/StringWrapper.java @@ -1,67 +1,67 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Jul 18, 2006 - */ -package net.sf.launch4j.ant; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class StringWrapper { - private String text; - - public static List unwrap(List wrappers) { - if (wrappers.isEmpty()) { - return null; - } - List strings = new ArrayList(wrappers.size()); - for (Iterator iter = wrappers.iterator(); iter.hasNext();) { - strings.add(iter.next().toString()); - } - return strings; - } - - public void addText(String text) { - this.text = text; - } - - public String toString() { - return text; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Jul 18, 2006 + */ +package net.sf.launch4j.ant; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class StringWrapper { + private String text; + + public static List unwrap(List wrappers) { + if (wrappers.isEmpty()) { + return null; + } + List strings = new ArrayList(wrappers.size()); + for (Iterator iter = wrappers.iterator(); iter.hasNext();) { + strings.add(iter.next().toString()); + } + return strings; + } + + public void addText(String text) { + this.text = text; + } + + public String toString() { + return text; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages.properties old mode 100755 new mode 100644 index 9666633c2b5..c1b802f528b --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages.properties @@ -1,35 +1,35 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -Launch4jTask.specify.config=Specify configFile or config -AntConfig.duplicate.element=Duplicate element +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +Launch4jTask.specify.config=Specify configFile or config +AntConfig.duplicate.element=Duplicate element diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages_es.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages_es.properties old mode 100755 new mode 100644 index 9211e8e034a..783874a8f0f --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages_es.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/ant/messages_es.properties @@ -1,35 +1,35 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -Launch4jTask.specify.config=Specify configFile or config -AntConfig.duplicate.element=Duplicate element +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +Launch4jTask.specify.config=Specify configFile or config +AntConfig.duplicate.element=Duplicate element diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Binding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Binding.java old mode 100755 new mode 100644 index 49c9b45ffc7..cd93384cd93 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Binding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Binding.java @@ -1,62 +1,62 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public interface Binding { - /** Used to mark components with invalid data. */ - public final static Color INVALID_COLOR = Color.PINK; - - /** Java Bean property bound to a component */ - public String getProperty(); - /** Clear component, set it to the default value */ - public void clear(IValidatable bean); - /** Java Bean property -> Component */ - public void put(IValidatable bean); - /** Component -> Java Bean property */ - public void get(IValidatable bean); - /** Mark component as valid */ - public void markValid(); - /** Mark component as invalid */ - public void markInvalid(); - /** Enable or disable the component */ - public void setEnabled(boolean enabled); -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public interface Binding { + /** Used to mark components with invalid data. */ + public final static Color INVALID_COLOR = Color.PINK; + + /** Java Bean property bound to a component */ + public String getProperty(); + /** Clear component, set it to the default value */ + public void clear(IValidatable bean); + /** Java Bean property -> Component */ + public void put(IValidatable bean); + /** Component -> Java Bean property */ + public void get(IValidatable bean); + /** Mark component as valid */ + public void markValid(); + /** Mark component as invalid */ + public void markInvalid(); + /** Enable or disable the component */ + public void setEnabled(boolean enabled); +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/BindingException.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/BindingException.java old mode 100755 new mode 100644 index 15dc10cc002..3199ab4d122 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/BindingException.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/BindingException.java @@ -1,52 +1,52 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -/** - * Signals a runtime error, a missing property in a Java Bean for example. - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class BindingException extends RuntimeException { - public BindingException(Throwable t) { - super(t); - } - - public BindingException(String msg) { - super(msg); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +/** + * Signals a runtime error, a missing property in a Java Bean for example. + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class BindingException extends RuntimeException { + public BindingException(Throwable t) { + super(t); + } + + public BindingException(String msg) { + super(msg); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Bindings.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Bindings.java old mode 100755 new mode 100644 index 73f507e4999..8fe6bdf9641 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Bindings.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Bindings.java @@ -1,317 +1,317 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JRadioButton; -import javax.swing.JTextArea; -import javax.swing.JToggleButton; -import javax.swing.text.JTextComponent; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * Creates and handles bindings. - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Bindings implements PropertyChangeListener { - private final Map _bindings = new HashMap(); - private final Map _optComponents = new HashMap(); - private boolean _modified = false; - - /** - * Used to track component modifications. - */ - public void propertyChange(PropertyChangeEvent evt) { - String prop = evt.getPropertyName(); - if ("AccessibleValue".equals(prop) - || "AccessibleText".equals(prop) - || "AccessibleVisibleData".equals(prop)) { - _modified = true; - } - } - - /** - * Any of the components modified? - */ - public boolean isModified() { - return _modified; - } - - public Binding getBinding(String property) { - return (Binding) _bindings.get(property); - } - - private void registerPropertyChangeListener(JComponent c) { - c.getAccessibleContext().addPropertyChangeListener(this); - } - - private void registerPropertyChangeListener(JComponent[] cs) { - for (int i = 0; i < cs.length; i++) { - cs[i].getAccessibleContext().addPropertyChangeListener(this); - } - } - - private boolean isPropertyNull(IValidatable bean, Binding b) { - try { - for (Iterator iter = _optComponents.keySet().iterator(); iter.hasNext();) { - String property = (String) iter.next(); - if (b.getProperty().startsWith(property)) { - return PropertyUtils.getProperty(bean, property) == null; - } - } - return false; - } catch (Exception e) { - throw new BindingException(e); - } - } - - /** - * Enables or disables all components bound to properties that begin with given prefix. - */ - public void setComponentsEnabled(String prefix, boolean enabled) { - for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { - Binding b = (Binding) iter.next(); - if (b.getProperty().startsWith(prefix)) { - b.setEnabled(enabled); - } - } - } - - /** - * Clear all components, set them to their default values. - * Clears the _modified flag. - */ - public void clear(IValidatable bean) { - for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { - ((Binding) iter.next()).clear(bean); - } - for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { - ((Binding) iter.next()).clear(bean); - } - _modified = false; - } - - /** - * Copies data from the Java Bean to the UI components. - * Clears the _modified flag. - */ - public void put(IValidatable bean) { - for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { - ((Binding) iter.next()).put(bean); - } - for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { - Binding b = (Binding) iter.next(); - if (isPropertyNull(bean, b)) { - b.clear(null); - } else { - b.put(bean); - } - } - _modified = false; - } - - /** - * Copies data from UI components to the Java Bean and checks it's class invariants. - * Clears the _modified flag. - * @throws InvariantViolationException - * @throws BindingException - */ - public void get(IValidatable bean) { - try { - for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { - ((Binding) iter.next()).get(bean); - } - for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { - Binding b = (Binding) iter.next(); - if (!isPropertyNull(bean, b)) { - b.get(bean); - } - } - bean.checkInvariants(); - for (Iterator iter = _optComponents.keySet().iterator(); iter.hasNext();) { - String property = (String) iter.next(); - IValidatable component = (IValidatable) PropertyUtils.getProperty(bean, - property); - if (component != null) { - component.checkInvariants(); - } - } - _modified = false; // XXX - } catch (InvariantViolationException e) { - e.setBinding(getBinding(e.getProperty())); - throw e; - } catch (Exception e) { - throw new BindingException(e); - } - } - - private Bindings add(Binding b) { - if (_bindings.containsKey(b.getProperty())) { - throw new BindingException(Messages.getString("Bindings.duplicate.binding")); - } - _bindings.put(b.getProperty(), b); - return this; - } - - /** - * Add an optional (nullable) Java Bean component of type clazz. - */ - public Bindings addOptComponent(String property, Class clazz, JToggleButton c, - boolean enabledByDefault) { - Binding b = new OptComponentBinding(this, property, clazz, c, enabledByDefault); - if (_optComponents.containsKey(property)) { - throw new BindingException(Messages.getString("Bindings.duplicate.binding")); - } - _optComponents.put(property, b); - return this; - } - - /** - * Add an optional (nullable) Java Bean component of type clazz. - */ - public Bindings addOptComponent(String property, Class clazz, JToggleButton c) { - return addOptComponent(property, clazz, c, false); - } - - /** - * Handles JEditorPane, JTextArea, JTextField - */ - public Bindings add(String property, JTextComponent c, String defaultValue) { - registerPropertyChangeListener(c); - return add(new JTextComponentBinding(property, c, defaultValue)); - } - - /** - * Handles JEditorPane, JTextArea, JTextField - */ - public Bindings add(String property, JTextComponent c) { - registerPropertyChangeListener(c); - return add(new JTextComponentBinding(property, c, "")); - } - - /** - * Handles JToggleButton, JCheckBox - */ - public Bindings add(String property, JToggleButton c, boolean defaultValue) { - registerPropertyChangeListener(c); - return add(new JToggleButtonBinding(property, c, defaultValue)); - } - - /** - * Handles JToggleButton, JCheckBox - */ - public Bindings add(String property, JToggleButton c) { - registerPropertyChangeListener(c); - return add(new JToggleButtonBinding(property, c, false)); - } - - /** - * Handles JRadioButton - */ - public Bindings add(String property, JRadioButton[] cs, int defaultValue) { - registerPropertyChangeListener(cs); - return add(new JRadioButtonBinding(property, cs, defaultValue)); - } - - /** - * Handles JRadioButton - */ - public Bindings add(String property, JRadioButton[] cs) { - registerPropertyChangeListener(cs); - return add(new JRadioButtonBinding(property, cs, 0)); - } - - /** - * Handles JTextArea - */ - public Bindings add(String property, JTextArea textArea, String defaultValue) { - registerPropertyChangeListener(textArea); - return add(new JTextComponentBinding(property, textArea, defaultValue)); - } - - /** - * Handles JTextArea lists - */ - public Bindings add(String property, JTextArea textArea) { - registerPropertyChangeListener(textArea); - return add(new JTextAreaBinding(property, textArea)); - } - - /** - * Handles Optional JTextArea lists - */ - public Bindings add(String property, String stateProperty, - JToggleButton button, JTextArea textArea) { - registerPropertyChangeListener(button); - registerPropertyChangeListener(textArea); - return add(new OptJTextAreaBinding(property, stateProperty, button, textArea)); - } - - /** - * Handles JList - */ - public Bindings add(String property, JList list) { - registerPropertyChangeListener(list); - return add(new JListBinding(property, list)); - } - - /** - * Handles JComboBox - */ - public Bindings add(String property, JComboBox combo, int defaultValue) { - registerPropertyChangeListener(combo); - return add(new JComboBoxBinding(property, combo, defaultValue)); - } - - /** - * Handles JComboBox - */ - public Bindings add(String property, JComboBox combo) { - registerPropertyChangeListener(combo); - return add(new JComboBoxBinding(property, combo, 0)); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JRadioButton; +import javax.swing.JTextArea; +import javax.swing.JToggleButton; +import javax.swing.text.JTextComponent; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * Creates and handles bindings. + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Bindings implements PropertyChangeListener { + private final Map _bindings = new HashMap(); + private final Map _optComponents = new HashMap(); + private boolean _modified = false; + + /** + * Used to track component modifications. + */ + public void propertyChange(PropertyChangeEvent evt) { + String prop = evt.getPropertyName(); + if ("AccessibleValue".equals(prop) + || "AccessibleText".equals(prop) + || "AccessibleVisibleData".equals(prop)) { + _modified = true; + } + } + + /** + * Any of the components modified? + */ + public boolean isModified() { + return _modified; + } + + public Binding getBinding(String property) { + return (Binding) _bindings.get(property); + } + + private void registerPropertyChangeListener(JComponent c) { + c.getAccessibleContext().addPropertyChangeListener(this); + } + + private void registerPropertyChangeListener(JComponent[] cs) { + for (int i = 0; i < cs.length; i++) { + cs[i].getAccessibleContext().addPropertyChangeListener(this); + } + } + + private boolean isPropertyNull(IValidatable bean, Binding b) { + try { + for (Iterator iter = _optComponents.keySet().iterator(); iter.hasNext();) { + String property = (String) iter.next(); + if (b.getProperty().startsWith(property)) { + return PropertyUtils.getProperty(bean, property) == null; + } + } + return false; + } catch (Exception e) { + throw new BindingException(e); + } + } + + /** + * Enables or disables all components bound to properties that begin with given prefix. + */ + public void setComponentsEnabled(String prefix, boolean enabled) { + for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { + Binding b = (Binding) iter.next(); + if (b.getProperty().startsWith(prefix)) { + b.setEnabled(enabled); + } + } + } + + /** + * Clear all components, set them to their default values. + * Clears the _modified flag. + */ + public void clear(IValidatable bean) { + for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { + ((Binding) iter.next()).clear(bean); + } + for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { + ((Binding) iter.next()).clear(bean); + } + _modified = false; + } + + /** + * Copies data from the Java Bean to the UI components. + * Clears the _modified flag. + */ + public void put(IValidatable bean) { + for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { + ((Binding) iter.next()).put(bean); + } + for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { + Binding b = (Binding) iter.next(); + if (isPropertyNull(bean, b)) { + b.clear(null); + } else { + b.put(bean); + } + } + _modified = false; + } + + /** + * Copies data from UI components to the Java Bean and checks it's class invariants. + * Clears the _modified flag. + * @throws InvariantViolationException + * @throws BindingException + */ + public void get(IValidatable bean) { + try { + for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) { + ((Binding) iter.next()).get(bean); + } + for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) { + Binding b = (Binding) iter.next(); + if (!isPropertyNull(bean, b)) { + b.get(bean); + } + } + bean.checkInvariants(); + for (Iterator iter = _optComponents.keySet().iterator(); iter.hasNext();) { + String property = (String) iter.next(); + IValidatable component = (IValidatable) PropertyUtils.getProperty(bean, + property); + if (component != null) { + component.checkInvariants(); + } + } + _modified = false; // XXX + } catch (InvariantViolationException e) { + e.setBinding(getBinding(e.getProperty())); + throw e; + } catch (Exception e) { + throw new BindingException(e); + } + } + + private Bindings add(Binding b) { + if (_bindings.containsKey(b.getProperty())) { + throw new BindingException(Messages.getString("Bindings.duplicate.binding")); + } + _bindings.put(b.getProperty(), b); + return this; + } + + /** + * Add an optional (nullable) Java Bean component of type clazz. + */ + public Bindings addOptComponent(String property, Class clazz, JToggleButton c, + boolean enabledByDefault) { + Binding b = new OptComponentBinding(this, property, clazz, c, enabledByDefault); + if (_optComponents.containsKey(property)) { + throw new BindingException(Messages.getString("Bindings.duplicate.binding")); + } + _optComponents.put(property, b); + return this; + } + + /** + * Add an optional (nullable) Java Bean component of type clazz. + */ + public Bindings addOptComponent(String property, Class clazz, JToggleButton c) { + return addOptComponent(property, clazz, c, false); + } + + /** + * Handles JEditorPane, JTextArea, JTextField + */ + public Bindings add(String property, JTextComponent c, String defaultValue) { + registerPropertyChangeListener(c); + return add(new JTextComponentBinding(property, c, defaultValue)); + } + + /** + * Handles JEditorPane, JTextArea, JTextField + */ + public Bindings add(String property, JTextComponent c) { + registerPropertyChangeListener(c); + return add(new JTextComponentBinding(property, c, "")); + } + + /** + * Handles JToggleButton, JCheckBox + */ + public Bindings add(String property, JToggleButton c, boolean defaultValue) { + registerPropertyChangeListener(c); + return add(new JToggleButtonBinding(property, c, defaultValue)); + } + + /** + * Handles JToggleButton, JCheckBox + */ + public Bindings add(String property, JToggleButton c) { + registerPropertyChangeListener(c); + return add(new JToggleButtonBinding(property, c, false)); + } + + /** + * Handles JRadioButton + */ + public Bindings add(String property, JRadioButton[] cs, int defaultValue) { + registerPropertyChangeListener(cs); + return add(new JRadioButtonBinding(property, cs, defaultValue)); + } + + /** + * Handles JRadioButton + */ + public Bindings add(String property, JRadioButton[] cs) { + registerPropertyChangeListener(cs); + return add(new JRadioButtonBinding(property, cs, 0)); + } + + /** + * Handles JTextArea + */ + public Bindings add(String property, JTextArea textArea, String defaultValue) { + registerPropertyChangeListener(textArea); + return add(new JTextComponentBinding(property, textArea, defaultValue)); + } + + /** + * Handles JTextArea lists + */ + public Bindings add(String property, JTextArea textArea) { + registerPropertyChangeListener(textArea); + return add(new JTextAreaBinding(property, textArea)); + } + + /** + * Handles Optional JTextArea lists + */ + public Bindings add(String property, String stateProperty, + JToggleButton button, JTextArea textArea) { + registerPropertyChangeListener(button); + registerPropertyChangeListener(textArea); + return add(new OptJTextAreaBinding(property, stateProperty, button, textArea)); + } + + /** + * Handles JList + */ + public Bindings add(String property, JList list) { + registerPropertyChangeListener(list); + return add(new JListBinding(property, list)); + } + + /** + * Handles JComboBox + */ + public Bindings add(String property, JComboBox combo, int defaultValue) { + registerPropertyChangeListener(combo); + return add(new JComboBoxBinding(property, combo, defaultValue)); + } + + /** + * Handles JComboBox + */ + public Bindings add(String property, JComboBox combo) { + registerPropertyChangeListener(combo); + return add(new JComboBoxBinding(property, combo, 0)); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/IValidatable.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/IValidatable.java old mode 100755 new mode 100644 index fe0dd4862c1..1851c696200 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/IValidatable.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/IValidatable.java @@ -1,44 +1,44 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2004-01-30 - */ -package net.sf.launch4j.binding; - -/** - * @author Copyright (C) 2004 Grzegorz Kowal - */ -public interface IValidatable { - public void checkInvariants(); -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2004-01-30 + */ +package net.sf.launch4j.binding; + +/** + * @author Copyright (C) 2004 Grzegorz Kowal + */ +public interface IValidatable { + public void checkInvariants(); +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java old mode 100755 new mode 100644 index 2f7f88b1d88..4196433de97 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java @@ -1,67 +1,67 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Jun 23, 2003 - */ -package net.sf.launch4j.binding; - -/** - * @author Copyright (C) 2003 Grzegorz Kowal - */ -public class InvariantViolationException extends RuntimeException { - private final String _property; - private Binding _binding; - - public InvariantViolationException(String msg) { - super(msg); - _property = null; - } - - public InvariantViolationException(String property, String msg) { - super(msg); - _property = property; - } - - public String getProperty() { - return _property; - } - - public Binding getBinding() { - return _binding; - } - - public void setBinding(Binding binding) { - _binding = binding; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Jun 23, 2003 + */ +package net.sf.launch4j.binding; + +/** + * @author Copyright (C) 2003 Grzegorz Kowal + */ +public class InvariantViolationException extends RuntimeException { + private final String _property; + private Binding _binding; + + public InvariantViolationException(String msg) { + super(msg); + _property = null; + } + + public InvariantViolationException(String property, String msg) { + super(msg); + _property = property; + } + + public String getProperty() { + return _property; + } + + public Binding getBinding() { + return _binding; + } + + public void setBinding(Binding binding) { + _binding = binding; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JComboBoxBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JComboBoxBinding.java old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JListBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JListBinding.java old mode 100755 new mode 100644 index 31dec58c180..cb83561268c --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JListBinding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JListBinding.java @@ -1,118 +1,118 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.swing.DefaultListModel; -import javax.swing.JList; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class JListBinding implements Binding { - private final String _property; - private final JList _list; - private final Color _validColor; - - public JListBinding(String property, JList list) { - if (property == null || list == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _list = list; - _validColor = _list.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _list.setModel(new DefaultListModel()); - } - - public void put(IValidatable bean) { - try { - DefaultListModel model = new DefaultListModel(); - List list = (List) PropertyUtils.getProperty(bean, _property); - if (list != null) { - for (Iterator iter = list.iterator(); iter.hasNext();) { - model.addElement(iter.next()); - } - } - _list.setModel(model); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - DefaultListModel model = (DefaultListModel) _list.getModel(); - final int size = model.getSize(); - List list = new ArrayList(size); - for (int i = 0; i < size; i++) { - list.add(model.get(i)); - } - PropertyUtils.setProperty(bean, _property, list); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _list.setBackground(_validColor); - _list.requestFocusInWindow(); - } - - public void markInvalid() { - _list.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _list.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.swing.DefaultListModel; +import javax.swing.JList; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class JListBinding implements Binding { + private final String _property; + private final JList _list; + private final Color _validColor; + + public JListBinding(String property, JList list) { + if (property == null || list == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _list = list; + _validColor = _list.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _list.setModel(new DefaultListModel()); + } + + public void put(IValidatable bean) { + try { + DefaultListModel model = new DefaultListModel(); + List list = (List) PropertyUtils.getProperty(bean, _property); + if (list != null) { + for (Iterator iter = list.iterator(); iter.hasNext();) { + model.addElement(iter.next()); + } + } + _list.setModel(model); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + DefaultListModel model = (DefaultListModel) _list.getModel(); + final int size = model.getSize(); + List list = new ArrayList(size); + for (int i = 0; i < size; i++) { + list.add(model.get(i)); + } + PropertyUtils.setProperty(bean, _property, list); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _list.setBackground(_validColor); + _list.requestFocusInWindow(); + } + + public void markInvalid() { + _list.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _list.setEnabled(enabled); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java old mode 100755 new mode 100644 index 9d922bedf7e..b54f3d52e52 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java @@ -1,146 +1,146 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 10, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -import javax.swing.JRadioButton; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class JRadioButtonBinding implements Binding { - private final String _property; - private final JRadioButton[] _buttons; - private final int _defaultValue; - private final Color _validColor; - - public JRadioButtonBinding(String property, JRadioButton[] buttons, int defaultValue) { - if (property == null || buttons == null) { - throw new NullPointerException(); - } - for (int i = 0; i < buttons.length; i++) { - if (buttons[i] == null) { - throw new NullPointerException(); - } - } - if (property.equals("") - || buttons.length == 0 - || defaultValue < 0 || defaultValue >= buttons.length) { - throw new IllegalArgumentException(); - } - _property = property; - _buttons = buttons; - _defaultValue = defaultValue; - _validColor = buttons[0].getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - select(_defaultValue); - } - - public void put(IValidatable bean) { - try { - Integer i = (Integer) PropertyUtils.getProperty(bean, _property); - if (i == null) { - throw new BindingException( - Messages.getString("JRadioButtonBinding.property.null")); - } - select(i.intValue()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - for (int i = 0; i < _buttons.length; i++) { - if (_buttons[i].isSelected()) { - PropertyUtils.setProperty(bean, _property, new Integer(i)); - return; - } - } - throw new BindingException( - Messages.getString("JRadioButtonBinding.nothing.selected")); - } catch (Exception e) { - throw new BindingException(e); - } - } - - private void select(int index) { - if (index < 0 || index >= _buttons.length) { - throw new BindingException( - Messages.getString("JRadioButtonBinding.index.out.of.bounds")); - } - _buttons[index].setSelected(true); - } - - public void markValid() { - for (int i = 0; i < _buttons.length; i++) { - if (_buttons[i].isSelected()) { - _buttons[i].setBackground(_validColor); - _buttons[i].requestFocusInWindow(); - return; - } - } - throw new BindingException( - Messages.getString("JRadioButtonBinding.nothing.selected")); - } - - public void markInvalid() { - for (int i = 0; i < _buttons.length; i++) { - if (_buttons[i].isSelected()) { - _buttons[i].setBackground(Binding.INVALID_COLOR); - return; - } - } - throw new BindingException( - Messages.getString("JRadioButtonBinding.nothing.selected")); - } - - public void setEnabled(boolean enabled) { - for (int i = 0; i < _buttons.length; i++) { - _buttons[i].setEnabled(enabled); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 10, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +import javax.swing.JRadioButton; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class JRadioButtonBinding implements Binding { + private final String _property; + private final JRadioButton[] _buttons; + private final int _defaultValue; + private final Color _validColor; + + public JRadioButtonBinding(String property, JRadioButton[] buttons, int defaultValue) { + if (property == null || buttons == null) { + throw new NullPointerException(); + } + for (int i = 0; i < buttons.length; i++) { + if (buttons[i] == null) { + throw new NullPointerException(); + } + } + if (property.equals("") + || buttons.length == 0 + || defaultValue < 0 || defaultValue >= buttons.length) { + throw new IllegalArgumentException(); + } + _property = property; + _buttons = buttons; + _defaultValue = defaultValue; + _validColor = buttons[0].getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + select(_defaultValue); + } + + public void put(IValidatable bean) { + try { + Integer i = (Integer) PropertyUtils.getProperty(bean, _property); + if (i == null) { + throw new BindingException( + Messages.getString("JRadioButtonBinding.property.null")); + } + select(i.intValue()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + for (int i = 0; i < _buttons.length; i++) { + if (_buttons[i].isSelected()) { + PropertyUtils.setProperty(bean, _property, new Integer(i)); + return; + } + } + throw new BindingException( + Messages.getString("JRadioButtonBinding.nothing.selected")); + } catch (Exception e) { + throw new BindingException(e); + } + } + + private void select(int index) { + if (index < 0 || index >= _buttons.length) { + throw new BindingException( + Messages.getString("JRadioButtonBinding.index.out.of.bounds")); + } + _buttons[index].setSelected(true); + } + + public void markValid() { + for (int i = 0; i < _buttons.length; i++) { + if (_buttons[i].isSelected()) { + _buttons[i].setBackground(_validColor); + _buttons[i].requestFocusInWindow(); + return; + } + } + throw new BindingException( + Messages.getString("JRadioButtonBinding.nothing.selected")); + } + + public void markInvalid() { + for (int i = 0; i < _buttons.length; i++) { + if (_buttons[i].isSelected()) { + _buttons[i].setBackground(Binding.INVALID_COLOR); + return; + } + } + throw new BindingException( + Messages.getString("JRadioButtonBinding.nothing.selected")); + } + + public void setEnabled(boolean enabled) { + for (int i = 0; i < _buttons.length; i++) { + _buttons[i].setEnabled(enabled); + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java old mode 100755 new mode 100644 index d4e8a2c6590..3b1ab4d8a7c --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java @@ -1,123 +1,123 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Jun 14, 2006 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JTextArea; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class JTextAreaBinding implements Binding { - private final String _property; - private final JTextArea _textArea; - private final Color _validColor; - - public JTextAreaBinding(String property, JTextArea textArea) { - if (property == null || textArea == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _textArea = textArea; - _validColor = _textArea.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - put(bean); - } - - public void put(IValidatable bean) { - try { - List list = (List) PropertyUtils.getProperty(bean, _property); - StringBuffer sb = new StringBuffer(); - if (list != null) { - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - if (i < list.size() - 1) { - sb.append("\n"); - } - } - } - _textArea.setText(sb.toString()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - String text = _textArea.getText(); - if (!text.equals("")) { - String[] items = text.split("\n"); - List list = new ArrayList(); - for (int i = 0; i < items.length; i++) { - list.add(items[i]); - } - PropertyUtils.setProperty(bean, _property, list); - } else { - PropertyUtils.setProperty(bean, _property, null); - } - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _textArea.setBackground(_validColor); - _textArea.requestFocusInWindow(); - } - - public void markInvalid() { - _textArea.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _textArea.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Jun 14, 2006 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JTextArea; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class JTextAreaBinding implements Binding { + private final String _property; + private final JTextArea _textArea; + private final Color _validColor; + + public JTextAreaBinding(String property, JTextArea textArea) { + if (property == null || textArea == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _textArea = textArea; + _validColor = _textArea.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + put(bean); + } + + public void put(IValidatable bean) { + try { + List list = (List) PropertyUtils.getProperty(bean, _property); + StringBuffer sb = new StringBuffer(); + if (list != null) { + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + if (i < list.size() - 1) { + sb.append("\n"); + } + } + } + _textArea.setText(sb.toString()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + String text = _textArea.getText(); + if (!text.equals("")) { + String[] items = text.split("\n"); + List list = new ArrayList(); + for (int i = 0; i < items.length; i++) { + list.add(items[i]); + } + PropertyUtils.setProperty(bean, _property, list); + } else { + PropertyUtils.setProperty(bean, _property, null); + } + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _textArea.setBackground(_validColor); + _textArea.requestFocusInWindow(); + } + + public void markInvalid() { + _textArea.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _textArea.setEnabled(enabled); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java old mode 100755 new mode 100644 index 6b0dd1b0b28..737c106066a --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java @@ -1,108 +1,108 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -import javax.swing.text.JTextComponent; - -import org.apache.commons.beanutils.BeanUtils; - -/** - * Handles JEditorPane, JTextArea, JTextField - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class JTextComponentBinding implements Binding { - private final String _property; - private final JTextComponent _textComponent; - private final String _defaultValue; - private final Color _validColor; - - public JTextComponentBinding(String property, JTextComponent textComponent, - String defaultValue) { - if (property == null || textComponent == null || defaultValue == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _textComponent = textComponent; - _defaultValue = defaultValue; - _validColor = _textComponent.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _textComponent.setText(_defaultValue); - } - - public void put(IValidatable bean) { - try { - String s = BeanUtils.getProperty(bean, _property); - // XXX displays zeros as blank - _textComponent.setText(s != null && !s.equals("0") ? s : ""); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - BeanUtils.setProperty(bean, _property, _textComponent.getText()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _textComponent.setBackground(_validColor); - _textComponent.requestFocusInWindow(); - } - - public void markInvalid() { - _textComponent.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _textComponent.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +import javax.swing.text.JTextComponent; + +import org.apache.commons.beanutils.BeanUtils; + +/** + * Handles JEditorPane, JTextArea, JTextField + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class JTextComponentBinding implements Binding { + private final String _property; + private final JTextComponent _textComponent; + private final String _defaultValue; + private final Color _validColor; + + public JTextComponentBinding(String property, JTextComponent textComponent, + String defaultValue) { + if (property == null || textComponent == null || defaultValue == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _textComponent = textComponent; + _defaultValue = defaultValue; + _validColor = _textComponent.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _textComponent.setText(_defaultValue); + } + + public void put(IValidatable bean) { + try { + String s = BeanUtils.getProperty(bean, _property); + // XXX displays zeros as blank + _textComponent.setText(s != null && !s.equals("0") ? s : ""); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + BeanUtils.setProperty(bean, _property, _textComponent.getText()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _textComponent.setBackground(_validColor); + _textComponent.requestFocusInWindow(); + } + + public void markInvalid() { + _textComponent.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _textComponent.setEnabled(enabled); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java old mode 100755 new mode 100644 index a7055cccc5e..69271eaea4f --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java @@ -1,108 +1,108 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -import javax.swing.JToggleButton; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * Handles JToggleButton, JCheckBox - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class JToggleButtonBinding implements Binding { - private final String _property; - private final JToggleButton _button; - private final boolean _defaultValue; - private final Color _validColor; - - public JToggleButtonBinding(String property, JToggleButton button, - boolean defaultValue) { - if (property == null || button == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _button = button; - _defaultValue = defaultValue; - _validColor = _button.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _button.setSelected(_defaultValue); - } - - public void put(IValidatable bean) { - try { - Boolean b = (Boolean) PropertyUtils.getProperty(bean, _property); - _button.setSelected(b != null && b.booleanValue()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - PropertyUtils.setProperty(bean, _property, - Boolean.valueOf(_button.isSelected())); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _button.setBackground(_validColor); - _button.requestFocusInWindow(); - } - - public void markInvalid() { - _button.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _button.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +import javax.swing.JToggleButton; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * Handles JToggleButton, JCheckBox + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class JToggleButtonBinding implements Binding { + private final String _property; + private final JToggleButton _button; + private final boolean _defaultValue; + private final Color _validColor; + + public JToggleButtonBinding(String property, JToggleButton button, + boolean defaultValue) { + if (property == null || button == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _button = button; + _defaultValue = defaultValue; + _validColor = _button.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _button.setSelected(_defaultValue); + } + + public void put(IValidatable bean) { + try { + Boolean b = (Boolean) PropertyUtils.getProperty(bean, _property); + _button.setSelected(b != null && b.booleanValue()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + PropertyUtils.setProperty(bean, _property, + Boolean.valueOf(_button.isSelected())); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _button.setBackground(_validColor); + _button.requestFocusInWindow(); + } + + public void markInvalid() { + _button.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _button.setEnabled(enabled); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Messages.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Messages.java old mode 100755 new mode 100644 index 91ddff2b13c..ca4332cacb1 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Messages.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Messages.java @@ -1,78 +1,78 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j.binding; - -import java.text.MessageFormat; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.binding.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - private static final MessageFormat FORMATTER = new MessageFormat(""); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } - - public static String getString(String key, String arg0) { - return getString(key, new Object[] {arg0}); - } - - public static String getString(String key, String arg0, String arg1) { - return getString(key, new Object[] {arg0, arg1}); - } - - public static String getString(String key, String arg0, String arg1, String arg2) { - return getString(key, new Object[] {arg0, arg1, arg2}); - } - - public static String getString(String key, Object[] args) { - try { - FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); - return FORMATTER.format(args); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j.binding; + +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.binding.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + private static final MessageFormat FORMATTER = new MessageFormat(""); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static String getString(String key, String arg0) { + return getString(key, new Object[] {arg0}); + } + + public static String getString(String key, String arg0, String arg1) { + return getString(key, new Object[] {arg0, arg1}); + } + + public static String getString(String key, String arg0, String arg1, String arg2) { + return getString(key, new Object[] {arg0, arg1, arg2}); + } + + public static String getString(String key, Object[] args) { + try { + FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); + return FORMATTER.format(args); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java old mode 100755 new mode 100644 index b573da6282a..05a43caa6e1 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java @@ -1,119 +1,119 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 11, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Arrays; - -import javax.swing.JToggleButton; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class OptComponentBinding implements Binding, ActionListener { - private final Bindings _bindings; - private final String _property; - private final Class _clazz; - private final JToggleButton _button; - private final boolean _enabledByDefault; - - public OptComponentBinding(Bindings bindings, String property, Class clazz, - JToggleButton button, boolean enabledByDefault) { - if (property == null || clazz == null || button == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - if (!Arrays.asList(clazz.getInterfaces()).contains(IValidatable.class)) { - throw new IllegalArgumentException( - Messages.getString("OptComponentBinding.must.implement") - + IValidatable.class); - } - _bindings = bindings; - _property = property; - _clazz = clazz; - _button = button; - _button.addActionListener(this); - _enabledByDefault = enabledByDefault; - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _button.setSelected(_enabledByDefault); - updateComponents(); - } - - public void put(IValidatable bean) { - try { - Object component = PropertyUtils.getProperty(bean, _property); - _button.setSelected(component != null); - updateComponents(); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - PropertyUtils.setProperty(bean, _property, _button.isSelected() - ? _clazz.newInstance() : null); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() {} - - public void markInvalid() {} - - public void setEnabled(boolean enabled) {} // XXX implement? - - public void actionPerformed(ActionEvent e) { - updateComponents(); - } - - private void updateComponents() { - _bindings.setComponentsEnabled(_property, _button.isSelected()); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 11, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; + +import javax.swing.JToggleButton; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class OptComponentBinding implements Binding, ActionListener { + private final Bindings _bindings; + private final String _property; + private final Class _clazz; + private final JToggleButton _button; + private final boolean _enabledByDefault; + + public OptComponentBinding(Bindings bindings, String property, Class clazz, + JToggleButton button, boolean enabledByDefault) { + if (property == null || clazz == null || button == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + if (!Arrays.asList(clazz.getInterfaces()).contains(IValidatable.class)) { + throw new IllegalArgumentException( + Messages.getString("OptComponentBinding.must.implement") + + IValidatable.class); + } + _bindings = bindings; + _property = property; + _clazz = clazz; + _button = button; + _button.addActionListener(this); + _enabledByDefault = enabledByDefault; + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _button.setSelected(_enabledByDefault); + updateComponents(); + } + + public void put(IValidatable bean) { + try { + Object component = PropertyUtils.getProperty(bean, _property); + _button.setSelected(component != null); + updateComponents(); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + PropertyUtils.setProperty(bean, _property, _button.isSelected() + ? _clazz.newInstance() : null); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() {} + + public void markInvalid() {} + + public void setEnabled(boolean enabled) {} // XXX implement? + + public void actionPerformed(ActionEvent e) { + updateComponents(); + } + + private void updateComponents() { + _bindings.setComponentsEnabled(_property, _button.isSelected()); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java old mode 100755 new mode 100644 index 3cea776d7b1..1cc71d00027 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java @@ -1,141 +1,141 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Sep 3, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JTextArea; -import javax.swing.JToggleButton; - -import org.apache.commons.beanutils.BeanUtils; -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class OptJTextAreaBinding implements Binding, ActionListener { - private final String _property; - private final String _stateProperty; - private final JToggleButton _button; - private final JTextArea _textArea; - private final Color _validColor; - - public OptJTextAreaBinding(String property, String stateProperty, - JToggleButton button, JTextArea textArea) { - if (property == null || button == null || textArea == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _stateProperty = stateProperty; - _button = button; - _textArea = textArea; - _validColor = _textArea.getBackground(); - button.addActionListener(this); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - put(bean); - } - - public void put(IValidatable bean) { - try { - boolean selected = "true".equals(BeanUtils.getProperty(bean, - _stateProperty)); - _button.setSelected(selected); - _textArea.setEnabled(selected); - List list = (List) PropertyUtils.getProperty(bean, _property); - StringBuffer sb = new StringBuffer(); - if (list != null) { - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - if (i < list.size() - 1) { - sb.append("\n"); - } - } - } - _textArea.setText(sb.toString()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - String text = _textArea.getText(); - if (_button.isSelected() && !text.equals("")) { - String[] items = text.split("\n"); - List list = new ArrayList(); - for (int i = 0; i < items.length; i++) { - list.add(items[i]); - } - PropertyUtils.setProperty(bean, _property, list); - } else { - PropertyUtils.setProperty(bean, _property, null); - } - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _textArea.setBackground(_validColor); - _textArea.requestFocusInWindow(); - } - - public void markInvalid() { - _textArea.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _textArea.setEnabled(enabled); - } - - public void actionPerformed(ActionEvent e) { - _textArea.setEnabled(_button.isSelected()); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Sep 3, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JTextArea; +import javax.swing.JToggleButton; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class OptJTextAreaBinding implements Binding, ActionListener { + private final String _property; + private final String _stateProperty; + private final JToggleButton _button; + private final JTextArea _textArea; + private final Color _validColor; + + public OptJTextAreaBinding(String property, String stateProperty, + JToggleButton button, JTextArea textArea) { + if (property == null || button == null || textArea == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _stateProperty = stateProperty; + _button = button; + _textArea = textArea; + _validColor = _textArea.getBackground(); + button.addActionListener(this); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + put(bean); + } + + public void put(IValidatable bean) { + try { + boolean selected = "true".equals(BeanUtils.getProperty(bean, + _stateProperty)); + _button.setSelected(selected); + _textArea.setEnabled(selected); + List list = (List) PropertyUtils.getProperty(bean, _property); + StringBuffer sb = new StringBuffer(); + if (list != null) { + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + if (i < list.size() - 1) { + sb.append("\n"); + } + } + } + _textArea.setText(sb.toString()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + String text = _textArea.getText(); + if (_button.isSelected() && !text.equals("")) { + String[] items = text.split("\n"); + List list = new ArrayList(); + for (int i = 0; i < items.length; i++) { + list.add(items[i]); + } + PropertyUtils.setProperty(bean, _property, list); + } else { + PropertyUtils.setProperty(bean, _property, null); + } + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _textArea.setBackground(_validColor); + _textArea.requestFocusInWindow(); + } + + public void markInvalid() { + _textArea.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _textArea.setEnabled(enabled); + } + + public void actionPerformed(ActionEvent e) { + _textArea.setEnabled(_button.isSelected()); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Validator.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Validator.java old mode 100755 new mode 100644 index 88ea67c3396..0a835f364fc --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Validator.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/Validator.java @@ -1,259 +1,259 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2004-01-30 - */ -package net.sf.launch4j.binding; - -import java.io.File; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; - -import net.sf.launch4j.Util; -import net.sf.launch4j.config.ConfigPersister; - -/** - * @author Copyright (C) 2004 Grzegorz Kowal - */ -public class Validator { - public static final String ALPHANUMERIC_PATTERN = "[\\w]*?"; - public static final String ALPHA_PATTERN = "[\\w&&\\D]*?"; - public static final String NUMERIC_PATTERN = "[\\d]*?"; - public static final String PATH_PATTERN = "[\\w|[ .,:\\-/\\\\]]*?"; - - public static final int MAX_STR = 128; - public static final int MAX_PATH = 260; - public static final int MAX_BIG_STR = 8192; // or 16384; - public static final int MAX_ARGS = 32767 - 2048; - - private Validator() {} - - public static boolean isEmpty(String s) { - return s == null || s.equals(""); - } - - public static void checkNotNull(Object o, String property, String name) { - if (o == null) { - signalViolation(property, - Messages.getString("Validator.empty.field", name)); - } - } - - public static void checkString(String s, int maxLength, String property, - String name) { - if (s == null || s.length() == 0) { - signalViolation(property, - Messages.getString("Validator.empty.field", name)); - } - if (s.length() > maxLength) { - signalLengthViolation(property, name, maxLength); - } - } - - public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, - String property, String name) { - if (strings == null) { - return; - } - int totalLength = 0; - for (Iterator iter = strings.iterator(); iter.hasNext();) { - String s = (String) iter.next(); - checkString(s, maxLength, property, name); - totalLength += s.length(); - if (totalLength > totalMaxLength) { - signalLengthViolation(property, name, totalMaxLength); - } - } - } - - public static void checkString(String s, int maxLength, String pattern, - String property, String name) { - checkString(s, maxLength, property, name); - if (!s.matches(pattern)) { - signalViolation(property, - Messages.getString("Validator.invalid.data", name)); - } - } - - public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, - String pattern, String property, String name, String msg) { - if (strings == null) { - return; - } - int totalLength = 0; - for (Iterator iter = strings.iterator(); iter.hasNext();) { - String s = (String) iter.next(); - checkString(s, maxLength, property, name); - if (!s.matches(pattern)) { - signalViolation(property, msg != null - ? msg - : Messages.getString("Validator.invalid.data", name)); - } - totalLength += s.length(); - if (totalLength > totalMaxLength) { - signalLengthViolation(property, name, totalMaxLength); - } - } - } - - public static void checkOptString(String s, int maxLength, String property, - String name) { - if (s == null || s.length() == 0) { - return; - } - if (s.length() > maxLength) { - signalLengthViolation(property, name, maxLength); - } - } - - public static void checkOptString(String s, int maxLength, String pattern, - String property, String name) { - if (s == null || s.length() == 0) { - return; - } - if (s.length() > maxLength) { - signalLengthViolation(property, name, maxLength); - } - if (!s.matches(pattern)) { - signalViolation(property, - Messages.getString("Validator.invalid.data", name)); - } - } - - public static void checkRange(int value, int min, int max, - String property, String name) { - if (value < min || value > max) { - signalViolation(property, - Messages.getString("Validator.must.be.in.range", name, - String.valueOf(min), String.valueOf(max))); - } - } - - public static void checkRange(char value, char min, char max, - String property, String name) { - if (value < min || value > max) { - signalViolation(property, Messages.getString("Validator.must.be.in.range", - name, String.valueOf(min), String.valueOf(max))); - } - } - - public static void checkMin(int value, int min, String property, String name) { - if (value < min) { - signalViolation(property, - Messages.getString("Validator.must.be.at.least", name, - String.valueOf(min))); - } - } - - public static void checkIn(String s, String[] strings, String property, - String name) { - if (isEmpty(s)) { - signalViolation(property, - Messages.getString("Validator.empty.field", name)); - } - List list = Arrays.asList(strings); - if (!list.contains(s)) { - signalViolation(property, - Messages.getString("Validator.invalid.option", name, list.toString())); - } - } - - public static void checkTrue(boolean condition, String property, String msg) { - if (!condition) { - signalViolation(property, msg); - } - } - - public static void checkFalse(boolean condition, String property, String msg) { - if (condition) { - signalViolation(property, msg); - } - } - - public static void checkElementsNotNullUnique(Collection c, String property, - String msg) { - if (c.contains(null) - || new HashSet(c).size() != c.size()) { - signalViolation(property, - Messages.getString("Validator.already.exists", msg)); - } - } - - public static void checkElementsUnique(Collection c, String property, String msg) { - if (new HashSet(c).size() != c.size()) { - signalViolation(property, - Messages.getString("Validator.already.exists", msg)); - } - } - - public static void checkFile(File f, String property, String fileDescription) { - File cfgPath = ConfigPersister.getInstance().getConfigPath(); - if (f == null - || f.getPath().equals("") - || (!f.exists() && !Util.getAbsoluteFile(cfgPath, f).exists())) { - signalViolation(property, - Messages.getString("Validator.doesnt.exist", fileDescription)); - } - } - - public static void checkOptFile(File f, String property, String fileDescription) { - if (f != null && f.getPath().length() > 0) { - checkFile(f, property, fileDescription); - } - } - - public static void checkRelativeWinPath(String path, String property, String msg) { - if (path == null - || path.equals("") - || path.startsWith("/") - || path.startsWith("\\") - || path.indexOf(':') != -1) { - signalViolation(property, msg); - } - } - - public static void signalLengthViolation(String property, String name, - int maxLength) { - signalViolation(property, - Messages.getString("Validator.exceeds.max.length", name, - String.valueOf(maxLength))); - } - - public static void signalViolation(String property, String msg) { - throw new InvariantViolationException(property, msg); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2004-01-30 + */ +package net.sf.launch4j.binding; + +import java.io.File; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; + +import net.sf.launch4j.Util; +import net.sf.launch4j.config.ConfigPersister; + +/** + * @author Copyright (C) 2004 Grzegorz Kowal + */ +public class Validator { + public static final String ALPHANUMERIC_PATTERN = "[\\w]*?"; + public static final String ALPHA_PATTERN = "[\\w&&\\D]*?"; + public static final String NUMERIC_PATTERN = "[\\d]*?"; + public static final String PATH_PATTERN = "[\\w|[ .,:\\-/\\\\]]*?"; + + public static final int MAX_STR = 128; + public static final int MAX_PATH = 260; + public static final int MAX_BIG_STR = 8192; // or 16384; + public static final int MAX_ARGS = 32767 - 2048; + + private Validator() {} + + public static boolean isEmpty(String s) { + return s == null || s.equals(""); + } + + public static void checkNotNull(Object o, String property, String name) { + if (o == null) { + signalViolation(property, + Messages.getString("Validator.empty.field", name)); + } + } + + public static void checkString(String s, int maxLength, String property, + String name) { + if (s == null || s.length() == 0) { + signalViolation(property, + Messages.getString("Validator.empty.field", name)); + } + if (s.length() > maxLength) { + signalLengthViolation(property, name, maxLength); + } + } + + public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, + String property, String name) { + if (strings == null) { + return; + } + int totalLength = 0; + for (Iterator iter = strings.iterator(); iter.hasNext();) { + String s = (String) iter.next(); + checkString(s, maxLength, property, name); + totalLength += s.length(); + if (totalLength > totalMaxLength) { + signalLengthViolation(property, name, totalMaxLength); + } + } + } + + public static void checkString(String s, int maxLength, String pattern, + String property, String name) { + checkString(s, maxLength, property, name); + if (!s.matches(pattern)) { + signalViolation(property, + Messages.getString("Validator.invalid.data", name)); + } + } + + public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, + String pattern, String property, String name, String msg) { + if (strings == null) { + return; + } + int totalLength = 0; + for (Iterator iter = strings.iterator(); iter.hasNext();) { + String s = (String) iter.next(); + checkString(s, maxLength, property, name); + if (!s.matches(pattern)) { + signalViolation(property, msg != null + ? msg + : Messages.getString("Validator.invalid.data", name)); + } + totalLength += s.length(); + if (totalLength > totalMaxLength) { + signalLengthViolation(property, name, totalMaxLength); + } + } + } + + public static void checkOptString(String s, int maxLength, String property, + String name) { + if (s == null || s.length() == 0) { + return; + } + if (s.length() > maxLength) { + signalLengthViolation(property, name, maxLength); + } + } + + public static void checkOptString(String s, int maxLength, String pattern, + String property, String name) { + if (s == null || s.length() == 0) { + return; + } + if (s.length() > maxLength) { + signalLengthViolation(property, name, maxLength); + } + if (!s.matches(pattern)) { + signalViolation(property, + Messages.getString("Validator.invalid.data", name)); + } + } + + public static void checkRange(int value, int min, int max, + String property, String name) { + if (value < min || value > max) { + signalViolation(property, + Messages.getString("Validator.must.be.in.range", name, + String.valueOf(min), String.valueOf(max))); + } + } + + public static void checkRange(char value, char min, char max, + String property, String name) { + if (value < min || value > max) { + signalViolation(property, Messages.getString("Validator.must.be.in.range", + name, String.valueOf(min), String.valueOf(max))); + } + } + + public static void checkMin(int value, int min, String property, String name) { + if (value < min) { + signalViolation(property, + Messages.getString("Validator.must.be.at.least", name, + String.valueOf(min))); + } + } + + public static void checkIn(String s, String[] strings, String property, + String name) { + if (isEmpty(s)) { + signalViolation(property, + Messages.getString("Validator.empty.field", name)); + } + List list = Arrays.asList(strings); + if (!list.contains(s)) { + signalViolation(property, + Messages.getString("Validator.invalid.option", name, list.toString())); + } + } + + public static void checkTrue(boolean condition, String property, String msg) { + if (!condition) { + signalViolation(property, msg); + } + } + + public static void checkFalse(boolean condition, String property, String msg) { + if (condition) { + signalViolation(property, msg); + } + } + + public static void checkElementsNotNullUnique(Collection c, String property, + String msg) { + if (c.contains(null) + || new HashSet(c).size() != c.size()) { + signalViolation(property, + Messages.getString("Validator.already.exists", msg)); + } + } + + public static void checkElementsUnique(Collection c, String property, String msg) { + if (new HashSet(c).size() != c.size()) { + signalViolation(property, + Messages.getString("Validator.already.exists", msg)); + } + } + + public static void checkFile(File f, String property, String fileDescription) { + File cfgPath = ConfigPersister.getInstance().getConfigPath(); + if (f == null + || f.getPath().equals("") + || (!f.exists() && !Util.getAbsoluteFile(cfgPath, f).exists())) { + signalViolation(property, + Messages.getString("Validator.doesnt.exist", fileDescription)); + } + } + + public static void checkOptFile(File f, String property, String fileDescription) { + if (f != null && f.getPath().length() > 0) { + checkFile(f, property, fileDescription); + } + } + + public static void checkRelativeWinPath(String path, String property, String msg) { + if (path == null + || path.equals("") + || path.startsWith("/") + || path.startsWith("\\") + || path.indexOf(':') != -1) { + signalViolation(property, msg); + } + } + + public static void signalLengthViolation(String property, String name, + int maxLength) { + signalViolation(property, + Messages.getString("Validator.exceeds.max.length", name, + String.valueOf(maxLength))); + } + + public static void signalViolation(String property, String msg) { + throw new InvariantViolationException(property, msg); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages.properties old mode 100755 new mode 100644 index adb5a8886b7..325bb3bee4d --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages.properties @@ -1,52 +1,52 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -OptComponentBinding.must.implement=Optional component must implement - -Validator.empty.field=Enter: {0} -Validator.invalid.data=Invalid data: {0} -Validator.must.be.in.range={0} must be in range [{1}-{2}] -Validator.must.be.at.least={0} must be at least -Validator.already.exists={0} already exists. -Validator.doesnt.exist={0} doesn''t exist. -Validator.exceeds.max.length={0} exceeds the maximum length of {1} characters. -Validator.invalid.option={0} must be one of [{1}] - -Bindings.duplicate.binding=Duplicate binding - -JRadioButtonBinding.property.null=Property is null -JRadioButtonBinding.nothing.selected=Nothing selected -JRadioButtonBinding.index.out.of.bounds=Button index out of bounds - -JComboBoxBinding.property.null=Property is null -JComboBoxBinding.index.out.of.bounds=Combo box index out of bounds +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +OptComponentBinding.must.implement=Optional component must implement + +Validator.empty.field=Enter: {0} +Validator.invalid.data=Invalid data: {0} +Validator.must.be.in.range={0} must be in range [{1}-{2}] +Validator.must.be.at.least={0} must be at least +Validator.already.exists={0} already exists. +Validator.doesnt.exist={0} doesn''t exist. +Validator.exceeds.max.length={0} exceeds the maximum length of {1} characters. +Validator.invalid.option={0} must be one of [{1}] + +Bindings.duplicate.binding=Duplicate binding + +JRadioButtonBinding.property.null=Property is null +JRadioButtonBinding.nothing.selected=Nothing selected +JRadioButtonBinding.index.out.of.bounds=Button index out of bounds + +JComboBoxBinding.property.null=Property is null +JComboBoxBinding.index.out.of.bounds=Combo box index out of bounds diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages_es.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages_es.properties old mode 100755 new mode 100644 index e2e50fcb46d..f0c2b323377 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages_es.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/binding/messages_es.properties @@ -1,51 +1,51 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -OptComponentBinding.must.implement=El componente opcional debe ser implementado - -Validator.empty.field=Introduzca: {0} -Validator.invalid.data=Dato no v�lido: {0} -Validator.must.be.in.range={0} debe estar en el rango [{1}-{2}] -Validator.must.be.at.least={0} deb ser al menos -Validator.already.exists={0} ya existe. -Validator.doesnt.exist={0} no existe. -Validator.exceeds.max.length={0} excede la longitud m�xima de {1} caracteres. -Validator.invalid.option={0} must be one of [{1}] - -Bindings.duplicate.binding=Binding duplicado - -JRadioButtonBinding.property.null=La propiedad es nula -JRadioButtonBinding.nothing.selected=Nada seleccionado -JRadioButtonBinding.index.out.of.bounds=�ndice de bot�n fuera de l�mite -JComboBoxBinding.property.null=Property is null -JComboBoxBinding.index.out.of.bounds=Combo box index out of bounds +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +OptComponentBinding.must.implement=El componente opcional debe ser implementado + +Validator.empty.field=Introduzca: {0} +Validator.invalid.data=Dato no v�lido: {0} +Validator.must.be.in.range={0} debe estar en el rango [{1}-{2}] +Validator.must.be.at.least={0} deb ser al menos +Validator.already.exists={0} ya existe. +Validator.doesnt.exist={0} no existe. +Validator.exceeds.max.length={0} excede la longitud m�xima de {1} caracteres. +Validator.invalid.option={0} must be one of [{1}] + +Bindings.duplicate.binding=Binding duplicado + +JRadioButtonBinding.property.null=La propiedad es nula +JRadioButtonBinding.nothing.selected=Nada seleccionado +JRadioButtonBinding.index.out.of.bounds=�ndice de bot�n fuera de l�mite +JComboBoxBinding.property.null=Property is null +JComboBoxBinding.index.out.of.bounds=Combo box index out of bounds diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ClassPath.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ClassPath.java old mode 100755 new mode 100644 index da7dbd6c453..19bdaeef530 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ClassPath.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ClassPath.java @@ -1,87 +1,87 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.config; - -import java.util.List; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class ClassPath implements IValidatable { - private String mainClass; - private List paths; - - public void checkInvariants() { - Validator.checkString(mainClass, Validator.MAX_PATH, "mainClass", - Messages.getString("ClassPath.mainClass")); - Validator.checkOptStrings(paths, - Validator.MAX_PATH, - Validator.MAX_BIG_STR, - "paths", - Messages.getString("ClassPath.path")); - } - - public String getMainClass() { - return mainClass; - } - - public void setMainClass(String mainClass) { - this.mainClass = mainClass; - } - - public List getPaths() { - return paths; - } - - public void setPaths(List paths) { - this.paths = paths; - } - - public String getPathsString() { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < paths.size(); i++) { - sb.append(paths.get(i)); - if (i < paths.size() - 1) { - sb.append(';'); - } - } - return sb.toString(); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.config; + +import java.util.List; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class ClassPath implements IValidatable { + private String mainClass; + private List paths; + + public void checkInvariants() { + Validator.checkString(mainClass, Validator.MAX_PATH, "mainClass", + Messages.getString("ClassPath.mainClass")); + Validator.checkOptStrings(paths, + Validator.MAX_PATH, + Validator.MAX_BIG_STR, + "paths", + Messages.getString("ClassPath.path")); + } + + public String getMainClass() { + return mainClass; + } + + public void setMainClass(String mainClass) { + this.mainClass = mainClass; + } + + public List getPaths() { + return paths; + } + + public void setPaths(List paths) { + this.paths = paths; + } + + public String getPathsString() { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < paths.size(); i++) { + sb.append(paths.get(i)); + if (i < paths.size() - 1) { + sb.append(';'); + } + } + return sb.toString(); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Config.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Config.java old mode 100755 new mode 100644 index 27633bfb4cf..c16d3e5ff6e --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Config.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Config.java @@ -1,396 +1,396 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j.config; - -import java.io.File; -import java.util.Arrays; -import java.util.List; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Config implements IValidatable { - - // 1.x config properties_____________________________________________________________ - public static final String HEADER = "header"; - public static final String JAR = "jar"; - public static final String OUTFILE = "outfile"; - public static final String ERR_TITLE = "errTitle"; - public static final String JAR_ARGS = "jarArgs"; - public static final String CHDIR = "chdir"; - public static final String CUSTOM_PROC_NAME = "customProcName"; - public static final String STAY_ALIVE = "stayAlive"; - public static final String ICON = "icon"; - - // __________________________________________________________________________________ - public static final String DOWNLOAD_URL = "http://java.com/download"; - - public static final String GUI_HEADER = "gui"; - public static final String CONSOLE_HEADER = "console"; - - private static final String[] HEADER_TYPES = new String[] { GUI_HEADER, - CONSOLE_HEADER }; - - private static final String[] PRIORITY_CLASS_NAMES = new String[] { "normal", - "idle", - "high" }; - - private static final int[] PRIORITY_CLASSES = new int[] { 0x00000020, - 0x00000040, - 0x00000080 }; - - private boolean dontWrapJar; - private String headerType = GUI_HEADER; - private List headerObjects; - private List libs; - private File jar; - private File outfile; - - // Runtime header configuration - private String errTitle; - private String cmdLine; - private String chdir; - private String priority; - private String downloadUrl; - private String supportUrl; - private boolean customProcName; - private boolean stayAlive; - private File manifest; - private File icon; - private List variables; - private SingleInstance singleInstance; - private ClassPath classPath; - private Jre jre; - private Splash splash; - private VersionInfo versionInfo; - private Msg messages; - - public void checkInvariants() { - Validator.checkTrue(outfile != null && outfile.getPath().endsWith(".exe"), - "outfile", Messages.getString("Config.specify.output.exe")); - if (dontWrapJar) { - if (jar != null && !jar.getPath().equals("")) { - Validator.checkRelativeWinPath(jar.getPath(), "jar", - Messages.getString("Config.application.jar.path")); - } else { - Validator.checkTrue(classPath != null, "classPath", - Messages.getString("ClassPath.or.jar")); - } - } else { - Validator.checkFile(jar, "jar", - Messages.getString("Config.application.jar")); - } - if (!Validator.isEmpty(chdir)) { - Validator.checkRelativeWinPath(chdir, "chdir", - Messages.getString("Config.chdir.relative")); - Validator.checkFalse(chdir.toLowerCase().equals("true") - || chdir.toLowerCase().equals("false"), - "chdir", Messages.getString("Config.chdir.path")); - } - Validator.checkOptFile(manifest, "manifest", Messages.getString("Config.manifest")); - Validator.checkOptFile(icon, "icon", Messages.getString("Config.icon")); - Validator.checkOptString(cmdLine, Validator.MAX_BIG_STR, "jarArgs", - Messages.getString("Config.jar.arguments")); - Validator.checkOptString(errTitle, Validator.MAX_STR, "errTitle", - Messages.getString("Config.error.title")); - Validator.checkOptString(downloadUrl, 256, - "downloadUrl", Messages.getString("Config.download.url")); - Validator.checkOptString(supportUrl, 256, - "supportUrl", Messages.getString("Config.support.url")); - Validator.checkIn(getHeaderType(), HEADER_TYPES, "headerType", - Messages.getString("Config.header.type")); - Validator.checkFalse(getHeaderType().equals(CONSOLE_HEADER) && splash != null, - "headerType", - Messages.getString("Config.splash.not.impl.by.console.hdr")); - Validator.checkOptStrings(variables, - Validator.MAX_ARGS, - Validator.MAX_ARGS, - "[^=%\t]+=[^=\t]+", - "variables", - Messages.getString("Config.variables"), - Messages.getString("Config.variables.err")); - Validator.checkIn(getPriority(), PRIORITY_CLASS_NAMES, "priority", - Messages.getString("Config.priority")); - jre.checkInvariants(); - } - - public void validate() { - checkInvariants(); - if (classPath != null) { - classPath.checkInvariants(); - } - if (splash != null) { - splash.checkInvariants(); - } - if (versionInfo != null) { - versionInfo.checkInvariants(); - } - } - - /** Change current directory to EXE location. */ - public String getChdir() { - return chdir; - } - - public void setChdir(String chdir) { - this.chdir = chdir; - } - - /** Constant command line arguments passed to the application. */ - public String getCmdLine() { - return cmdLine; - } - - public void setCmdLine(String cmdLine) { - this.cmdLine = cmdLine; - } - - /** Optional, error message box title. */ - public String getErrTitle() { - return errTitle; - } - - public void setErrTitle(String errTitle) { - this.errTitle = errTitle; - } - - /** launch4j header file. */ - public String getHeaderType() { - return headerType.toLowerCase(); - } - - public void setHeaderType(String headerType) { - this.headerType = headerType; - } - - /** launch4j header file index - used by GUI. */ - public int getHeaderTypeIndex() { - int x = Arrays.asList(HEADER_TYPES).indexOf(getHeaderType()); - return x != -1 ? x : 0; - } - - public void setHeaderTypeIndex(int headerTypeIndex) { - headerType = HEADER_TYPES[headerTypeIndex]; - } - - public boolean isCustomHeaderObjects() { - return headerObjects != null && !headerObjects.isEmpty(); - } - - public List getHeaderObjects() { - return isCustomHeaderObjects() ? headerObjects - : getHeaderType().equals(GUI_HEADER) - ? LdDefaults.GUI_HEADER_OBJECTS - : LdDefaults.CONSOLE_HEADER_OBJECTS; - } - - public void setHeaderObjects(List headerObjects) { - this.headerObjects = headerObjects; - } - - public boolean isCustomLibs() { - return libs != null && !libs.isEmpty(); - } - - public List getLibs() { - return isCustomLibs() ? libs : LdDefaults.LIBS; - } - - public void setLibs(List libs) { - this.libs = libs; - } - - /** Wrapper's manifest for User Account Control. */ - public File getManifest() { - return manifest; - } - - public void setManifest(File manifest) { - this.manifest = manifest; - } - - /** ICO file. */ - public File getIcon() { - return icon; - } - - public void setIcon(File icon) { - this.icon = icon; - } - - /** Jar to wrap. */ - public File getJar() { - return jar; - } - - public void setJar(File jar) { - this.jar = jar; - } - - public List getVariables() { - return variables; - } - - public void setVariables(List variables) { - this.variables = variables; - } - - public ClassPath getClassPath() { - return classPath; - } - - public void setClassPath(ClassPath classpath) { - this.classPath = classpath; - } - - /** JRE configuration */ - public Jre getJre() { - return jre; - } - - public void setJre(Jre jre) { - this.jre = jre; - } - - /** Output EXE file. */ - public File getOutfile() { - return outfile; - } - - public void setOutfile(File outfile) { - this.outfile = outfile; - } - - /** Custom process name as the output EXE file name. */ - public boolean isCustomProcName() { - return customProcName; - } - - public void setCustomProcName(boolean customProcName) { - this.customProcName = customProcName; - } - - /** Splash screen configuration. */ - public Splash getSplash() { - return splash; - } - - public void setSplash(Splash splash) { - this.splash = splash; - } - - /** Stay alive after launching the application. */ - public boolean isStayAlive() { - return stayAlive; - } - - public void setStayAlive(boolean stayAlive) { - this.stayAlive = stayAlive; - } - - public VersionInfo getVersionInfo() { - return versionInfo; - } - - public void setVersionInfo(VersionInfo versionInfo) { - this.versionInfo = versionInfo; - } - - public boolean isDontWrapJar() { - return dontWrapJar; - } - - public void setDontWrapJar(boolean dontWrapJar) { - this.dontWrapJar = dontWrapJar; - } - - public int getPriorityIndex() { - int x = Arrays.asList(PRIORITY_CLASS_NAMES).indexOf(getPriority()); - return x != -1 ? x : 0; - } - - public void setPriorityIndex(int x) { - priority = PRIORITY_CLASS_NAMES[x]; - } - - public String getPriority() { - return Validator.isEmpty(priority) ? PRIORITY_CLASS_NAMES[0] : priority; - } - - public void setPriority(String priority) { - this.priority = priority; - } - - public int getPriorityClass() { - return PRIORITY_CLASSES[getPriorityIndex()]; - } - - public String getDownloadUrl() { - return downloadUrl == null ? DOWNLOAD_URL : downloadUrl; - } - - public void setDownloadUrl(String downloadUrl) { - this.downloadUrl = downloadUrl; - } - - public String getSupportUrl() { - return supportUrl; - } - - public void setSupportUrl(String supportUrl) { - this.supportUrl = supportUrl; - } - - public Msg getMessages() { - return messages; - } - - public void setMessages(Msg messages) { - this.messages = messages; - } - - public SingleInstance getSingleInstance() { - return singleInstance; - } - - public void setSingleInstance(SingleInstance singleInstance) { - this.singleInstance = singleInstance; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j.config; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Config implements IValidatable { + + // 1.x config properties_____________________________________________________________ + public static final String HEADER = "header"; + public static final String JAR = "jar"; + public static final String OUTFILE = "outfile"; + public static final String ERR_TITLE = "errTitle"; + public static final String JAR_ARGS = "jarArgs"; + public static final String CHDIR = "chdir"; + public static final String CUSTOM_PROC_NAME = "customProcName"; + public static final String STAY_ALIVE = "stayAlive"; + public static final String ICON = "icon"; + + // __________________________________________________________________________________ + public static final String DOWNLOAD_URL = "http://java.com/download"; + + public static final String GUI_HEADER = "gui"; + public static final String CONSOLE_HEADER = "console"; + + private static final String[] HEADER_TYPES = new String[] { GUI_HEADER, + CONSOLE_HEADER }; + + private static final String[] PRIORITY_CLASS_NAMES = new String[] { "normal", + "idle", + "high" }; + + private static final int[] PRIORITY_CLASSES = new int[] { 0x00000020, + 0x00000040, + 0x00000080 }; + + private boolean dontWrapJar; + private String headerType = GUI_HEADER; + private List headerObjects; + private List libs; + private File jar; + private File outfile; + + // Runtime header configuration + private String errTitle; + private String cmdLine; + private String chdir; + private String priority; + private String downloadUrl; + private String supportUrl; + private boolean customProcName; + private boolean stayAlive; + private File manifest; + private File icon; + private List variables; + private SingleInstance singleInstance; + private ClassPath classPath; + private Jre jre; + private Splash splash; + private VersionInfo versionInfo; + private Msg messages; + + public void checkInvariants() { + Validator.checkTrue(outfile != null && outfile.getPath().endsWith(".exe"), + "outfile", Messages.getString("Config.specify.output.exe")); + if (dontWrapJar) { + if (jar != null && !jar.getPath().equals("")) { + Validator.checkRelativeWinPath(jar.getPath(), "jar", + Messages.getString("Config.application.jar.path")); + } else { + Validator.checkTrue(classPath != null, "classPath", + Messages.getString("ClassPath.or.jar")); + } + } else { + Validator.checkFile(jar, "jar", + Messages.getString("Config.application.jar")); + } + if (!Validator.isEmpty(chdir)) { + Validator.checkRelativeWinPath(chdir, "chdir", + Messages.getString("Config.chdir.relative")); + Validator.checkFalse(chdir.toLowerCase().equals("true") + || chdir.toLowerCase().equals("false"), + "chdir", Messages.getString("Config.chdir.path")); + } + Validator.checkOptFile(manifest, "manifest", Messages.getString("Config.manifest")); + Validator.checkOptFile(icon, "icon", Messages.getString("Config.icon")); + Validator.checkOptString(cmdLine, Validator.MAX_BIG_STR, "jarArgs", + Messages.getString("Config.jar.arguments")); + Validator.checkOptString(errTitle, Validator.MAX_STR, "errTitle", + Messages.getString("Config.error.title")); + Validator.checkOptString(downloadUrl, 256, + "downloadUrl", Messages.getString("Config.download.url")); + Validator.checkOptString(supportUrl, 256, + "supportUrl", Messages.getString("Config.support.url")); + Validator.checkIn(getHeaderType(), HEADER_TYPES, "headerType", + Messages.getString("Config.header.type")); + Validator.checkFalse(getHeaderType().equals(CONSOLE_HEADER) && splash != null, + "headerType", + Messages.getString("Config.splash.not.impl.by.console.hdr")); + Validator.checkOptStrings(variables, + Validator.MAX_ARGS, + Validator.MAX_ARGS, + "[^=%\t]+=[^=\t]+", + "variables", + Messages.getString("Config.variables"), + Messages.getString("Config.variables.err")); + Validator.checkIn(getPriority(), PRIORITY_CLASS_NAMES, "priority", + Messages.getString("Config.priority")); + jre.checkInvariants(); + } + + public void validate() { + checkInvariants(); + if (classPath != null) { + classPath.checkInvariants(); + } + if (splash != null) { + splash.checkInvariants(); + } + if (versionInfo != null) { + versionInfo.checkInvariants(); + } + } + + /** Change current directory to EXE location. */ + public String getChdir() { + return chdir; + } + + public void setChdir(String chdir) { + this.chdir = chdir; + } + + /** Constant command line arguments passed to the application. */ + public String getCmdLine() { + return cmdLine; + } + + public void setCmdLine(String cmdLine) { + this.cmdLine = cmdLine; + } + + /** Optional, error message box title. */ + public String getErrTitle() { + return errTitle; + } + + public void setErrTitle(String errTitle) { + this.errTitle = errTitle; + } + + /** launch4j header file. */ + public String getHeaderType() { + return headerType.toLowerCase(); + } + + public void setHeaderType(String headerType) { + this.headerType = headerType; + } + + /** launch4j header file index - used by GUI. */ + public int getHeaderTypeIndex() { + int x = Arrays.asList(HEADER_TYPES).indexOf(getHeaderType()); + return x != -1 ? x : 0; + } + + public void setHeaderTypeIndex(int headerTypeIndex) { + headerType = HEADER_TYPES[headerTypeIndex]; + } + + public boolean isCustomHeaderObjects() { + return headerObjects != null && !headerObjects.isEmpty(); + } + + public List getHeaderObjects() { + return isCustomHeaderObjects() ? headerObjects + : getHeaderType().equals(GUI_HEADER) + ? LdDefaults.GUI_HEADER_OBJECTS + : LdDefaults.CONSOLE_HEADER_OBJECTS; + } + + public void setHeaderObjects(List headerObjects) { + this.headerObjects = headerObjects; + } + + public boolean isCustomLibs() { + return libs != null && !libs.isEmpty(); + } + + public List getLibs() { + return isCustomLibs() ? libs : LdDefaults.LIBS; + } + + public void setLibs(List libs) { + this.libs = libs; + } + + /** Wrapper's manifest for User Account Control. */ + public File getManifest() { + return manifest; + } + + public void setManifest(File manifest) { + this.manifest = manifest; + } + + /** ICO file. */ + public File getIcon() { + return icon; + } + + public void setIcon(File icon) { + this.icon = icon; + } + + /** Jar to wrap. */ + public File getJar() { + return jar; + } + + public void setJar(File jar) { + this.jar = jar; + } + + public List getVariables() { + return variables; + } + + public void setVariables(List variables) { + this.variables = variables; + } + + public ClassPath getClassPath() { + return classPath; + } + + public void setClassPath(ClassPath classpath) { + this.classPath = classpath; + } + + /** JRE configuration */ + public Jre getJre() { + return jre; + } + + public void setJre(Jre jre) { + this.jre = jre; + } + + /** Output EXE file. */ + public File getOutfile() { + return outfile; + } + + public void setOutfile(File outfile) { + this.outfile = outfile; + } + + /** Custom process name as the output EXE file name. */ + public boolean isCustomProcName() { + return customProcName; + } + + public void setCustomProcName(boolean customProcName) { + this.customProcName = customProcName; + } + + /** Splash screen configuration. */ + public Splash getSplash() { + return splash; + } + + public void setSplash(Splash splash) { + this.splash = splash; + } + + /** Stay alive after launching the application. */ + public boolean isStayAlive() { + return stayAlive; + } + + public void setStayAlive(boolean stayAlive) { + this.stayAlive = stayAlive; + } + + public VersionInfo getVersionInfo() { + return versionInfo; + } + + public void setVersionInfo(VersionInfo versionInfo) { + this.versionInfo = versionInfo; + } + + public boolean isDontWrapJar() { + return dontWrapJar; + } + + public void setDontWrapJar(boolean dontWrapJar) { + this.dontWrapJar = dontWrapJar; + } + + public int getPriorityIndex() { + int x = Arrays.asList(PRIORITY_CLASS_NAMES).indexOf(getPriority()); + return x != -1 ? x : 0; + } + + public void setPriorityIndex(int x) { + priority = PRIORITY_CLASS_NAMES[x]; + } + + public String getPriority() { + return Validator.isEmpty(priority) ? PRIORITY_CLASS_NAMES[0] : priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public int getPriorityClass() { + return PRIORITY_CLASSES[getPriorityIndex()]; + } + + public String getDownloadUrl() { + return downloadUrl == null ? DOWNLOAD_URL : downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getSupportUrl() { + return supportUrl; + } + + public void setSupportUrl(String supportUrl) { + this.supportUrl = supportUrl; + } + + public Msg getMessages() { + return messages; + } + + public void setMessages(Msg messages) { + this.messages = messages; + } + + public SingleInstance getSingleInstance() { + return singleInstance; + } + + public void setSingleInstance(SingleInstance singleInstance) { + this.singleInstance = singleInstance; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersister.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersister.java old mode 100755 new mode 100644 index 43daf86814f..b604786e484 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersister.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersister.java @@ -1,249 +1,249 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 22, 2005 - */ -package net.sf.launch4j.config; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import net.sf.launch4j.Util; - -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ConfigPersister { - - private static final ConfigPersister _instance = new ConfigPersister(); - - private final XStream _xstream; - private Config _config; - private File _configPath; - - private ConfigPersister() { - _xstream = new XStream(new DomDriver()); - _xstream.alias("launch4jConfig", Config.class); - _xstream.alias("classPath", ClassPath.class); - _xstream.alias("jre", Jre.class); - _xstream.alias("splash", Splash.class); - _xstream.alias("versionInfo", VersionInfo.class); - - _xstream.addImplicitCollection(Config.class, "headerObjects", "obj", - String.class); - _xstream.addImplicitCollection(Config.class, "libs", "lib", String.class); - _xstream.addImplicitCollection(Config.class, "variables", "var", String.class); - _xstream.addImplicitCollection(ClassPath.class, "paths", "cp", String.class); - _xstream.addImplicitCollection(Jre.class, "options", "opt", String.class); - } - - public static ConfigPersister getInstance() { - return _instance; - } - - public Config getConfig() { - return _config; - } - - public File getConfigPath() { - return _configPath; - } - - public File getOutputPath() throws IOException { - if (_config.getOutfile().isAbsolute()) { - return _config.getOutfile().getParentFile(); - } - File parent = _config.getOutfile().getParentFile(); - return (parent != null) ? new File(_configPath, parent.getPath()) : _configPath; - } - - public File getOutputFile() throws IOException { - return _config.getOutfile().isAbsolute() - ? _config.getOutfile() - : new File(getOutputPath(), _config.getOutfile().getName()); - } - - public void createBlank() { - _config = new Config(); - _config.setJre(new Jre()); - _configPath = null; - } - - public void setAntConfig(Config c, File basedir) { - _config = c; - _configPath = basedir; - } - - public void load(File f) throws ConfigPersisterException { - try { - FileReader r = new FileReader(f); - char[] buf = new char[(int) f.length()]; - r.read(buf); - r.close(); - // Convert 2.x config to 3.x - String s = String.valueOf(buf) - .replaceAll("0<", "gui<") - .replaceAll("1<", "console<") - .replaceAll("jarArgs>", "cmdLine>") - .replaceAll("", "") - .replaceAll("args>", "opt>") - .replaceAll("", "") - .replaceAll("false", - "" + Jre.JDK_PREFERENCE_PREFER_JRE + "") - .replaceAll("true", - "" + Jre.JDK_PREFERENCE_JRE_ONLY + "") - .replaceAll("0", "") - .replaceAll("0", ""); - _config = (Config) _xstream.fromXML(s); - setConfigPath(f); - } catch (Exception e) { - throw new ConfigPersisterException(e); - } - } - - /** - * Imports launch4j 1.x.x config file. - */ - public void loadVersion1(File f) throws ConfigPersisterException { - try { - Props props = new Props(f); - _config = new Config(); - String header = props.getProperty(Config.HEADER); - _config.setHeaderType(header == null - || header.toLowerCase().equals("guihead.bin") ? Config.GUI_HEADER - : Config.CONSOLE_HEADER); - _config.setJar(props.getFile(Config.JAR)); - _config.setOutfile(props.getFile(Config.OUTFILE)); - _config.setJre(new Jre()); - _config.getJre().setPath(props.getProperty(Jre.PATH)); - _config.getJre().setMinVersion(props.getProperty(Jre.MIN_VERSION)); - _config.getJre().setMaxVersion(props.getProperty(Jre.MAX_VERSION)); - String args = props.getProperty(Jre.ARGS); - if (args != null) { - List jreOptions = new ArrayList(); - jreOptions.add(args); - _config.getJre().setOptions(jreOptions); - } - _config.setCmdLine(props.getProperty(Config.JAR_ARGS)); - _config.setChdir("true".equals(props.getProperty(Config.CHDIR)) - ? "." : null); - _config.setCustomProcName("true".equals( - props.getProperty("setProcName"))); // 1.x - _config.setStayAlive("true".equals(props.getProperty(Config.STAY_ALIVE))); - _config.setErrTitle(props.getProperty(Config.ERR_TITLE)); - _config.setIcon(props.getFile(Config.ICON)); - File splashFile = props.getFile(Splash.SPLASH_FILE); - if (splashFile != null) { - _config.setSplash(new Splash()); - _config.getSplash().setFile(splashFile); - String waitfor = props.getProperty("waitfor"); // 1.x - _config.getSplash().setWaitForWindow(waitfor != null - && !waitfor.equals("")); - String splashTimeout = props.getProperty(Splash.TIMEOUT); - if (splashTimeout != null) { - _config.getSplash().setTimeout(Integer.parseInt(splashTimeout)); - } - _config.getSplash().setTimeoutErr("true".equals( - props.getProperty(Splash.TIMEOUT_ERR))); - } else { - _config.setSplash(null); - } - setConfigPath(f); - } catch (IOException e) { - throw new ConfigPersisterException(e); - } - } - - public void save(File f) throws ConfigPersisterException { - try { - BufferedWriter w = new BufferedWriter(new FileWriter(f)); - _xstream.toXML(_config, w); - w.close(); - setConfigPath(f); - } catch (Exception e) { - throw new ConfigPersisterException(e); - } - } - - private void setConfigPath(File configFile) { - _configPath = configFile.getAbsoluteFile().getParentFile(); - } - - private class Props { - final Properties _properties = new Properties(); - - public Props(File f) throws IOException { - FileInputStream is = null; - try { - is = new FileInputStream(f); - _properties.load(is); - } finally { - Util.close(is); - } - } - - /** - * Get property and remove trailing # comments. - */ - public String getProperty(String key) { - String p = _properties.getProperty(key); - if (p == null) { - return null; - } - int x = p.indexOf('#'); - if (x == -1) { - return p; - } - do { - x--; - } while (x > 0 && (p.charAt(x) == ' ' || p.charAt(x) == '\t')); - return (x == 0) ? "" : p.substring(0, x + 1); - } - - public File getFile(String key) { - String value = getProperty(key); - return value != null ? new File(value) : null; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 22, 2005 + */ +package net.sf.launch4j.config; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import net.sf.launch4j.Util; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ConfigPersister { + + private static final ConfigPersister _instance = new ConfigPersister(); + + private final XStream _xstream; + private Config _config; + private File _configPath; + + private ConfigPersister() { + _xstream = new XStream(new DomDriver()); + _xstream.alias("launch4jConfig", Config.class); + _xstream.alias("classPath", ClassPath.class); + _xstream.alias("jre", Jre.class); + _xstream.alias("splash", Splash.class); + _xstream.alias("versionInfo", VersionInfo.class); + + _xstream.addImplicitCollection(Config.class, "headerObjects", "obj", + String.class); + _xstream.addImplicitCollection(Config.class, "libs", "lib", String.class); + _xstream.addImplicitCollection(Config.class, "variables", "var", String.class); + _xstream.addImplicitCollection(ClassPath.class, "paths", "cp", String.class); + _xstream.addImplicitCollection(Jre.class, "options", "opt", String.class); + } + + public static ConfigPersister getInstance() { + return _instance; + } + + public Config getConfig() { + return _config; + } + + public File getConfigPath() { + return _configPath; + } + + public File getOutputPath() throws IOException { + if (_config.getOutfile().isAbsolute()) { + return _config.getOutfile().getParentFile(); + } + File parent = _config.getOutfile().getParentFile(); + return (parent != null) ? new File(_configPath, parent.getPath()) : _configPath; + } + + public File getOutputFile() throws IOException { + return _config.getOutfile().isAbsolute() + ? _config.getOutfile() + : new File(getOutputPath(), _config.getOutfile().getName()); + } + + public void createBlank() { + _config = new Config(); + _config.setJre(new Jre()); + _configPath = null; + } + + public void setAntConfig(Config c, File basedir) { + _config = c; + _configPath = basedir; + } + + public void load(File f) throws ConfigPersisterException { + try { + FileReader r = new FileReader(f); + char[] buf = new char[(int) f.length()]; + r.read(buf); + r.close(); + // Convert 2.x config to 3.x + String s = String.valueOf(buf) + .replaceAll("0<", "gui<") + .replaceAll("1<", "console<") + .replaceAll("jarArgs>", "cmdLine>") + .replaceAll("", "") + .replaceAll("args>", "opt>") + .replaceAll("", "") + .replaceAll("false", + "" + Jre.JDK_PREFERENCE_PREFER_JRE + "") + .replaceAll("true", + "" + Jre.JDK_PREFERENCE_JRE_ONLY + "") + .replaceAll("0", "") + .replaceAll("0", ""); + _config = (Config) _xstream.fromXML(s); + setConfigPath(f); + } catch (Exception e) { + throw new ConfigPersisterException(e); + } + } + + /** + * Imports launch4j 1.x.x config file. + */ + public void loadVersion1(File f) throws ConfigPersisterException { + try { + Props props = new Props(f); + _config = new Config(); + String header = props.getProperty(Config.HEADER); + _config.setHeaderType(header == null + || header.toLowerCase().equals("guihead.bin") ? Config.GUI_HEADER + : Config.CONSOLE_HEADER); + _config.setJar(props.getFile(Config.JAR)); + _config.setOutfile(props.getFile(Config.OUTFILE)); + _config.setJre(new Jre()); + _config.getJre().setPath(props.getProperty(Jre.PATH)); + _config.getJre().setMinVersion(props.getProperty(Jre.MIN_VERSION)); + _config.getJre().setMaxVersion(props.getProperty(Jre.MAX_VERSION)); + String args = props.getProperty(Jre.ARGS); + if (args != null) { + List jreOptions = new ArrayList(); + jreOptions.add(args); + _config.getJre().setOptions(jreOptions); + } + _config.setCmdLine(props.getProperty(Config.JAR_ARGS)); + _config.setChdir("true".equals(props.getProperty(Config.CHDIR)) + ? "." : null); + _config.setCustomProcName("true".equals( + props.getProperty("setProcName"))); // 1.x + _config.setStayAlive("true".equals(props.getProperty(Config.STAY_ALIVE))); + _config.setErrTitle(props.getProperty(Config.ERR_TITLE)); + _config.setIcon(props.getFile(Config.ICON)); + File splashFile = props.getFile(Splash.SPLASH_FILE); + if (splashFile != null) { + _config.setSplash(new Splash()); + _config.getSplash().setFile(splashFile); + String waitfor = props.getProperty("waitfor"); // 1.x + _config.getSplash().setWaitForWindow(waitfor != null + && !waitfor.equals("")); + String splashTimeout = props.getProperty(Splash.TIMEOUT); + if (splashTimeout != null) { + _config.getSplash().setTimeout(Integer.parseInt(splashTimeout)); + } + _config.getSplash().setTimeoutErr("true".equals( + props.getProperty(Splash.TIMEOUT_ERR))); + } else { + _config.setSplash(null); + } + setConfigPath(f); + } catch (IOException e) { + throw new ConfigPersisterException(e); + } + } + + public void save(File f) throws ConfigPersisterException { + try { + BufferedWriter w = new BufferedWriter(new FileWriter(f)); + _xstream.toXML(_config, w); + w.close(); + setConfigPath(f); + } catch (Exception e) { + throw new ConfigPersisterException(e); + } + } + + private void setConfigPath(File configFile) { + _configPath = configFile.getAbsoluteFile().getParentFile(); + } + + private class Props { + final Properties _properties = new Properties(); + + public Props(File f) throws IOException { + FileInputStream is = null; + try { + is = new FileInputStream(f); + _properties.load(is); + } finally { + Util.close(is); + } + } + + /** + * Get property and remove trailing # comments. + */ + public String getProperty(String key) { + String p = _properties.getProperty(key); + if (p == null) { + return null; + } + int x = p.indexOf('#'); + if (x == -1) { + return p; + } + do { + x--; + } while (x > 0 && (p.charAt(x) == ' ' || p.charAt(x) == '\t')); + return (x == 0) ? "" : p.substring(0, x + 1); + } + + public File getFile(String key) { + String value = getProperty(key); + return value != null ? new File(value) : null; + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java old mode 100755 new mode 100644 index 29940b945ff..dfc3d6f0c51 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java @@ -1,51 +1,51 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 22, 2005 - */ -package net.sf.launch4j.config; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ConfigPersisterException extends Exception { - - public ConfigPersisterException(String msg, Throwable t) { - super(msg, t); - } - - public ConfigPersisterException(Throwable t) { - super(t); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 22, 2005 + */ +package net.sf.launch4j.config; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ConfigPersisterException extends Exception { + + public ConfigPersisterException(String msg, Throwable t) { + super(msg, t); + } + + public ConfigPersisterException(Throwable t) { + super(t); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Jre.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Jre.java old mode 100755 new mode 100644 index 0df45bb84a7..2a37b1f55f6 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Jre.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Jre.java @@ -1,235 +1,235 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j.config; - -import java.util.Arrays; -import java.util.List; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Jre implements IValidatable { - - // 1.x config properties_____________________________________________________________ - public static final String PATH = "jrepath"; - public static final String MIN_VERSION = "javamin"; - public static final String MAX_VERSION = "javamax"; - public static final String ARGS = "jvmArgs"; - - // __________________________________________________________________________________ - public static final String VERSION_PATTERN = "(\\d\\.){2}\\d(_\\d+)?"; - - public static final String JDK_PREFERENCE_JRE_ONLY = "jreOnly"; - public static final String JDK_PREFERENCE_PREFER_JRE = "preferJre"; - public static final String JDK_PREFERENCE_PREFER_JDK = "preferJdk"; - public static final String JDK_PREFERENCE_JDK_ONLY = "jdkOnly"; - - private static final String[] JDK_PREFERENCE_NAMES = new String[] { - JDK_PREFERENCE_JRE_ONLY, - JDK_PREFERENCE_PREFER_JRE, - JDK_PREFERENCE_PREFER_JDK, - JDK_PREFERENCE_JDK_ONLY }; - - public static final int DEFAULT_JDK_PREFERENCE_INDEX - = Arrays.asList(JDK_PREFERENCE_NAMES).indexOf(JDK_PREFERENCE_PREFER_JRE); - - private String path; - private String minVersion; - private String maxVersion; - private String jdkPreference; - private Integer initialHeapSize; - private Integer initialHeapPercent; - private Integer maxHeapSize; - private Integer maxHeapPercent; - private List options; - - public void checkInvariants() { - Validator.checkOptString(minVersion, 10, VERSION_PATTERN, - "jre.minVersion", Messages.getString("Jre.min.version")); - Validator.checkOptString(maxVersion, 10, VERSION_PATTERN, - "jre.maxVersion", Messages.getString("Jre.max.version")); - if (Validator.isEmpty(path)) { - Validator.checkFalse(Validator.isEmpty(minVersion), - "jre.minVersion", Messages.getString("Jre.specify.jre.min.version.or.path")); - } else { - Validator.checkString(path, Validator.MAX_PATH, - "jre.path", Messages.getString("Jre.bundled.path")); - } - if (!Validator.isEmpty(maxVersion)) { - Validator.checkFalse(Validator.isEmpty(minVersion), - "jre.minVersion", Messages.getString("Jre.specify.min.version")); - Validator.checkTrue(minVersion.compareTo(maxVersion) < 0, - "jre.maxVersion", Messages.getString("Jre.max.greater.than.min")); - } - Validator.checkTrue(initialHeapSize == null || maxHeapSize != null, - "jre.maxHeapSize", Messages.getString("Jre.initial.and.max.heap")); - Validator.checkTrue(initialHeapSize == null || initialHeapSize.intValue() > 0, - "jre.initialHeapSize", Messages.getString("Jre.initial.heap")); - Validator.checkTrue(maxHeapSize == null || (maxHeapSize.intValue() - >= ((initialHeapSize != null) ? initialHeapSize.intValue() : 1)), - "jre.maxHeapSize", Messages.getString("Jre.max.heap")); - Validator.checkTrue(initialHeapPercent == null || maxHeapPercent != null, - "jre.maxHeapPercent", Messages.getString("Jre.initial.and.max.heap")); - if (initialHeapPercent != null) { - Validator.checkRange(initialHeapPercent.intValue(), 1, 100, - "jre.initialHeapPercent", - Messages.getString("Jre.initial.heap.percent")); - } - if (maxHeapPercent != null) { - Validator.checkRange(maxHeapPercent.intValue(), - initialHeapPercent != null ? initialHeapPercent.intValue() : 1, 100, - "jre.maxHeapPercent", - Messages.getString("Jre.max.heap.percent")); - } - Validator.checkIn(getJdkPreference(), JDK_PREFERENCE_NAMES, - "jre.jdkPreference", Messages.getString("Jre.jdkPreference.invalid")); - Validator.checkOptStrings(options, - Validator.MAX_ARGS, - Validator.MAX_ARGS, - "[^\"]*|([^\"]*\"[^\"]*\"[^\"]*)*", - "jre.options", - Messages.getString("Jre.jvm.options"), - Messages.getString("Jre.jvm.options.unclosed.quotation")); - - // Quoted variable references: "[^%]*|([^%]*\"([^%]*%[^%]+%[^%]*)+\"[^%]*)*" - Validator.checkOptStrings(options, - Validator.MAX_ARGS, - Validator.MAX_ARGS, - "[^%]*|([^%]*([^%]*%[^%]+%[^%]*)+[^%]*)*", - "jre.options", - Messages.getString("Jre.jvm.options"), - Messages.getString("Jre.jvm.options.variable")); - } - - /** JVM options */ - public List getOptions() { - return options; - } - - public void setOptions(List options) { - this.options = options; - } - - /** Max Java version (x.x.x) */ - public String getMaxVersion() { - return maxVersion; - } - - public void setMaxVersion(String maxVersion) { - this.maxVersion = maxVersion; - } - - /** Min Java version (x.x.x) */ - public String getMinVersion() { - return minVersion; - } - - public void setMinVersion(String minVersion) { - this.minVersion = minVersion; - } - - /** Preference for standalone JRE or JDK-private JRE */ - public String getJdkPreference() { - return Validator.isEmpty(jdkPreference) ? JDK_PREFERENCE_PREFER_JRE - : jdkPreference; - } - - public void setJdkPreference(String jdkPreference) { - this.jdkPreference = jdkPreference; - } - - /** Preference for standalone JRE or JDK-private JRE */ - public int getJdkPreferenceIndex() { - int x = Arrays.asList(JDK_PREFERENCE_NAMES).indexOf(getJdkPreference()); - return x != -1 ? x : DEFAULT_JDK_PREFERENCE_INDEX; - } - - public void setJdkPreferenceIndex(int x) { - jdkPreference = JDK_PREFERENCE_NAMES[x]; - } - - /** JRE path */ - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - /** Initial heap size in MB */ - public Integer getInitialHeapSize() { - return initialHeapSize; - } - - public void setInitialHeapSize(Integer initialHeapSize) { - this.initialHeapSize = getInteger(initialHeapSize); - } - - /** Max heap size in MB */ - public Integer getMaxHeapSize() { - return maxHeapSize; - } - - public void setMaxHeapSize(Integer maxHeapSize) { - this.maxHeapSize = getInteger(maxHeapSize); - } - - public Integer getInitialHeapPercent() { - return initialHeapPercent; - } - - public void setInitialHeapPercent(Integer initialHeapPercent) { - this.initialHeapPercent = getInteger(initialHeapPercent); - } - - public Integer getMaxHeapPercent() { - return maxHeapPercent; - } - - public void setMaxHeapPercent(Integer maxHeapPercent) { - this.maxHeapPercent = getInteger(maxHeapPercent); - } - - /** Convert 0 to null */ - private Integer getInteger(Integer i) { - return i != null && i.intValue() == 0 ? null : i; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j.config; + +import java.util.Arrays; +import java.util.List; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Jre implements IValidatable { + + // 1.x config properties_____________________________________________________________ + public static final String PATH = "jrepath"; + public static final String MIN_VERSION = "javamin"; + public static final String MAX_VERSION = "javamax"; + public static final String ARGS = "jvmArgs"; + + // __________________________________________________________________________________ + public static final String VERSION_PATTERN = "(\\d\\.){2}\\d(_\\d+)?"; + + public static final String JDK_PREFERENCE_JRE_ONLY = "jreOnly"; + public static final String JDK_PREFERENCE_PREFER_JRE = "preferJre"; + public static final String JDK_PREFERENCE_PREFER_JDK = "preferJdk"; + public static final String JDK_PREFERENCE_JDK_ONLY = "jdkOnly"; + + private static final String[] JDK_PREFERENCE_NAMES = new String[] { + JDK_PREFERENCE_JRE_ONLY, + JDK_PREFERENCE_PREFER_JRE, + JDK_PREFERENCE_PREFER_JDK, + JDK_PREFERENCE_JDK_ONLY }; + + public static final int DEFAULT_JDK_PREFERENCE_INDEX + = Arrays.asList(JDK_PREFERENCE_NAMES).indexOf(JDK_PREFERENCE_PREFER_JRE); + + private String path; + private String minVersion; + private String maxVersion; + private String jdkPreference; + private Integer initialHeapSize; + private Integer initialHeapPercent; + private Integer maxHeapSize; + private Integer maxHeapPercent; + private List options; + + public void checkInvariants() { + Validator.checkOptString(minVersion, 10, VERSION_PATTERN, + "jre.minVersion", Messages.getString("Jre.min.version")); + Validator.checkOptString(maxVersion, 10, VERSION_PATTERN, + "jre.maxVersion", Messages.getString("Jre.max.version")); + if (Validator.isEmpty(path)) { + Validator.checkFalse(Validator.isEmpty(minVersion), + "jre.minVersion", Messages.getString("Jre.specify.jre.min.version.or.path")); + } else { + Validator.checkString(path, Validator.MAX_PATH, + "jre.path", Messages.getString("Jre.bundled.path")); + } + if (!Validator.isEmpty(maxVersion)) { + Validator.checkFalse(Validator.isEmpty(minVersion), + "jre.minVersion", Messages.getString("Jre.specify.min.version")); + Validator.checkTrue(minVersion.compareTo(maxVersion) < 0, + "jre.maxVersion", Messages.getString("Jre.max.greater.than.min")); + } + Validator.checkTrue(initialHeapSize == null || maxHeapSize != null, + "jre.maxHeapSize", Messages.getString("Jre.initial.and.max.heap")); + Validator.checkTrue(initialHeapSize == null || initialHeapSize.intValue() > 0, + "jre.initialHeapSize", Messages.getString("Jre.initial.heap")); + Validator.checkTrue(maxHeapSize == null || (maxHeapSize.intValue() + >= ((initialHeapSize != null) ? initialHeapSize.intValue() : 1)), + "jre.maxHeapSize", Messages.getString("Jre.max.heap")); + Validator.checkTrue(initialHeapPercent == null || maxHeapPercent != null, + "jre.maxHeapPercent", Messages.getString("Jre.initial.and.max.heap")); + if (initialHeapPercent != null) { + Validator.checkRange(initialHeapPercent.intValue(), 1, 100, + "jre.initialHeapPercent", + Messages.getString("Jre.initial.heap.percent")); + } + if (maxHeapPercent != null) { + Validator.checkRange(maxHeapPercent.intValue(), + initialHeapPercent != null ? initialHeapPercent.intValue() : 1, 100, + "jre.maxHeapPercent", + Messages.getString("Jre.max.heap.percent")); + } + Validator.checkIn(getJdkPreference(), JDK_PREFERENCE_NAMES, + "jre.jdkPreference", Messages.getString("Jre.jdkPreference.invalid")); + Validator.checkOptStrings(options, + Validator.MAX_ARGS, + Validator.MAX_ARGS, + "[^\"]*|([^\"]*\"[^\"]*\"[^\"]*)*", + "jre.options", + Messages.getString("Jre.jvm.options"), + Messages.getString("Jre.jvm.options.unclosed.quotation")); + + // Quoted variable references: "[^%]*|([^%]*\"([^%]*%[^%]+%[^%]*)+\"[^%]*)*" + Validator.checkOptStrings(options, + Validator.MAX_ARGS, + Validator.MAX_ARGS, + "[^%]*|([^%]*([^%]*%[^%]+%[^%]*)+[^%]*)*", + "jre.options", + Messages.getString("Jre.jvm.options"), + Messages.getString("Jre.jvm.options.variable")); + } + + /** JVM options */ + public List getOptions() { + return options; + } + + public void setOptions(List options) { + this.options = options; + } + + /** Max Java version (x.x.x) */ + public String getMaxVersion() { + return maxVersion; + } + + public void setMaxVersion(String maxVersion) { + this.maxVersion = maxVersion; + } + + /** Min Java version (x.x.x) */ + public String getMinVersion() { + return minVersion; + } + + public void setMinVersion(String minVersion) { + this.minVersion = minVersion; + } + + /** Preference for standalone JRE or JDK-private JRE */ + public String getJdkPreference() { + return Validator.isEmpty(jdkPreference) ? JDK_PREFERENCE_PREFER_JRE + : jdkPreference; + } + + public void setJdkPreference(String jdkPreference) { + this.jdkPreference = jdkPreference; + } + + /** Preference for standalone JRE or JDK-private JRE */ + public int getJdkPreferenceIndex() { + int x = Arrays.asList(JDK_PREFERENCE_NAMES).indexOf(getJdkPreference()); + return x != -1 ? x : DEFAULT_JDK_PREFERENCE_INDEX; + } + + public void setJdkPreferenceIndex(int x) { + jdkPreference = JDK_PREFERENCE_NAMES[x]; + } + + /** JRE path */ + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + /** Initial heap size in MB */ + public Integer getInitialHeapSize() { + return initialHeapSize; + } + + public void setInitialHeapSize(Integer initialHeapSize) { + this.initialHeapSize = getInteger(initialHeapSize); + } + + /** Max heap size in MB */ + public Integer getMaxHeapSize() { + return maxHeapSize; + } + + public void setMaxHeapSize(Integer maxHeapSize) { + this.maxHeapSize = getInteger(maxHeapSize); + } + + public Integer getInitialHeapPercent() { + return initialHeapPercent; + } + + public void setInitialHeapPercent(Integer initialHeapPercent) { + this.initialHeapPercent = getInteger(initialHeapPercent); + } + + public Integer getMaxHeapPercent() { + return maxHeapPercent; + } + + public void setMaxHeapPercent(Integer maxHeapPercent) { + this.maxHeapPercent = getInteger(maxHeapPercent); + } + + /** Convert 0 to null */ + private Integer getInteger(Integer i) { + return i != null && i.intValue() == 0 ? null : i; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/LdDefaults.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/LdDefaults.java old mode 100755 new mode 100644 index 55f457cc3fc..7552e3ca5a6 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/LdDefaults.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/LdDefaults.java @@ -1,62 +1,62 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Sep 3, 2005 - */ -package net.sf.launch4j.config; - -import java.util.Arrays; -import java.util.List; - -public class LdDefaults { - - public static final List GUI_HEADER_OBJECTS = Arrays.asList(new String[] { - "w32api/crt2.o", - "head/guihead.o", - "head/head.o" }); - - public static final List CONSOLE_HEADER_OBJECTS = Arrays.asList(new String[] { - "w32api/crt2.o", - "head/consolehead.o", - "head/head.o"}); - - public static final List LIBS = Arrays.asList(new String[] { - "w32api/libmingw32.a", - "w32api/libgcc.a", - "w32api/libmsvcrt.a", - "w32api/libkernel32.a", - "w32api/libuser32.a", - "w32api/libadvapi32.a", - "w32api/libshell32.a" }); -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Sep 3, 2005 + */ +package net.sf.launch4j.config; + +import java.util.Arrays; +import java.util.List; + +public class LdDefaults { + + public static final List GUI_HEADER_OBJECTS = Arrays.asList(new String[] { + "w32api/crt2.o", + "head/guihead.o", + "head/head.o" }); + + public static final List CONSOLE_HEADER_OBJECTS = Arrays.asList(new String[] { + "w32api/crt2.o", + "head/consolehead.o", + "head/head.o"}); + + public static final List LIBS = Arrays.asList(new String[] { + "w32api/libmingw32.a", + "w32api/libgcc.a", + "w32api/libmsvcrt.a", + "w32api/libkernel32.a", + "w32api/libuser32.a", + "w32api/libadvapi32.a", + "w32api/libshell32.a" }); +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Messages.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Messages.java old mode 100755 new mode 100644 index a3f344e59c9..dab9480168d --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Messages.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Messages.java @@ -1,78 +1,78 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j.config; - -import java.text.MessageFormat; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.config.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - private static final MessageFormat FORMATTER = new MessageFormat(""); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } - - public static String getString(String key, String arg0) { - return getString(key, new Object[] {arg0}); - } - - public static String getString(String key, String arg0, String arg1) { - return getString(key, new Object[] {arg0, arg1}); - } - - public static String getString(String key, String arg0, String arg1, String arg2) { - return getString(key, new Object[] {arg0, arg1, arg2}); - } - - public static String getString(String key, Object[] args) { - try { - FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); - return FORMATTER.format(args); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j.config; + +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.config.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + private static final MessageFormat FORMATTER = new MessageFormat(""); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static String getString(String key, String arg0) { + return getString(key, new Object[] {arg0}); + } + + public static String getString(String key, String arg0, String arg1) { + return getString(key, new Object[] {arg0, arg1}); + } + + public static String getString(String key, String arg0, String arg1, String arg2) { + return getString(key, new Object[] {arg0, arg1, arg2}); + } + + public static String getString(String key, Object[] args) { + try { + FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); + return FORMATTER.format(args); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Msg.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Msg.java old mode 100755 new mode 100644 index ea3acfa34d8..2c646a76add --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Msg.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Msg.java @@ -1,111 +1,111 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Oct 8, 2006 - */ -package net.sf.launch4j.config; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class Msg implements IValidatable { - private String startupErr; - private String bundledJreErr; - private String jreVersionErr; - private String launcherErr; - private String instanceAlreadyExistsMsg; - - public void checkInvariants() { - Validator.checkOptString(startupErr, 1024, "startupErr", - Messages.getString("Msg.startupErr")); - Validator.checkOptString(bundledJreErr, 1024, "bundledJreErr", - Messages.getString("Msg.bundledJreErr")); - Validator.checkOptString(jreVersionErr, 1024, "jreVersionErr", - Messages.getString("Msg.jreVersionErr")); - Validator.checkOptString(launcherErr, 1024, "launcherErr", - Messages.getString("Msg.launcherErr")); - Validator.checkOptString(instanceAlreadyExistsMsg, 1024, "instanceAlreadyExistsMsg", - Messages.getString("Msg.instanceAlreadyExistsMsg")); - } - - public String getStartupErr() { - return !Validator.isEmpty(startupErr) ? startupErr - : "An error occurred while starting the application."; - } - - public void setStartupErr(String startupErr) { - this.startupErr = startupErr; - } - - public String getBundledJreErr() { - return !Validator.isEmpty(bundledJreErr) ? bundledJreErr - : "This application was configured to use a bundled Java Runtime" + - " Environment but the runtime is missing or corrupted."; - } - - public void setBundledJreErr(String bundledJreErr) { - this.bundledJreErr = bundledJreErr; - } - - public String getJreVersionErr() { - return !Validator.isEmpty(jreVersionErr) ? jreVersionErr - : "This application requires a Java Runtime Environment"; - } - - public void setJreVersionErr(String jreVersionErr) { - this.jreVersionErr = jreVersionErr; - } - - public String getLauncherErr() { - return !Validator.isEmpty(launcherErr) ? launcherErr - : "The registry refers to a nonexistent Java Runtime Environment" + - " installation or the runtime is corrupted."; - } - - public void setLauncherErr(String launcherErr) { - this.launcherErr = launcherErr; - } - - public String getInstanceAlreadyExistsMsg() { - return !Validator.isEmpty(instanceAlreadyExistsMsg) ? instanceAlreadyExistsMsg - : "An application instance is already running."; - } - - public void setInstanceAlreadyExistsMsg(String instanceAlreadyExistsMsg) { - this.instanceAlreadyExistsMsg = instanceAlreadyExistsMsg; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Oct 8, 2006 + */ +package net.sf.launch4j.config; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class Msg implements IValidatable { + private String startupErr; + private String bundledJreErr; + private String jreVersionErr; + private String launcherErr; + private String instanceAlreadyExistsMsg; + + public void checkInvariants() { + Validator.checkOptString(startupErr, 1024, "startupErr", + Messages.getString("Msg.startupErr")); + Validator.checkOptString(bundledJreErr, 1024, "bundledJreErr", + Messages.getString("Msg.bundledJreErr")); + Validator.checkOptString(jreVersionErr, 1024, "jreVersionErr", + Messages.getString("Msg.jreVersionErr")); + Validator.checkOptString(launcherErr, 1024, "launcherErr", + Messages.getString("Msg.launcherErr")); + Validator.checkOptString(instanceAlreadyExistsMsg, 1024, "instanceAlreadyExistsMsg", + Messages.getString("Msg.instanceAlreadyExistsMsg")); + } + + public String getStartupErr() { + return !Validator.isEmpty(startupErr) ? startupErr + : "An error occurred while starting the application."; + } + + public void setStartupErr(String startupErr) { + this.startupErr = startupErr; + } + + public String getBundledJreErr() { + return !Validator.isEmpty(bundledJreErr) ? bundledJreErr + : "This application was configured to use a bundled Java Runtime" + + " Environment but the runtime is missing or corrupted."; + } + + public void setBundledJreErr(String bundledJreErr) { + this.bundledJreErr = bundledJreErr; + } + + public String getJreVersionErr() { + return !Validator.isEmpty(jreVersionErr) ? jreVersionErr + : "This application requires a Java Runtime Environment"; + } + + public void setJreVersionErr(String jreVersionErr) { + this.jreVersionErr = jreVersionErr; + } + + public String getLauncherErr() { + return !Validator.isEmpty(launcherErr) ? launcherErr + : "The registry refers to a nonexistent Java Runtime Environment" + + " installation or the runtime is corrupted."; + } + + public void setLauncherErr(String launcherErr) { + this.launcherErr = launcherErr; + } + + public String getInstanceAlreadyExistsMsg() { + return !Validator.isEmpty(instanceAlreadyExistsMsg) ? instanceAlreadyExistsMsg + : "An application instance is already running."; + } + + public void setInstanceAlreadyExistsMsg(String instanceAlreadyExistsMsg) { + this.instanceAlreadyExistsMsg = instanceAlreadyExistsMsg; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/SingleInstance.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/SingleInstance.java old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Splash.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Splash.java old mode 100755 new mode 100644 index f736f82088e..27bf0daf45d --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Splash.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/Splash.java @@ -1,103 +1,103 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j.config; - -import java.io.File; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Splash implements IValidatable { - - // 1.x config properties_____________________________________________________________ - public static final String SPLASH_FILE = "splash"; - public static final String WAIT_FOR_TITLE = "waitForTitle"; - public static final String TIMEOUT = "splashTimeout"; - public static final String TIMEOUT_ERR = "splashTimeoutErr"; - - // __________________________________________________________________________________ - private File file; - private boolean waitForWindow = true; - private int timeout = 60; - private boolean timeoutErr = true; - - public void checkInvariants() { - Validator.checkFile(file, "splash.file", - Messages.getString("Splash.splash.file")); - Validator.checkRange(timeout, 1, 60 * 15, "splash.timeout", - Messages.getString("Splash.splash.timeout")); - } - - /** Splash screen in BMP format. */ - public File getFile() { - return file; - } - - public void setFile(File file) { - this.file = file; - } - - /** Splash timeout in seconds. */ - public int getTimeout() { - return timeout; - } - - public void setTimeout(int timeout) { - this.timeout = timeout; - } - - /** Signal error on splash timeout. */ - public boolean isTimeoutErr() { - return timeoutErr; - } - - public void setTimeoutErr(boolean timeoutErr) { - this.timeoutErr = timeoutErr; - } - - /** Hide splash screen when the child process displayes the first window. */ - public boolean getWaitForWindow() { - return waitForWindow; - } - - public void setWaitForWindow(boolean waitForWindow) { - this.waitForWindow = waitForWindow; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j.config; + +import java.io.File; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Splash implements IValidatable { + + // 1.x config properties_____________________________________________________________ + public static final String SPLASH_FILE = "splash"; + public static final String WAIT_FOR_TITLE = "waitForTitle"; + public static final String TIMEOUT = "splashTimeout"; + public static final String TIMEOUT_ERR = "splashTimeoutErr"; + + // __________________________________________________________________________________ + private File file; + private boolean waitForWindow = true; + private int timeout = 60; + private boolean timeoutErr = true; + + public void checkInvariants() { + Validator.checkFile(file, "splash.file", + Messages.getString("Splash.splash.file")); + Validator.checkRange(timeout, 1, 60 * 15, "splash.timeout", + Messages.getString("Splash.splash.timeout")); + } + + /** Splash screen in BMP format. */ + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } + + /** Splash timeout in seconds. */ + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + /** Signal error on splash timeout. */ + public boolean isTimeoutErr() { + return timeoutErr; + } + + public void setTimeoutErr(boolean timeoutErr) { + this.timeoutErr = timeoutErr; + } + + /** Hide splash screen when the child process displayes the first window. */ + public boolean getWaitForWindow() { + return waitForWindow; + } + + public void setWaitForWindow(boolean waitForWindow) { + this.waitForWindow = waitForWindow; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/VersionInfo.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/VersionInfo.java old mode 100755 new mode 100644 index d719460c2ab..24e273d36d5 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/VersionInfo.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/VersionInfo.java @@ -1,168 +1,168 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 21, 2005 - */ -package net.sf.launch4j.config; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class VersionInfo implements IValidatable { - public static final String VERSION_PATTERN = "(\\d+\\.){3}\\d+"; - - private String fileVersion; - private String txtFileVersion; - private String fileDescription; - private String copyright; - private String productVersion; - private String txtProductVersion; - private String productName; - private String companyName; - private String internalName; - private String originalFilename; - - public void checkInvariants() { - Validator.checkString(fileVersion, 20, VERSION_PATTERN, - "versionInfo.fileVersion", - Messages.getString("VersionInfo.file.version")); - Validator.checkString(txtFileVersion, 50, "versionInfo.txtFileVersion", - Messages.getString("VersionInfo.txt.file.version")); - Validator.checkString(fileDescription, 150, "versionInfo.fileDescription", - Messages.getString("VersionInfo.file.description")); - Validator.checkString(copyright, 150, "versionInfo.copyright", - Messages.getString("VersionInfo.copyright")); - Validator.checkString(productVersion, 20, VERSION_PATTERN, - "versionInfo.productVersion", - Messages.getString("VersionInfo.product.version")); - Validator.checkString(txtProductVersion, 50, "versionInfo.txtProductVersion", - Messages.getString("VersionInfo.txt.product.version")); - Validator.checkString(productName, 150, "versionInfo.productName", - Messages.getString("VersionInfo.product.name")); - Validator.checkOptString(companyName, 150, "versionInfo.companyName", - Messages.getString("VersionInfo.company.name")); - Validator.checkString(internalName, 50, "versionInfo.internalName", - Messages.getString("VersionInfo.internal.name")); - Validator.checkTrue(!internalName.endsWith(".exe"), "versionInfo.internalName", - Messages.getString("VersionInfo.internal.name.not.exe")); - Validator.checkString(originalFilename, 50, "versionInfo.originalFilename", - Messages.getString("VersionInfo.original.filename")); - Validator.checkTrue(originalFilename.endsWith(".exe"), - "versionInfo.originalFilename", - Messages.getString("VersionInfo.original.filename.exe")); - } - - public String getCompanyName() { - return companyName; - } - - public void setCompanyName(String companyName) { - this.companyName = companyName; - } - - public String getCopyright() { - return copyright; - } - - public void setCopyright(String copyright) { - this.copyright = copyright; - } - - public String getFileDescription() { - return fileDescription; - } - - public void setFileDescription(String fileDescription) { - this.fileDescription = fileDescription; - } - - public String getFileVersion() { - return fileVersion; - } - - public void setFileVersion(String fileVersion) { - this.fileVersion = fileVersion; - } - - public String getInternalName() { - return internalName; - } - - public void setInternalName(String internalName) { - this.internalName = internalName; - } - - public String getOriginalFilename() { - return originalFilename; - } - - public void setOriginalFilename(String originalFilename) { - this.originalFilename = originalFilename; - } - - public String getProductName() { - return productName; - } - - public void setProductName(String productName) { - this.productName = productName; - } - - public String getProductVersion() { - return productVersion; - } - - public void setProductVersion(String productVersion) { - this.productVersion = productVersion; - } - - public String getTxtFileVersion() { - return txtFileVersion; - } - - public void setTxtFileVersion(String txtFileVersion) { - this.txtFileVersion = txtFileVersion; - } - - public String getTxtProductVersion() { - return txtProductVersion; - } - - public void setTxtProductVersion(String txtProductVersion) { - this.txtProductVersion = txtProductVersion; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 21, 2005 + */ +package net.sf.launch4j.config; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class VersionInfo implements IValidatable { + public static final String VERSION_PATTERN = "(\\d+\\.){3}\\d+"; + + private String fileVersion; + private String txtFileVersion; + private String fileDescription; + private String copyright; + private String productVersion; + private String txtProductVersion; + private String productName; + private String companyName; + private String internalName; + private String originalFilename; + + public void checkInvariants() { + Validator.checkString(fileVersion, 20, VERSION_PATTERN, + "versionInfo.fileVersion", + Messages.getString("VersionInfo.file.version")); + Validator.checkString(txtFileVersion, 50, "versionInfo.txtFileVersion", + Messages.getString("VersionInfo.txt.file.version")); + Validator.checkString(fileDescription, 150, "versionInfo.fileDescription", + Messages.getString("VersionInfo.file.description")); + Validator.checkString(copyright, 150, "versionInfo.copyright", + Messages.getString("VersionInfo.copyright")); + Validator.checkString(productVersion, 20, VERSION_PATTERN, + "versionInfo.productVersion", + Messages.getString("VersionInfo.product.version")); + Validator.checkString(txtProductVersion, 50, "versionInfo.txtProductVersion", + Messages.getString("VersionInfo.txt.product.version")); + Validator.checkString(productName, 150, "versionInfo.productName", + Messages.getString("VersionInfo.product.name")); + Validator.checkOptString(companyName, 150, "versionInfo.companyName", + Messages.getString("VersionInfo.company.name")); + Validator.checkString(internalName, 50, "versionInfo.internalName", + Messages.getString("VersionInfo.internal.name")); + Validator.checkTrue(!internalName.endsWith(".exe"), "versionInfo.internalName", + Messages.getString("VersionInfo.internal.name.not.exe")); + Validator.checkString(originalFilename, 50, "versionInfo.originalFilename", + Messages.getString("VersionInfo.original.filename")); + Validator.checkTrue(originalFilename.endsWith(".exe"), + "versionInfo.originalFilename", + Messages.getString("VersionInfo.original.filename.exe")); + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCopyright() { + return copyright; + } + + public void setCopyright(String copyright) { + this.copyright = copyright; + } + + public String getFileDescription() { + return fileDescription; + } + + public void setFileDescription(String fileDescription) { + this.fileDescription = fileDescription; + } + + public String getFileVersion() { + return fileVersion; + } + + public void setFileVersion(String fileVersion) { + this.fileVersion = fileVersion; + } + + public String getInternalName() { + return internalName; + } + + public void setInternalName(String internalName) { + this.internalName = internalName; + } + + public String getOriginalFilename() { + return originalFilename; + } + + public void setOriginalFilename(String originalFilename) { + this.originalFilename = originalFilename; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getProductVersion() { + return productVersion; + } + + public void setProductVersion(String productVersion) { + this.productVersion = productVersion; + } + + public String getTxtFileVersion() { + return txtFileVersion; + } + + public void setTxtFileVersion(String txtFileVersion) { + this.txtFileVersion = txtFileVersion; + } + + public String getTxtProductVersion() { + return txtProductVersion; + } + + public void setTxtProductVersion(String txtProductVersion) { + this.txtProductVersion = txtProductVersion; + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages.properties old mode 100755 new mode 100644 index 5753663f48a..f546f55e703 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages.properties @@ -1,93 +1,93 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -Splash.splash.file=Splash file -Splash.splash.timeout=Splash timeout - -Config.specify.output.exe=Specify output file with .exe extension. -Config.application.jar=Application jar -Config.application.jar.path=Specify runtime path of the jar relative to the executable. -Config.chdir.relative='chdir' must be a path relative to the executable. -Config.chdir.path='chdir' is now a path instead of a boolean, please check the docs. -Config.manifest=Manifest -Config.icon=Icon -Config.jar.arguments=Jar arguments -Config.error.title=Error title -Config.download.url=Download URL -Config.support.url=Support URL -Config.header.type=Header type -Config.splash.not.impl.by.console.hdr=Splash screen is not implemented by console header. -Config.variables=Environment variables -Config.variables.err=Environment variable assignment should have the form varname=[value][%varref%]... -Config.priority=Process priority - -ClassPath.mainClass=Main class -ClassPath.or.jar=Specify runtime path of a jar or the classpath. -ClassPath.path=Classpath - -VersionInfo.file.version=File version, should be 'x.x.x.x' -VersionInfo.txt.file.version=Free form file version -VersionInfo.file.description=File description -VersionInfo.copyright=Copyright -VersionInfo.product.version=Product version, should be 'x.x.x.x' -VersionInfo.txt.product.version=Free from product version -VersionInfo.product.name=Product name -VersionInfo.company.name=Company name -VersionInfo.internal.name=Internal name -VersionInfo.internal.name.not.exe=Internal name shouldn't have the .exe extension. -VersionInfo.original.filename=Original filename -VersionInfo.original.filename.exe=Original filename should end with the .exe extension. - -Jre.min.version=Minimum JRE version should be x.x.x[_xx] -Jre.max.version=Maximum JRE version should be x.x.x[_xx] -Jre.specify.jre.min.version.or.path=Specify minimum JRE version and/or bundled JRE path. -Jre.bundled.path=Bundled JRE path -Jre.specify.min.version=Specify minimum JRE version. -Jre.max.greater.than.min=Maximum JRE version must be greater than the minimum.\nTo use a certain JRE version, you may set the min/max range to [1.4.2 - 1.4.2_10] for example. -Jre.initial.and.max.heap=If you change the initial heap size please also specify the maximum size. -Jre.initial.heap=Initial heap size must be greater than 0, leave the field blank to use the JVM default. -Jre.max.heap=Maximum heap size cannot be less than the initial size, leave the field blank to use the JVM default. -Jre.initial.heap.percent=Initial heap % -Jre.max.heap.percent=Maximum heap % -Jre.jdkPreference.invalid=Unrecognised value for JDK preference, should be between 0 and 3 inclusive. -Jre.jvm.options=JVM arguments -Jre.jvm.options.unclosed.quotation=JVM arguments contain an unclosed quotation. -Jre.jvm.options.variable=Invalid environment variable reference. - -Msg.startupErr=Startup error message -Msg.bundledJreErr=Bundled JRE error message -Msg.jreVersionErr=JRE version error message -Msg.launcherErr=Launcher error message - -SingleInstance.mutexName=Mutex name -SingleInstance.windowTitle=Window title +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +Splash.splash.file=Splash file +Splash.splash.timeout=Splash timeout + +Config.specify.output.exe=Specify output file with .exe extension. +Config.application.jar=Application jar +Config.application.jar.path=Specify runtime path of the jar relative to the executable. +Config.chdir.relative='chdir' must be a path relative to the executable. +Config.chdir.path='chdir' is now a path instead of a boolean, please check the docs. +Config.manifest=Manifest +Config.icon=Icon +Config.jar.arguments=Jar arguments +Config.error.title=Error title +Config.download.url=Download URL +Config.support.url=Support URL +Config.header.type=Header type +Config.splash.not.impl.by.console.hdr=Splash screen is not implemented by console header. +Config.variables=Environment variables +Config.variables.err=Environment variable assignment should have the form varname=[value][%varref%]... +Config.priority=Process priority + +ClassPath.mainClass=Main class +ClassPath.or.jar=Specify runtime path of a jar or the classpath. +ClassPath.path=Classpath + +VersionInfo.file.version=File version, should be 'x.x.x.x' +VersionInfo.txt.file.version=Free form file version +VersionInfo.file.description=File description +VersionInfo.copyright=Copyright +VersionInfo.product.version=Product version, should be 'x.x.x.x' +VersionInfo.txt.product.version=Free from product version +VersionInfo.product.name=Product name +VersionInfo.company.name=Company name +VersionInfo.internal.name=Internal name +VersionInfo.internal.name.not.exe=Internal name shouldn't have the .exe extension. +VersionInfo.original.filename=Original filename +VersionInfo.original.filename.exe=Original filename should end with the .exe extension. + +Jre.min.version=Minimum JRE version should be x.x.x[_xx] +Jre.max.version=Maximum JRE version should be x.x.x[_xx] +Jre.specify.jre.min.version.or.path=Specify minimum JRE version and/or bundled JRE path. +Jre.bundled.path=Bundled JRE path +Jre.specify.min.version=Specify minimum JRE version. +Jre.max.greater.than.min=Maximum JRE version must be greater than the minimum.\nTo use a certain JRE version, you may set the min/max range to [1.4.2 - 1.4.2_10] for example. +Jre.initial.and.max.heap=If you change the initial heap size please also specify the maximum size. +Jre.initial.heap=Initial heap size must be greater than 0, leave the field blank to use the JVM default. +Jre.max.heap=Maximum heap size cannot be less than the initial size, leave the field blank to use the JVM default. +Jre.initial.heap.percent=Initial heap % +Jre.max.heap.percent=Maximum heap % +Jre.jdkPreference.invalid=Unrecognised value for JDK preference, should be between 0 and 3 inclusive. +Jre.jvm.options=JVM arguments +Jre.jvm.options.unclosed.quotation=JVM arguments contain an unclosed quotation. +Jre.jvm.options.variable=Invalid environment variable reference. + +Msg.startupErr=Startup error message +Msg.bundledJreErr=Bundled JRE error message +Msg.jreVersionErr=JRE version error message +Msg.launcherErr=Launcher error message + +SingleInstance.mutexName=Mutex name +SingleInstance.windowTitle=Window title diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages_es.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages_es.properties old mode 100755 new mode 100644 index 5e8659b1fea..b17ff2b4e1e --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages_es.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/config/messages_es.properties @@ -1,75 +1,75 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -Splash.splash.file = Fichero de la pantalla de bienvenida -Splash.splash.timeout = Tiempo de espera de la pantalla de bienvenida - -Config.specify.output.exe = Especifique el fichero de salida con extensi\u00F3n .exe. -Config.application.jar = Aplicaci\u00F3n jar -Config.application.jar.path = Especifique la ruta del jar relativa al ejecutable. -Config.chdir.relative = 'Cambiar al directorio' debe ser una ruta relativa al ejecutable. -Config.chdir.path = 'Cambiar al directorio' ahora es una ruta en lugar de un booleano, por favor consulte la documentaci\u00F3n. -Config.icon = Icono -Config.jar.arguments = Argumentos del jar -Config.error.title = T\u00EDtulo de error -Config.header.type = Tipo de cabecera -Config.splash.not.impl.by.console.hdr = La pantalla de bienvenida no est\u00E1 implementada para la cabecera de tipo consola. - -VersionInfo.file.version = La versi\u00F3n del fichero, deber\u00EDa ser 'x.x.x.x' -VersionInfo.txt.file.version = Forma libre de versi\u00F3n del fichero -VersionInfo.file.description = Descripci\u00F3n del fichero -VersionInfo.copyright = Copyright -VersionInfo.product.version = Versi\u00F3n del producto, deber\u00EDa ser 'x.x.x.x' -VersionInfo.txt.product.version = Forma libre de versi\u00F3n del producto -VersionInfo.product.name = Nombre del producto -VersionInfo.company.name = Nombre de la organizaci\u00F3n -VersionInfo.internal.name = Nombre interno -VersionInfo.internal.name.not.exe = El nombre interno no deber\u00EDa tener extensi\u00F3n .exe. -VersionInfo.original.filename = Nombre original del fichero -VersionInfo.original.filename.exe = El nombre original del fichero debe acabar con extensi\u00F3n .exe. -Jre.min.version = La versi\u00F3n m\u00EDnima del JRE deber\u00EDa ser x.x.x[_xx] -Jre.max.version = La versi\u00F3n m\u00E1xima del JRE deber\u00EDa ser x.x.x[_xx] -Jre.specify.jre.min.version.or.path=Specify minimum JRE version and/or bundled JRE path. -Jre.bundled.path.rel = La ruta del JRE debe ser relativa al ejecutable. -Jre.specify.min.version = Especifique la versi\u00F3n m\u00EDnima del JRE. -Jre.max.greater.than.min = La versi\u00F3n m\u00E1xima del JRE debe ser mayor que la m\u00EDnima.\nPara usar cierta versi\u00F3n del JRE, puede esyablecer el rango m\u00EDnimo/m\u00E1ximo a [1.4.2 - 1.4.2_10], por ejemplo. -Jre.jvm.options = Argumentos de la JVM - -Msg.startupErr=Startup error message -Msg.bundledJreErr=Bundled JRE error message -Msg.jreVersionErr=JRE version error message -Msg.launcherErr=Launcher error message - -SingleInstance.mutexName=Mutex name -SingleInstance.windowTitle=Window title - +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +Splash.splash.file = Fichero de la pantalla de bienvenida +Splash.splash.timeout = Tiempo de espera de la pantalla de bienvenida + +Config.specify.output.exe = Especifique el fichero de salida con extensi\u00F3n .exe. +Config.application.jar = Aplicaci\u00F3n jar +Config.application.jar.path = Especifique la ruta del jar relativa al ejecutable. +Config.chdir.relative = 'Cambiar al directorio' debe ser una ruta relativa al ejecutable. +Config.chdir.path = 'Cambiar al directorio' ahora es una ruta en lugar de un booleano, por favor consulte la documentaci\u00F3n. +Config.icon = Icono +Config.jar.arguments = Argumentos del jar +Config.error.title = T\u00EDtulo de error +Config.header.type = Tipo de cabecera +Config.splash.not.impl.by.console.hdr = La pantalla de bienvenida no est\u00E1 implementada para la cabecera de tipo consola. + +VersionInfo.file.version = La versi\u00F3n del fichero, deber\u00EDa ser 'x.x.x.x' +VersionInfo.txt.file.version = Forma libre de versi\u00F3n del fichero +VersionInfo.file.description = Descripci\u00F3n del fichero +VersionInfo.copyright = Copyright +VersionInfo.product.version = Versi\u00F3n del producto, deber\u00EDa ser 'x.x.x.x' +VersionInfo.txt.product.version = Forma libre de versi\u00F3n del producto +VersionInfo.product.name = Nombre del producto +VersionInfo.company.name = Nombre de la organizaci\u00F3n +VersionInfo.internal.name = Nombre interno +VersionInfo.internal.name.not.exe = El nombre interno no deber\u00EDa tener extensi\u00F3n .exe. +VersionInfo.original.filename = Nombre original del fichero +VersionInfo.original.filename.exe = El nombre original del fichero debe acabar con extensi\u00F3n .exe. +Jre.min.version = La versi\u00F3n m\u00EDnima del JRE deber\u00EDa ser x.x.x[_xx] +Jre.max.version = La versi\u00F3n m\u00E1xima del JRE deber\u00EDa ser x.x.x[_xx] +Jre.specify.jre.min.version.or.path=Specify minimum JRE version and/or bundled JRE path. +Jre.bundled.path.rel = La ruta del JRE debe ser relativa al ejecutable. +Jre.specify.min.version = Especifique la versi\u00F3n m\u00EDnima del JRE. +Jre.max.greater.than.min = La versi\u00F3n m\u00E1xima del JRE debe ser mayor que la m\u00EDnima.\nPara usar cierta versi\u00F3n del JRE, puede esyablecer el rango m\u00EDnimo/m\u00E1ximo a [1.4.2 - 1.4.2_10], por ejemplo. +Jre.jvm.options = Argumentos de la JVM + +Msg.startupErr=Startup error message +Msg.bundledJreErr=Bundled JRE error message +Msg.jreVersionErr=JRE version error message +Msg.launcherErr=Launcher error message + +SingleInstance.mutexName=Mutex name +SingleInstance.windowTitle=Window title + diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/BasicForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/BasicForm.java old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ClassPathForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ClassPathForm.java old mode 100755 new mode 100644 index 9f4f5247114..f19d08e1c34 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ClassPathForm.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ClassPathForm.java @@ -1,193 +1,193 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; - -public abstract class ClassPathForm extends JPanel -{ - protected final JTextField _classpathField = new JTextField(); - protected final JLabel _classpathFieldLabel = new JLabel(); - protected final JLabel _classpathListLabel = new JLabel(); - protected final JList _classpathList = new JList(); - protected final JLabel _mainclassLabel = new JLabel(); - protected final JTextField _mainclassField = new JTextField(); - protected final JButton _acceptClasspathButton = new JButton(); - protected final JButton _removeClasspathButton = new JButton(); - protected final JButton _importClasspathButton = new JButton(); - protected final JButton _classpathUpButton = new JButton(); - protected final JButton _classpathDownButton = new JButton(); - protected final JCheckBox _classpathCheck = new JCheckBox(); - protected final JButton _newClasspathButton = new JButton(); - - /** - * Default constructor - */ - public ClassPathForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _classpathField.setName("classpathField"); - jpanel1.add(_classpathField,cc.xywh(4,11,7,1)); - - _classpathFieldLabel.setIcon(loadImage("images/asterix.gif")); - _classpathFieldLabel.setName("classpathFieldLabel"); - _classpathFieldLabel.setText(Messages.getString("editClassPath")); - jpanel1.add(_classpathFieldLabel,cc.xy(2,11)); - - _classpathListLabel.setName("classpathListLabel"); - _classpathListLabel.setText(Messages.getString("classPath")); - jpanel1.add(_classpathListLabel,cc.xy(2,6)); - - _classpathList.setName("classpathList"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_classpathList); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xywh(4,6,7,4)); - - _mainclassLabel.setIcon(loadImage("images/asterix.gif")); - _mainclassLabel.setName("mainclassLabel"); - _mainclassLabel.setText(Messages.getString("mainClass")); - jpanel1.add(_mainclassLabel,cc.xy(2,4)); - - _mainclassField.setName("mainclassField"); - jpanel1.add(_mainclassField,cc.xywh(4,4,7,1)); - - _acceptClasspathButton.setActionCommand("Add"); - _acceptClasspathButton.setIcon(loadImage("images/ok16.png")); - _acceptClasspathButton.setName("acceptClasspathButton"); - _acceptClasspathButton.setText(Messages.getString("accept")); - jpanel1.add(_acceptClasspathButton,cc.xy(8,13)); - - _removeClasspathButton.setActionCommand("Remove"); - _removeClasspathButton.setIcon(loadImage("images/cancel16.png")); - _removeClasspathButton.setName("removeClasspathButton"); - _removeClasspathButton.setText(Messages.getString("remove")); - jpanel1.add(_removeClasspathButton,cc.xy(10,13)); - - _importClasspathButton.setIcon(loadImage("images/open16.png")); - _importClasspathButton.setName("importClasspathButton"); - _importClasspathButton.setToolTipText(Messages.getString("importClassPath")); - jpanel1.add(_importClasspathButton,cc.xy(12,4)); - - _classpathUpButton.setIcon(loadImage("images/up16.png")); - _classpathUpButton.setName("classpathUpButton"); - jpanel1.add(_classpathUpButton,cc.xy(12,6)); - - _classpathDownButton.setIcon(loadImage("images/down16.png")); - _classpathDownButton.setName("classpathDownButton"); - jpanel1.add(_classpathDownButton,cc.xy(12,8)); - - _classpathCheck.setActionCommand("Custom classpath"); - _classpathCheck.setName("classpathCheck"); - _classpathCheck.setText(Messages.getString("customClassPath")); - jpanel1.add(_classpathCheck,cc.xy(4,2)); - - _newClasspathButton.setActionCommand("New"); - _newClasspathButton.setIcon(loadImage("images/new16.png")); - _newClasspathButton.setName("newClasspathButton"); - _newClasspathButton.setText(Messages.getString("new")); - jpanel1.add(_newClasspathButton,cc.xy(6,13)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; + +public abstract class ClassPathForm extends JPanel +{ + protected final JTextField _classpathField = new JTextField(); + protected final JLabel _classpathFieldLabel = new JLabel(); + protected final JLabel _classpathListLabel = new JLabel(); + protected final JList _classpathList = new JList(); + protected final JLabel _mainclassLabel = new JLabel(); + protected final JTextField _mainclassField = new JTextField(); + protected final JButton _acceptClasspathButton = new JButton(); + protected final JButton _removeClasspathButton = new JButton(); + protected final JButton _importClasspathButton = new JButton(); + protected final JButton _classpathUpButton = new JButton(); + protected final JButton _classpathDownButton = new JButton(); + protected final JCheckBox _classpathCheck = new JCheckBox(); + protected final JButton _newClasspathButton = new JButton(); + + /** + * Default constructor + */ + public ClassPathForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _classpathField.setName("classpathField"); + jpanel1.add(_classpathField,cc.xywh(4,11,7,1)); + + _classpathFieldLabel.setIcon(loadImage("images/asterix.gif")); + _classpathFieldLabel.setName("classpathFieldLabel"); + _classpathFieldLabel.setText(Messages.getString("editClassPath")); + jpanel1.add(_classpathFieldLabel,cc.xy(2,11)); + + _classpathListLabel.setName("classpathListLabel"); + _classpathListLabel.setText(Messages.getString("classPath")); + jpanel1.add(_classpathListLabel,cc.xy(2,6)); + + _classpathList.setName("classpathList"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_classpathList); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xywh(4,6,7,4)); + + _mainclassLabel.setIcon(loadImage("images/asterix.gif")); + _mainclassLabel.setName("mainclassLabel"); + _mainclassLabel.setText(Messages.getString("mainClass")); + jpanel1.add(_mainclassLabel,cc.xy(2,4)); + + _mainclassField.setName("mainclassField"); + jpanel1.add(_mainclassField,cc.xywh(4,4,7,1)); + + _acceptClasspathButton.setActionCommand("Add"); + _acceptClasspathButton.setIcon(loadImage("images/ok16.png")); + _acceptClasspathButton.setName("acceptClasspathButton"); + _acceptClasspathButton.setText(Messages.getString("accept")); + jpanel1.add(_acceptClasspathButton,cc.xy(8,13)); + + _removeClasspathButton.setActionCommand("Remove"); + _removeClasspathButton.setIcon(loadImage("images/cancel16.png")); + _removeClasspathButton.setName("removeClasspathButton"); + _removeClasspathButton.setText(Messages.getString("remove")); + jpanel1.add(_removeClasspathButton,cc.xy(10,13)); + + _importClasspathButton.setIcon(loadImage("images/open16.png")); + _importClasspathButton.setName("importClasspathButton"); + _importClasspathButton.setToolTipText(Messages.getString("importClassPath")); + jpanel1.add(_importClasspathButton,cc.xy(12,4)); + + _classpathUpButton.setIcon(loadImage("images/up16.png")); + _classpathUpButton.setName("classpathUpButton"); + jpanel1.add(_classpathUpButton,cc.xy(12,6)); + + _classpathDownButton.setIcon(loadImage("images/down16.png")); + _classpathDownButton.setName("classpathDownButton"); + jpanel1.add(_classpathDownButton,cc.xy(12,8)); + + _classpathCheck.setActionCommand("Custom classpath"); + _classpathCheck.setName("classpathCheck"); + _classpathCheck.setText(Messages.getString("customClassPath")); + jpanel1.add(_classpathCheck,cc.xy(4,2)); + + _newClasspathButton.setActionCommand("New"); + _newClasspathButton.setIcon(loadImage("images/new16.png")); + _newClasspathButton.setName("newClasspathButton"); + _newClasspathButton.setText(Messages.getString("new")); + jpanel1.add(_newClasspathButton,cc.xy(6,13)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ConfigForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ConfigForm.java old mode 100755 new mode 100644 index b3c6fffed31..dcb6c8535cb --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ConfigForm.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/ConfigForm.java @@ -1,132 +1,132 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextArea; - -public abstract class ConfigForm extends JPanel -{ - protected final JTextArea _logTextArea = new JTextArea(); - protected final TitledSeparator _logSeparator = new TitledSeparator(); - protected final JTabbedPane _tab = new JTabbedPane(); - - /** - * Default constructor - */ - public ConfigForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:3DLU:NONE,FILL:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _logTextArea.setName("logTextArea"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_logTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xy(2,6)); - - _logSeparator.setName("logSeparator"); - _logSeparator.setText(Messages.getString("log")); - jpanel1.add(_logSeparator,cc.xy(2,4)); - - _tab.setName("tab"); - jpanel1.add(_tab,cc.xywh(1,2,3,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,3,4,5,6,7 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; + +public abstract class ConfigForm extends JPanel +{ + protected final JTextArea _logTextArea = new JTextArea(); + protected final TitledSeparator _logSeparator = new TitledSeparator(); + protected final JTabbedPane _tab = new JTabbedPane(); + + /** + * Default constructor + */ + public ConfigForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:3DLU:NONE,FILL:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _logTextArea.setName("logTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_logTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xy(2,6)); + + _logSeparator.setName("logSeparator"); + _logSeparator.setText(Messages.getString("log")); + jpanel1.add(_logSeparator,cc.xy(2,4)); + + _tab.setName("tab"); + jpanel1.add(_tab,cc.xywh(1,2,3,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,3,4,5,6,7 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java old mode 100755 new mode 100644 index f2b79e6e791..17e99fbf4a0 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java @@ -1,127 +1,127 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -public abstract class EnvironmentVarsForm extends JPanel -{ - protected final JTextArea _envVarsTextArea = new JTextArea(); - protected final JLabel _envVarsLabel = new JLabel(); - - /** - * Default constructor - */ - public EnvironmentVarsForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _envVarsTextArea.setName("envVarsTextArea"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_envVarsTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xy(4,2)); - - _envVarsLabel.setName("envVarsLabel"); - _envVarsLabel.setText(Messages.getString("setVariables")); - jpanel1.add(_envVarsLabel,new CellConstraints(2,2,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +public abstract class EnvironmentVarsForm extends JPanel +{ + protected final JTextArea _envVarsTextArea = new JTextArea(); + protected final JLabel _envVarsLabel = new JLabel(); + + /** + * Default constructor + */ + public EnvironmentVarsForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _envVarsTextArea.setName("envVarsTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_envVarsTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xy(4,2)); + + _envVarsLabel.setName("envVarsLabel"); + _envVarsLabel.setText(Messages.getString("setVariables")); + jpanel1.add(_envVarsLabel,new CellConstraints(2,2,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/HeaderForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/HeaderForm.java old mode 100755 new mode 100644 index 91c40024ab9..ef5dac41533 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/HeaderForm.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/HeaderForm.java @@ -1,171 +1,171 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -public abstract class HeaderForm extends JPanel -{ - protected final JLabel _headerTypeLabel = new JLabel(); - protected final JRadioButton _guiHeaderRadio = new JRadioButton(); - protected final ButtonGroup _headerButtonGroup = new ButtonGroup(); - protected final JRadioButton _consoleHeaderRadio = new JRadioButton(); - protected final JTextArea _headerObjectsTextArea = new JTextArea(); - protected final JTextArea _libsTextArea = new JTextArea(); - protected final JCheckBox _headerObjectsCheck = new JCheckBox(); - protected final JCheckBox _libsCheck = new JCheckBox(); - protected final TitledSeparator _linkerOptionsSeparator = new TitledSeparator(); - - /** - * Default constructor - */ - public HeaderForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(0.2),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _headerTypeLabel.setName("headerTypeLabel"); - _headerTypeLabel.setText(Messages.getString("headerType")); - jpanel1.add(_headerTypeLabel,cc.xy(2,2)); - - _guiHeaderRadio.setActionCommand("GUI"); - _guiHeaderRadio.setName("guiHeaderRadio"); - _guiHeaderRadio.setText(Messages.getString("gui")); - _headerButtonGroup.add(_guiHeaderRadio); - jpanel1.add(_guiHeaderRadio,cc.xy(4,2)); - - _consoleHeaderRadio.setActionCommand("Console"); - _consoleHeaderRadio.setName("consoleHeaderRadio"); - _consoleHeaderRadio.setText(Messages.getString("console")); - _headerButtonGroup.add(_consoleHeaderRadio); - jpanel1.add(_consoleHeaderRadio,cc.xy(6,2)); - - _headerObjectsTextArea.setName("headerObjectsTextArea"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_headerObjectsTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xywh(4,6,4,1)); - - _libsTextArea.setName("libsTextArea"); - JScrollPane jscrollpane2 = new JScrollPane(); - jscrollpane2.setViewportView(_libsTextArea); - jscrollpane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane2,cc.xywh(4,8,4,1)); - - _headerObjectsCheck.setActionCommand("Object files"); - _headerObjectsCheck.setName("headerObjectsCheck"); - _headerObjectsCheck.setText(Messages.getString("objectFiles")); - jpanel1.add(_headerObjectsCheck,new CellConstraints(2,6,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - _libsCheck.setActionCommand("w32api"); - _libsCheck.setName("libsCheck"); - _libsCheck.setText(Messages.getString("libs")); - jpanel1.add(_libsCheck,new CellConstraints(2,8,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - _linkerOptionsSeparator.setName("linkerOptionsSeparator"); - _linkerOptionsSeparator.setText(Messages.getString("linkerOptions")); - jpanel1.add(_linkerOptionsSeparator,cc.xywh(2,4,6,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ButtonGroup; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +public abstract class HeaderForm extends JPanel +{ + protected final JLabel _headerTypeLabel = new JLabel(); + protected final JRadioButton _guiHeaderRadio = new JRadioButton(); + protected final ButtonGroup _headerButtonGroup = new ButtonGroup(); + protected final JRadioButton _consoleHeaderRadio = new JRadioButton(); + protected final JTextArea _headerObjectsTextArea = new JTextArea(); + protected final JTextArea _libsTextArea = new JTextArea(); + protected final JCheckBox _headerObjectsCheck = new JCheckBox(); + protected final JCheckBox _libsCheck = new JCheckBox(); + protected final TitledSeparator _linkerOptionsSeparator = new TitledSeparator(); + + /** + * Default constructor + */ + public HeaderForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(0.2),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _headerTypeLabel.setName("headerTypeLabel"); + _headerTypeLabel.setText(Messages.getString("headerType")); + jpanel1.add(_headerTypeLabel,cc.xy(2,2)); + + _guiHeaderRadio.setActionCommand("GUI"); + _guiHeaderRadio.setName("guiHeaderRadio"); + _guiHeaderRadio.setText(Messages.getString("gui")); + _headerButtonGroup.add(_guiHeaderRadio); + jpanel1.add(_guiHeaderRadio,cc.xy(4,2)); + + _consoleHeaderRadio.setActionCommand("Console"); + _consoleHeaderRadio.setName("consoleHeaderRadio"); + _consoleHeaderRadio.setText(Messages.getString("console")); + _headerButtonGroup.add(_consoleHeaderRadio); + jpanel1.add(_consoleHeaderRadio,cc.xy(6,2)); + + _headerObjectsTextArea.setName("headerObjectsTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_headerObjectsTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xywh(4,6,4,1)); + + _libsTextArea.setName("libsTextArea"); + JScrollPane jscrollpane2 = new JScrollPane(); + jscrollpane2.setViewportView(_libsTextArea); + jscrollpane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane2,cc.xywh(4,8,4,1)); + + _headerObjectsCheck.setActionCommand("Object files"); + _headerObjectsCheck.setName("headerObjectsCheck"); + _headerObjectsCheck.setText(Messages.getString("objectFiles")); + jpanel1.add(_headerObjectsCheck,new CellConstraints(2,6,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + _libsCheck.setActionCommand("w32api"); + _libsCheck.setName("libsCheck"); + _libsCheck.setText(Messages.getString("libs")); + jpanel1.add(_libsCheck,new CellConstraints(2,8,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + _linkerOptionsSeparator.setName("linkerOptionsSeparator"); + _linkerOptionsSeparator.setText(Messages.getString("linkerOptions")); + jpanel1.add(_linkerOptionsSeparator,cc.xywh(2,4,6,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/JreForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/JreForm.java old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/Messages.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/Messages.java old mode 100755 new mode 100644 index aaf995f8019..dca5d244295 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/Messages.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/Messages.java @@ -1,55 +1,55 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j.form; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.form.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j.form; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.form.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/MessagesForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/MessagesForm.java old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/SingleInstanceForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/SingleInstanceForm.java old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/SplashForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/SplashForm.java old mode 100755 new mode 100644 index 22a0ed8a3d0..7a3085ae2f3 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/SplashForm.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/SplashForm.java @@ -1,166 +1,166 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -public abstract class SplashForm extends JPanel -{ - protected final JLabel _splashFileLabel = new JLabel(); - protected final JLabel _waitForWindowLabel = new JLabel(); - protected final JLabel _timeoutLabel = new JLabel(); - protected final JCheckBox _timeoutErrCheck = new JCheckBox(); - protected final JTextField _splashFileField = new JTextField(); - protected final JTextField _timeoutField = new JTextField(); - protected final JButton _splashFileButton = new JButton(); - protected final JCheckBox _splashCheck = new JCheckBox(); - protected final JCheckBox _waitForWindowCheck = new JCheckBox(); - - /** - * Default constructor - */ - public SplashForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _splashFileLabel.setIcon(loadImage("images/asterix.gif")); - _splashFileLabel.setName("splashFileLabel"); - _splashFileLabel.setText(Messages.getString("splashFile")); - jpanel1.add(_splashFileLabel,cc.xy(2,4)); - - _waitForWindowLabel.setName("waitForWindowLabel"); - _waitForWindowLabel.setText(Messages.getString("waitForWindow")); - jpanel1.add(_waitForWindowLabel,cc.xy(2,6)); - - _timeoutLabel.setIcon(loadImage("images/asterix.gif")); - _timeoutLabel.setName("timeoutLabel"); - _timeoutLabel.setText(Messages.getString("timeout")); - jpanel1.add(_timeoutLabel,cc.xy(2,8)); - - _timeoutErrCheck.setActionCommand("Signal error on timeout"); - _timeoutErrCheck.setName("timeoutErrCheck"); - _timeoutErrCheck.setText(Messages.getString("timeoutErr")); - _timeoutErrCheck.setToolTipText(Messages.getString("timeoutErrTip")); - jpanel1.add(_timeoutErrCheck,cc.xywh(4,10,2,1)); - - _splashFileField.setName("splashFileField"); - _splashFileField.setToolTipText(Messages.getString("splashFileTip")); - jpanel1.add(_splashFileField,cc.xywh(4,4,2,1)); - - _timeoutField.setName("timeoutField"); - _timeoutField.setToolTipText(Messages.getString("timeoutTip")); - jpanel1.add(_timeoutField,cc.xy(4,8)); - - _splashFileButton.setIcon(loadImage("images/open16.png")); - _splashFileButton.setName("splashFileButton"); - jpanel1.add(_splashFileButton,cc.xy(7,4)); - - _splashCheck.setActionCommand("Enable splash screen"); - _splashCheck.setName("splashCheck"); - _splashCheck.setText(Messages.getString("enableSplash")); - jpanel1.add(_splashCheck,cc.xywh(4,2,2,1)); - - _waitForWindowCheck.setActionCommand("Close splash screen when an application window appears"); - _waitForWindowCheck.setName("waitForWindowCheck"); - _waitForWindowCheck.setText(Messages.getString("waitForWindowText")); - jpanel1.add(_waitForWindowCheck,cc.xywh(4,6,2,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +public abstract class SplashForm extends JPanel +{ + protected final JLabel _splashFileLabel = new JLabel(); + protected final JLabel _waitForWindowLabel = new JLabel(); + protected final JLabel _timeoutLabel = new JLabel(); + protected final JCheckBox _timeoutErrCheck = new JCheckBox(); + protected final JTextField _splashFileField = new JTextField(); + protected final JTextField _timeoutField = new JTextField(); + protected final JButton _splashFileButton = new JButton(); + protected final JCheckBox _splashCheck = new JCheckBox(); + protected final JCheckBox _waitForWindowCheck = new JCheckBox(); + + /** + * Default constructor + */ + public SplashForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _splashFileLabel.setIcon(loadImage("images/asterix.gif")); + _splashFileLabel.setName("splashFileLabel"); + _splashFileLabel.setText(Messages.getString("splashFile")); + jpanel1.add(_splashFileLabel,cc.xy(2,4)); + + _waitForWindowLabel.setName("waitForWindowLabel"); + _waitForWindowLabel.setText(Messages.getString("waitForWindow")); + jpanel1.add(_waitForWindowLabel,cc.xy(2,6)); + + _timeoutLabel.setIcon(loadImage("images/asterix.gif")); + _timeoutLabel.setName("timeoutLabel"); + _timeoutLabel.setText(Messages.getString("timeout")); + jpanel1.add(_timeoutLabel,cc.xy(2,8)); + + _timeoutErrCheck.setActionCommand("Signal error on timeout"); + _timeoutErrCheck.setName("timeoutErrCheck"); + _timeoutErrCheck.setText(Messages.getString("timeoutErr")); + _timeoutErrCheck.setToolTipText(Messages.getString("timeoutErrTip")); + jpanel1.add(_timeoutErrCheck,cc.xywh(4,10,2,1)); + + _splashFileField.setName("splashFileField"); + _splashFileField.setToolTipText(Messages.getString("splashFileTip")); + jpanel1.add(_splashFileField,cc.xywh(4,4,2,1)); + + _timeoutField.setName("timeoutField"); + _timeoutField.setToolTipText(Messages.getString("timeoutTip")); + jpanel1.add(_timeoutField,cc.xy(4,8)); + + _splashFileButton.setIcon(loadImage("images/open16.png")); + _splashFileButton.setName("splashFileButton"); + jpanel1.add(_splashFileButton,cc.xy(7,4)); + + _splashCheck.setActionCommand("Enable splash screen"); + _splashCheck.setName("splashCheck"); + _splashCheck.setText(Messages.getString("enableSplash")); + jpanel1.add(_splashCheck,cc.xywh(4,2,2,1)); + + _waitForWindowCheck.setActionCommand("Close splash screen when an application window appears"); + _waitForWindowCheck.setName("waitForWindowCheck"); + _waitForWindowCheck.setText(Messages.getString("waitForWindowText")); + jpanel1.add(_waitForWindowCheck,cc.xywh(4,6,2,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java old mode 100755 new mode 100644 index 5a4d9440c60..f1f3c7e433e --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java @@ -1,232 +1,232 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -public abstract class VersionInfoForm extends JPanel -{ - protected final JCheckBox _versionInfoCheck = new JCheckBox(); - protected final JLabel _fileVersionLabel = new JLabel(); - protected final JTextField _fileVersionField = new JTextField(); - protected final TitledSeparator _addVersionInfoSeparator = new TitledSeparator(); - protected final JLabel _productVersionLabel = new JLabel(); - protected final JTextField _productVersionField = new JTextField(); - protected final JLabel _fileDescriptionLabel = new JLabel(); - protected final JTextField _fileDescriptionField = new JTextField(); - protected final JLabel _copyrightLabel = new JLabel(); - protected final JTextField _copyrightField = new JTextField(); - protected final JLabel _txtFileVersionLabel = new JLabel(); - protected final JTextField _txtFileVersionField = new JTextField(); - protected final JLabel _txtProductVersionLabel = new JLabel(); - protected final JTextField _txtProductVersionField = new JTextField(); - protected final JLabel _productNameLabel = new JLabel(); - protected final JTextField _productNameField = new JTextField(); - protected final JLabel _originalFilenameLabel = new JLabel(); - protected final JTextField _originalFilenameField = new JTextField(); - protected final JLabel _internalNameLabel = new JLabel(); - protected final JTextField _internalNameField = new JTextField(); - protected final JLabel _companyNameLabel = new JLabel(); - protected final JTextField _companyNameField = new JTextField(); - - /** - * Default constructor - */ - public VersionInfoForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:7DLU:NONE,RIGHT:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _versionInfoCheck.setActionCommand("Add version information"); - _versionInfoCheck.setName("versionInfoCheck"); - _versionInfoCheck.setText(Messages.getString("addVersionInfo")); - jpanel1.add(_versionInfoCheck,cc.xywh(4,2,5,1)); - - _fileVersionLabel.setIcon(loadImage("images/asterix.gif")); - _fileVersionLabel.setName("fileVersionLabel"); - _fileVersionLabel.setText(Messages.getString("fileVersion")); - jpanel1.add(_fileVersionLabel,cc.xy(2,4)); - - _fileVersionField.setName("fileVersionField"); - _fileVersionField.setToolTipText(Messages.getString("fileVersionTip")); - jpanel1.add(_fileVersionField,cc.xy(4,4)); - - _addVersionInfoSeparator.setName("addVersionInfoSeparator"); - _addVersionInfoSeparator.setText("Additional information"); - jpanel1.add(_addVersionInfoSeparator,cc.xywh(2,10,7,1)); - - _productVersionLabel.setIcon(loadImage("images/asterix.gif")); - _productVersionLabel.setName("productVersionLabel"); - _productVersionLabel.setText(Messages.getString("productVersion")); - jpanel1.add(_productVersionLabel,cc.xy(2,12)); - - _productVersionField.setName("productVersionField"); - _productVersionField.setToolTipText(Messages.getString("productVersionTip")); - jpanel1.add(_productVersionField,cc.xy(4,12)); - - _fileDescriptionLabel.setIcon(loadImage("images/asterix.gif")); - _fileDescriptionLabel.setName("fileDescriptionLabel"); - _fileDescriptionLabel.setText(Messages.getString("fileDescription")); - jpanel1.add(_fileDescriptionLabel,cc.xy(2,6)); - - _fileDescriptionField.setName("fileDescriptionField"); - _fileDescriptionField.setToolTipText(Messages.getString("fileDescriptionTip")); - jpanel1.add(_fileDescriptionField,cc.xywh(4,6,5,1)); - - _copyrightLabel.setIcon(loadImage("images/asterix.gif")); - _copyrightLabel.setName("copyrightLabel"); - _copyrightLabel.setText(Messages.getString("copyright")); - jpanel1.add(_copyrightLabel,cc.xy(2,8)); - - _copyrightField.setName("copyrightField"); - jpanel1.add(_copyrightField,cc.xywh(4,8,5,1)); - - _txtFileVersionLabel.setIcon(loadImage("images/asterix.gif")); - _txtFileVersionLabel.setName("txtFileVersionLabel"); - _txtFileVersionLabel.setText(Messages.getString("txtFileVersion")); - jpanel1.add(_txtFileVersionLabel,cc.xy(6,4)); - - _txtFileVersionField.setName("txtFileVersionField"); - _txtFileVersionField.setToolTipText(Messages.getString("txtFileVersionTip")); - jpanel1.add(_txtFileVersionField,cc.xy(8,4)); - - _txtProductVersionLabel.setIcon(loadImage("images/asterix.gif")); - _txtProductVersionLabel.setName("txtProductVersionLabel"); - _txtProductVersionLabel.setText(Messages.getString("txtProductVersion")); - jpanel1.add(_txtProductVersionLabel,cc.xy(6,12)); - - _txtProductVersionField.setName("txtProductVersionField"); - _txtProductVersionField.setToolTipText(Messages.getString("txtProductVersionTip")); - jpanel1.add(_txtProductVersionField,cc.xy(8,12)); - - _productNameLabel.setIcon(loadImage("images/asterix.gif")); - _productNameLabel.setName("productNameLabel"); - _productNameLabel.setText(Messages.getString("productName")); - jpanel1.add(_productNameLabel,cc.xy(2,14)); - - _productNameField.setName("productNameField"); - jpanel1.add(_productNameField,cc.xywh(4,14,5,1)); - - _originalFilenameLabel.setIcon(loadImage("images/asterix.gif")); - _originalFilenameLabel.setName("originalFilenameLabel"); - _originalFilenameLabel.setText(Messages.getString("originalFilename")); - jpanel1.add(_originalFilenameLabel,cc.xy(2,20)); - - _originalFilenameField.setName("originalFilenameField"); - _originalFilenameField.setToolTipText(Messages.getString("originalFilenameTip")); - jpanel1.add(_originalFilenameField,cc.xywh(4,20,5,1)); - - _internalNameLabel.setIcon(loadImage("images/asterix.gif")); - _internalNameLabel.setName("internalNameLabel"); - _internalNameLabel.setText(Messages.getString("internalName")); - jpanel1.add(_internalNameLabel,cc.xy(2,18)); - - _internalNameField.setName("internalNameField"); - _internalNameField.setToolTipText(Messages.getString("internalNameTip")); - jpanel1.add(_internalNameField,cc.xywh(4,18,5,1)); - - _companyNameLabel.setName("companyNameLabel"); - _companyNameLabel.setText(Messages.getString("companyName")); - jpanel1.add(_companyNameLabel,cc.xy(2,16)); - - _companyNameField.setName("companyNameField"); - jpanel1.add(_companyNameField,cc.xywh(4,16,5,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +public abstract class VersionInfoForm extends JPanel +{ + protected final JCheckBox _versionInfoCheck = new JCheckBox(); + protected final JLabel _fileVersionLabel = new JLabel(); + protected final JTextField _fileVersionField = new JTextField(); + protected final TitledSeparator _addVersionInfoSeparator = new TitledSeparator(); + protected final JLabel _productVersionLabel = new JLabel(); + protected final JTextField _productVersionField = new JTextField(); + protected final JLabel _fileDescriptionLabel = new JLabel(); + protected final JTextField _fileDescriptionField = new JTextField(); + protected final JLabel _copyrightLabel = new JLabel(); + protected final JTextField _copyrightField = new JTextField(); + protected final JLabel _txtFileVersionLabel = new JLabel(); + protected final JTextField _txtFileVersionField = new JTextField(); + protected final JLabel _txtProductVersionLabel = new JLabel(); + protected final JTextField _txtProductVersionField = new JTextField(); + protected final JLabel _productNameLabel = new JLabel(); + protected final JTextField _productNameField = new JTextField(); + protected final JLabel _originalFilenameLabel = new JLabel(); + protected final JTextField _originalFilenameField = new JTextField(); + protected final JLabel _internalNameLabel = new JLabel(); + protected final JTextField _internalNameField = new JTextField(); + protected final JLabel _companyNameLabel = new JLabel(); + protected final JTextField _companyNameField = new JTextField(); + + /** + * Default constructor + */ + public VersionInfoForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:7DLU:NONE,RIGHT:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _versionInfoCheck.setActionCommand("Add version information"); + _versionInfoCheck.setName("versionInfoCheck"); + _versionInfoCheck.setText(Messages.getString("addVersionInfo")); + jpanel1.add(_versionInfoCheck,cc.xywh(4,2,5,1)); + + _fileVersionLabel.setIcon(loadImage("images/asterix.gif")); + _fileVersionLabel.setName("fileVersionLabel"); + _fileVersionLabel.setText(Messages.getString("fileVersion")); + jpanel1.add(_fileVersionLabel,cc.xy(2,4)); + + _fileVersionField.setName("fileVersionField"); + _fileVersionField.setToolTipText(Messages.getString("fileVersionTip")); + jpanel1.add(_fileVersionField,cc.xy(4,4)); + + _addVersionInfoSeparator.setName("addVersionInfoSeparator"); + _addVersionInfoSeparator.setText("Additional information"); + jpanel1.add(_addVersionInfoSeparator,cc.xywh(2,10,7,1)); + + _productVersionLabel.setIcon(loadImage("images/asterix.gif")); + _productVersionLabel.setName("productVersionLabel"); + _productVersionLabel.setText(Messages.getString("productVersion")); + jpanel1.add(_productVersionLabel,cc.xy(2,12)); + + _productVersionField.setName("productVersionField"); + _productVersionField.setToolTipText(Messages.getString("productVersionTip")); + jpanel1.add(_productVersionField,cc.xy(4,12)); + + _fileDescriptionLabel.setIcon(loadImage("images/asterix.gif")); + _fileDescriptionLabel.setName("fileDescriptionLabel"); + _fileDescriptionLabel.setText(Messages.getString("fileDescription")); + jpanel1.add(_fileDescriptionLabel,cc.xy(2,6)); + + _fileDescriptionField.setName("fileDescriptionField"); + _fileDescriptionField.setToolTipText(Messages.getString("fileDescriptionTip")); + jpanel1.add(_fileDescriptionField,cc.xywh(4,6,5,1)); + + _copyrightLabel.setIcon(loadImage("images/asterix.gif")); + _copyrightLabel.setName("copyrightLabel"); + _copyrightLabel.setText(Messages.getString("copyright")); + jpanel1.add(_copyrightLabel,cc.xy(2,8)); + + _copyrightField.setName("copyrightField"); + jpanel1.add(_copyrightField,cc.xywh(4,8,5,1)); + + _txtFileVersionLabel.setIcon(loadImage("images/asterix.gif")); + _txtFileVersionLabel.setName("txtFileVersionLabel"); + _txtFileVersionLabel.setText(Messages.getString("txtFileVersion")); + jpanel1.add(_txtFileVersionLabel,cc.xy(6,4)); + + _txtFileVersionField.setName("txtFileVersionField"); + _txtFileVersionField.setToolTipText(Messages.getString("txtFileVersionTip")); + jpanel1.add(_txtFileVersionField,cc.xy(8,4)); + + _txtProductVersionLabel.setIcon(loadImage("images/asterix.gif")); + _txtProductVersionLabel.setName("txtProductVersionLabel"); + _txtProductVersionLabel.setText(Messages.getString("txtProductVersion")); + jpanel1.add(_txtProductVersionLabel,cc.xy(6,12)); + + _txtProductVersionField.setName("txtProductVersionField"); + _txtProductVersionField.setToolTipText(Messages.getString("txtProductVersionTip")); + jpanel1.add(_txtProductVersionField,cc.xy(8,12)); + + _productNameLabel.setIcon(loadImage("images/asterix.gif")); + _productNameLabel.setName("productNameLabel"); + _productNameLabel.setText(Messages.getString("productName")); + jpanel1.add(_productNameLabel,cc.xy(2,14)); + + _productNameField.setName("productNameField"); + jpanel1.add(_productNameField,cc.xywh(4,14,5,1)); + + _originalFilenameLabel.setIcon(loadImage("images/asterix.gif")); + _originalFilenameLabel.setName("originalFilenameLabel"); + _originalFilenameLabel.setText(Messages.getString("originalFilename")); + jpanel1.add(_originalFilenameLabel,cc.xy(2,20)); + + _originalFilenameField.setName("originalFilenameField"); + _originalFilenameField.setToolTipText(Messages.getString("originalFilenameTip")); + jpanel1.add(_originalFilenameField,cc.xywh(4,20,5,1)); + + _internalNameLabel.setIcon(loadImage("images/asterix.gif")); + _internalNameLabel.setName("internalNameLabel"); + _internalNameLabel.setText(Messages.getString("internalName")); + jpanel1.add(_internalNameLabel,cc.xy(2,18)); + + _internalNameField.setName("internalNameField"); + _internalNameField.setToolTipText(Messages.getString("internalNameTip")); + jpanel1.add(_internalNameField,cc.xywh(4,18,5,1)); + + _companyNameLabel.setName("companyNameLabel"); + _companyNameLabel.setText(Messages.getString("companyName")); + jpanel1.add(_companyNameLabel,cc.xy(2,16)); + + _companyNameField.setName("companyNameField"); + jpanel1.add(_companyNameField,cc.xywh(4,16,5,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages.properties old mode 100755 new mode 100644 index 1be6c9584f5..2d3cbd90324 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages.properties @@ -1,146 +1,146 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -log=Log - -outfile=Output file: -outfileTip=Output executable file. -customProcName=Custom process name and XP style manifest -stayAlive=Stay alive after launching a GUI application -manifest=Manifest: -manifestTip=Wrapper's manifest for User Account Control, will not enable XP styles! -icon=Icon: -iconTip=Application icon. -jar=Jar: -jarTip=Application jar. -dontWrapJar=Dont't wrap the jar, launch only -cmdLine=Command line args: -cmdLineTip=Constant command line arguments passed to the application. -options=Options: -chdir=Change dir: -chdirTip=Change current directory to a location relative to the executable. Empty field has no effect, . - changes directory to the exe location. -priority=Process priority: -normalPriority=Normal -idlePriority=Idle -highPriority=High -downloadAndSupport=Java download and support -errorTitle=Error title: -errorTitleTip=Launch4j signals errors using a message box, you can set it's title to the application's name. -downloadUrl=Java download URL: -supportUrl=Support URL: - -new=New -accept=Accept -remove=Remove -customClassPath=Custom classpath -classPath=Classpath: -mainClass=Main class: -editClassPath=Edit item: -importClassPath=Import attributes from a jar's manifest. - -headerType=Header type: -gui=GUI -console=Console -objectFiles=Object files: -libs=w32api: -linkerOptions=Custom header - linker options - -enableSingleInstance=Allow only a single instance of the application -mutexName=Mutex name -mutexNameTip=Mutex name that will uniquely identify your application. -windowTitle=Window title -windowTitleTip=Title of the GUI application window to bring up on attempt to start a next instance. - -jrePath=Bundled JRE path: -jrePathTip=Bundled JRE path relative to the executable or absolute. -jreMin=Min JRE version: -jreMax=Max JRE version: -dontUsePrivateJres=Don't use private JREs -jvmOptions=JVM options: -jvmOptionsTip=Accepts everything you would normally pass to java/javaw launcher: assertion options, system properties and X options. -initialHeapSize=Initial heap size: -maxHeapSize=Max heap size: -freeMemory=% of free memory -jdkPreference=JDK/JRE preference: -addVariables=Add variables: -addVariablesTip=Add special variable or map environment variables to system properties. -exeDirVarTip=Executable's runtime directory path. -exeFileVarTip=Executable's runtime file path (directory and filename). -varsAndRegistry=Variables / registry: -envVar=Environment var: -property=Property -propertyTip=Map a variable to a system property. -option=Option -optionTip=Pass a JVM option using a variable. - -setVariables=Set variables: - -enableSplash=Enable splash screen -splashFile=Splash file: -splashFileTip=Splash screen file in BMP format. -waitForWindow=Wait for window -waitForWindowText=Close splash screen when an application window appears -timeout=Timeout [s]: -timeoutTip=Number of seconds after which the splash screen must close. Splash timeout may cause an error depending on splashTimeoutErr property. -timeoutErr=Signal error on timeout -timeoutErrTip=True signals an error on splash timeout, false closes the splash screen quietly. - -version=Version -additionalInfo=Additional information -addVersionInfo=Add version information -fileVersion=File version: -fileVersionTip=Version number 'x.x.x.x' -productVersion=Product version: -productVersionTip=Version number 'x.x.x.x' -fileDescription=File description: -fileDescriptionTip=File description presented to the user. -copyright=Copyright: -txtFileVersion=Free form: -txtFileVersionTip=Free form file version, for example '1.20.RC1'. -txtProductVersion=Free form: -txtProductVersionTip=Free form product version, for example '1.20.RC1'. -productName=Product name: -originalFilename=Original filename: -originalFilenameTip=Original name of the file without the path. Allows to determine whether a file has been renamed by a user. -internalName=Internal name: -internalNameTip=Internal name without extension, original filename or module name for example. -companyName=Company name: - -addMessages=Add custom messages -startupErr=Startup error: -bundledJreErr=Bundled JRE error: -jreVersionErr=JRE version error: -jreVersionErrTip=Launch4j will append the required version number at the end of this message. -launcherErr=Launcher error: -instanceAlreadyExistsMsg=Inst. already exists: -instanceAlreadyExistsMsgTip=Message displayed by single instance console applications if an instance already exists. +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +log=Log + +outfile=Output file: +outfileTip=Output executable file. +customProcName=Custom process name and XP style manifest +stayAlive=Stay alive after launching a GUI application +manifest=Manifest: +manifestTip=Wrapper's manifest for User Account Control, will not enable XP styles! +icon=Icon: +iconTip=Application icon. +jar=Jar: +jarTip=Application jar. +dontWrapJar=Dont't wrap the jar, launch only +cmdLine=Command line args: +cmdLineTip=Constant command line arguments passed to the application. +options=Options: +chdir=Change dir: +chdirTip=Change current directory to a location relative to the executable. Empty field has no effect, . - changes directory to the exe location. +priority=Process priority: +normalPriority=Normal +idlePriority=Idle +highPriority=High +downloadAndSupport=Java download and support +errorTitle=Error title: +errorTitleTip=Launch4j signals errors using a message box, you can set it's title to the application's name. +downloadUrl=Java download URL: +supportUrl=Support URL: + +new=New +accept=Accept +remove=Remove +customClassPath=Custom classpath +classPath=Classpath: +mainClass=Main class: +editClassPath=Edit item: +importClassPath=Import attributes from a jar's manifest. + +headerType=Header type: +gui=GUI +console=Console +objectFiles=Object files: +libs=w32api: +linkerOptions=Custom header - linker options + +enableSingleInstance=Allow only a single instance of the application +mutexName=Mutex name +mutexNameTip=Mutex name that will uniquely identify your application. +windowTitle=Window title +windowTitleTip=Title of the GUI application window to bring up on attempt to start a next instance. + +jrePath=Bundled JRE path: +jrePathTip=Bundled JRE path relative to the executable or absolute. +jreMin=Min JRE version: +jreMax=Max JRE version: +dontUsePrivateJres=Don't use private JREs +jvmOptions=JVM options: +jvmOptionsTip=Accepts everything you would normally pass to java/javaw launcher: assertion options, system properties and X options. +initialHeapSize=Initial heap size: +maxHeapSize=Max heap size: +freeMemory=% of free memory +jdkPreference=JDK/JRE preference: +addVariables=Add variables: +addVariablesTip=Add special variable or map environment variables to system properties. +exeDirVarTip=Executable's runtime directory path. +exeFileVarTip=Executable's runtime file path (directory and filename). +varsAndRegistry=Variables / registry: +envVar=Environment var: +property=Property +propertyTip=Map a variable to a system property. +option=Option +optionTip=Pass a JVM option using a variable. + +setVariables=Set variables: + +enableSplash=Enable splash screen +splashFile=Splash file: +splashFileTip=Splash screen file in BMP format. +waitForWindow=Wait for window +waitForWindowText=Close splash screen when an application window appears +timeout=Timeout [s]: +timeoutTip=Number of seconds after which the splash screen must close. Splash timeout may cause an error depending on splashTimeoutErr property. +timeoutErr=Signal error on timeout +timeoutErrTip=True signals an error on splash timeout, false closes the splash screen quietly. + +version=Version +additionalInfo=Additional information +addVersionInfo=Add version information +fileVersion=File version: +fileVersionTip=Version number 'x.x.x.x' +productVersion=Product version: +productVersionTip=Version number 'x.x.x.x' +fileDescription=File description: +fileDescriptionTip=File description presented to the user. +copyright=Copyright: +txtFileVersion=Free form: +txtFileVersionTip=Free form file version, for example '1.20.RC1'. +txtProductVersion=Free form: +txtProductVersionTip=Free form product version, for example '1.20.RC1'. +productName=Product name: +originalFilename=Original filename: +originalFilenameTip=Original name of the file without the path. Allows to determine whether a file has been renamed by a user. +internalName=Internal name: +internalNameTip=Internal name without extension, original filename or module name for example. +companyName=Company name: + +addMessages=Add custom messages +startupErr=Startup error: +bundledJreErr=Bundled JRE error: +jreVersionErr=JRE version error: +jreVersionErrTip=Launch4j will append the required version number at the end of this message. +launcherErr=Launcher error: +instanceAlreadyExistsMsg=Inst. already exists: +instanceAlreadyExistsMsgTip=Message displayed by single instance console applications if an instance already exists. diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages_es.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages_es.properties old mode 100755 new mode 100644 index 50e2d758715..199a26db227 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages_es.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/form/messages_es.properties @@ -1,118 +1,118 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -log = Registro - -outfile = Fichero de salida -outfileTip = Fichero ejecutable de salida. -errorTitle = T\u00EDtulo de error -errorTitleTip = Launch4j indica los errores usando una ventana de mensaje, usted puede ponerle el nombre de la aplicaci\u00F3n a esta ventana. -customProcName = Nombre personalizado del proceso -stayAlive = Mantener abierto despu\u00E9s de lanzar una aplicaci\u00F3n GUI -icon = Icono -iconTip = Icono de la aplicaci\u00F3n. -jar = Jar -jarTip = Jar de la aplicaci\u00F3n. -dontWrapJar = No empaquetar el jar, s\u00F3lo lanzar -cmdLine = Argumentos del jar -cmdLine = Argumentos de l\u00EDnea de \u00F3rdenes pasados a la aplicaci\u00F3n. -options = Opciones -chdir = Cambiar al directorio -chdirTip = Cambia el directorio actual a la localizaci\u00F3n relativa al ejecutable. Si el campo se deja vac\u00EDo, no tiene efecto, . - cambia el directorio a la localizaci\u00F3n del exe. -headerType = Tipo de cabecera -gui = GUI -console = Consola -objectFiles = Ficheros objeto -libs = w32api -linkerOptions = Cabecera personalizada - opciones del enlazador -jrePath = Ruta del JRE -jrePathTip = Ruta relativa al ejecutable del JRE. -jreMin = Versi\u00F3n m\u00EDnima del JRE -jreMax = Versi\u00F3n m\u00E1xima del JRE -jvmOptions = Argumentos de la JVM -jvmOptionsTip = Acepta cualquier argumento que normalmente se le pasar\u00EDa al lanzador java/javaw\: opciones assertion, propiedades de sistema y opciones X. -initialHeapSize = Tama\u00F1o inicial de la pila -maxHeapSize = Tama\u00F1o m\u00E1ximo de la pila -freeMemory=% of free memory -addVariables = A\u00F1adir variables -addVariablesTip = A\u00F1adir una variable especial o mapear variables de entorno a las propiedades del sistema. -exeDirVarTip = Ruta del directorio del ejecutable. -exeFileVarTip = Ruta del fichero ejecutable (directorio y nombre del fichero). -other = Otra -otherTip = Mapear una variable de entorno a una propiedad del sistema. -otherVarTip = Variable de entorno que mapear. -add = A\u00F1adir -specifyVar = Especificar variable de entorno que a\u00F1adir. -enableSplash = Activar pantalla de bienvenida -splashFile = Imagen -splashFileTip = Imagen en formato BMP para la pantalla de bienvenida. -waitForWindow = Esperar la ventana -waitForWindowText = Cerrar la pantalla de bienvenida cuando aparezca una ventana de la aplicaci\u00F3n -timeout = Tiempo de espera [s] -timeoutTip = Numero de segundos despu\u00E9s de los que la pantalla de bienvenida se debe cerrar. Esta propiedad puede causar provocar un error dependiendo de la propiedad splashTimeoutErr. -timeoutErr = Se\u00F1al de error asociada al tiempo de espera -timeoutErrTip = Marcado (true) se\u00F1ala un error despu\u00E9s del tiempo de espera de la pantalla de bienvenida, no marcado (false) cierra la pantalla de bienvenida silenciosamente -addVersionInfo = A\u00F1ade informaci\u00F3n sobre la versi\u00F3n -fileVersion = Versi\u00F3n del fichero -fileVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x' -additionalInfo = Informaci\u00F3n adicional -productVersion = Versi\u00F3n del producto -productVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x' -fileDescription = Descripci\u00F3n del fichero -fileDescriptionTip = Descripci\u00F3n del fichero que se le muestra al usuario. -copyright = Copyright -txtFileVersion = Forma libre -txtFileVersionTip = Forma libre de versi\u00F3n, por ejemplo '1.20.RC1'. -txtProductVersion = Forma libre -txtProductVersionTip = Forma libre del producto, por ejemplo '1.20.RC1'. -productName = Nombre del producto -originalFilename = Nombre original del fichero -originalFilenameTip = Nombre original del fichero sin la ruta. Permite determinar si un fichero ha sido renombrado por un usuario. -internalName = Nombre interno -internalNameTip = Nombre interno sin extensi\u00F3n, el nombre original del fichero o el m\u00F3dulo, por ejemplo. -companyName = Nombre de la organizaci\u00F3n - -addMessages=Add custom messages -startupErr=Startup error: -bundledJreErr=Bundled JRE error: -jreVersionErr=JRE version error: -jreVersionErrTip=Launch4j will append the required version number at the end of this message. -launcherErr=Launcher error: -instanceAlreadyExistsMsg=Inst. already exists: -instanceAlreadyExistsMsgTip=Message displayed by single instance console applications if an instance already exists. - -enableSingleInstance=Allow only a single instance of the application -mutexName=Mutex name -mutexNameTip=Mutex name that will uniquely identify your application. -windowTitle=Window title -windowTitleTip=Title of the application window to bring up on attempt to start a next instance. +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +log = Registro + +outfile = Fichero de salida +outfileTip = Fichero ejecutable de salida. +errorTitle = T\u00EDtulo de error +errorTitleTip = Launch4j indica los errores usando una ventana de mensaje, usted puede ponerle el nombre de la aplicaci\u00F3n a esta ventana. +customProcName = Nombre personalizado del proceso +stayAlive = Mantener abierto despu\u00E9s de lanzar una aplicaci\u00F3n GUI +icon = Icono +iconTip = Icono de la aplicaci\u00F3n. +jar = Jar +jarTip = Jar de la aplicaci\u00F3n. +dontWrapJar = No empaquetar el jar, s\u00F3lo lanzar +cmdLine = Argumentos del jar +cmdLine = Argumentos de l\u00EDnea de \u00F3rdenes pasados a la aplicaci\u00F3n. +options = Opciones +chdir = Cambiar al directorio +chdirTip = Cambia el directorio actual a la localizaci\u00F3n relativa al ejecutable. Si el campo se deja vac\u00EDo, no tiene efecto, . - cambia el directorio a la localizaci\u00F3n del exe. +headerType = Tipo de cabecera +gui = GUI +console = Consola +objectFiles = Ficheros objeto +libs = w32api +linkerOptions = Cabecera personalizada - opciones del enlazador +jrePath = Ruta del JRE +jrePathTip = Ruta relativa al ejecutable del JRE. +jreMin = Versi\u00F3n m\u00EDnima del JRE +jreMax = Versi\u00F3n m\u00E1xima del JRE +jvmOptions = Argumentos de la JVM +jvmOptionsTip = Acepta cualquier argumento que normalmente se le pasar\u00EDa al lanzador java/javaw\: opciones assertion, propiedades de sistema y opciones X. +initialHeapSize = Tama\u00F1o inicial de la pila +maxHeapSize = Tama\u00F1o m\u00E1ximo de la pila +freeMemory=% of free memory +addVariables = A\u00F1adir variables +addVariablesTip = A\u00F1adir una variable especial o mapear variables de entorno a las propiedades del sistema. +exeDirVarTip = Ruta del directorio del ejecutable. +exeFileVarTip = Ruta del fichero ejecutable (directorio y nombre del fichero). +other = Otra +otherTip = Mapear una variable de entorno a una propiedad del sistema. +otherVarTip = Variable de entorno que mapear. +add = A\u00F1adir +specifyVar = Especificar variable de entorno que a\u00F1adir. +enableSplash = Activar pantalla de bienvenida +splashFile = Imagen +splashFileTip = Imagen en formato BMP para la pantalla de bienvenida. +waitForWindow = Esperar la ventana +waitForWindowText = Cerrar la pantalla de bienvenida cuando aparezca una ventana de la aplicaci\u00F3n +timeout = Tiempo de espera [s] +timeoutTip = Numero de segundos despu\u00E9s de los que la pantalla de bienvenida se debe cerrar. Esta propiedad puede causar provocar un error dependiendo de la propiedad splashTimeoutErr. +timeoutErr = Se\u00F1al de error asociada al tiempo de espera +timeoutErrTip = Marcado (true) se\u00F1ala un error despu\u00E9s del tiempo de espera de la pantalla de bienvenida, no marcado (false) cierra la pantalla de bienvenida silenciosamente +addVersionInfo = A\u00F1ade informaci\u00F3n sobre la versi\u00F3n +fileVersion = Versi\u00F3n del fichero +fileVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x' +additionalInfo = Informaci\u00F3n adicional +productVersion = Versi\u00F3n del producto +productVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x' +fileDescription = Descripci\u00F3n del fichero +fileDescriptionTip = Descripci\u00F3n del fichero que se le muestra al usuario. +copyright = Copyright +txtFileVersion = Forma libre +txtFileVersionTip = Forma libre de versi\u00F3n, por ejemplo '1.20.RC1'. +txtProductVersion = Forma libre +txtProductVersionTip = Forma libre del producto, por ejemplo '1.20.RC1'. +productName = Nombre del producto +originalFilename = Nombre original del fichero +originalFilenameTip = Nombre original del fichero sin la ruta. Permite determinar si un fichero ha sido renombrado por un usuario. +internalName = Nombre interno +internalNameTip = Nombre interno sin extensi\u00F3n, el nombre original del fichero o el m\u00F3dulo, por ejemplo. +companyName = Nombre de la organizaci\u00F3n + +addMessages=Add custom messages +startupErr=Startup error: +bundledJreErr=Bundled JRE error: +jreVersionErr=JRE version error: +jreVersionErrTip=Launch4j will append the required version number at the end of this message. +launcherErr=Launcher error: +instanceAlreadyExistsMsg=Inst. already exists: +instanceAlreadyExistsMsgTip=Message displayed by single instance console applications if an instance already exists. + +enableSingleInstance=Allow only a single instance of the application +mutexName=Mutex name +mutexNameTip=Mutex name that will uniquely identify your application. +windowTitle=Window title +windowTitleTip=Title of the application window to bring up on attempt to start a next instance. diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java old mode 100755 new mode 100644 index 5265e6436c3..8034fbf2eda --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java @@ -1,75 +1,75 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.Color; -import java.awt.event.ActionListener; - -import javax.swing.JTextField; - -import net.sf.launch4j.binding.Binding; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public abstract class AbstractAcceptListener implements ActionListener { - final JTextField _field; - - public AbstractAcceptListener(JTextField f, boolean listen) { - _field = f; - if (listen) { - _field.addActionListener(this); - } - } - - protected String getText() { - return _field.getText(); - } - - protected void clear() { - _field.setText(""); - _field.requestFocusInWindow(); - } - - protected void signalViolation(String msg) { - final Color bg = _field.getBackground(); - _field.setBackground(Binding.INVALID_COLOR); - MainFrame.getInstance().warn(msg); - _field.setBackground(bg); - _field.requestFocusInWindow(); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.Color; +import java.awt.event.ActionListener; + +import javax.swing.JTextField; + +import net.sf.launch4j.binding.Binding; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public abstract class AbstractAcceptListener implements ActionListener { + final JTextField _field; + + public AbstractAcceptListener(JTextField f, boolean listen) { + _field = f; + if (listen) { + _field.addActionListener(this); + } + } + + protected String getText() { + return _field.getText(); + } + + protected void clear() { + _field.setText(""); + _field.requestFocusInWindow(); + } + + protected void signalViolation(String msg) { + final Color bg = _field.getBackground(); + _field.setBackground(Binding.INVALID_COLOR); + MainFrame.getInstance().warn(msg); + _field.setBackground(bg); + _field.requestFocusInWindow(); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java old mode 100755 new mode 100644 index 01ebe8adfb2..2efd8ae0e9e --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java @@ -1,101 +1,101 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.JFileChooser; -import javax.swing.JRadioButton; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.form.BasicForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class BasicFormImpl extends BasicForm { - - public BasicFormImpl(Bindings bindings, JFileChooser fc) { - bindings.add("outfile", _outfileField) - .add("dontWrapJar", _dontWrapJarCheck) - .add("jar", _jarField) - .add("manifest", _manifestField) - .add("icon", _iconField) - .add("cmdLine", _cmdLineField) - .add("errTitle", _errorTitleField) - .add("downloadUrl", _downloadUrlField, Config.DOWNLOAD_URL) - .add("supportUrl", _supportUrlField) - .add("chdir", _chdirField) - .add("priorityIndex", new JRadioButton[] { _normalPriorityRadio, - _idlePriorityRadio, - _highPriorityRadio }) - .add("customProcName", _customProcNameCheck) - .add("stayAlive", _stayAliveCheck); - - _dontWrapJarCheck.addChangeListener(new DontWrapJarChangeListener()); - - _outfileButton.addActionListener(new BrowseActionListener(true, fc, - new FileChooserFilter("Windows executables (.exe)", ".exe"), - _outfileField)); - _jarButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Jar files", ".jar"), _jarField)); - _manifestButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Manifest files (.manifest)", ".manifest"), - _manifestField)); - _iconButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Icon files (.ico)", ".ico"), _iconField)); - } - - private class DontWrapJarChangeListener implements ChangeListener { - - public void stateChanged(ChangeEvent e) { - boolean dontWrap = _dontWrapJarCheck.isSelected(); - if (dontWrap) { - _jarLabel.setIcon(loadImage("images/asterix-o.gif")); - _jarLabel.setText(Messages.getString("jarPath")); - _jarField.setToolTipText(Messages.getString("jarPathTip")); - } else { - _jarLabel.setIcon(loadImage("images/asterix.gif")); - _jarLabel.setText(Messages.getString("jar")); - _jarField.setToolTipText(Messages.getString("jarTip")); - } - _jarButton.setEnabled(!dontWrap); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.JFileChooser; +import javax.swing.JRadioButton; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.form.BasicForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class BasicFormImpl extends BasicForm { + + public BasicFormImpl(Bindings bindings, JFileChooser fc) { + bindings.add("outfile", _outfileField) + .add("dontWrapJar", _dontWrapJarCheck) + .add("jar", _jarField) + .add("manifest", _manifestField) + .add("icon", _iconField) + .add("cmdLine", _cmdLineField) + .add("errTitle", _errorTitleField) + .add("downloadUrl", _downloadUrlField, Config.DOWNLOAD_URL) + .add("supportUrl", _supportUrlField) + .add("chdir", _chdirField) + .add("priorityIndex", new JRadioButton[] { _normalPriorityRadio, + _idlePriorityRadio, + _highPriorityRadio }) + .add("customProcName", _customProcNameCheck) + .add("stayAlive", _stayAliveCheck); + + _dontWrapJarCheck.addChangeListener(new DontWrapJarChangeListener()); + + _outfileButton.addActionListener(new BrowseActionListener(true, fc, + new FileChooserFilter("Windows executables (.exe)", ".exe"), + _outfileField)); + _jarButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Jar files", ".jar"), _jarField)); + _manifestButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Manifest files (.manifest)", ".manifest"), + _manifestField)); + _iconButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Icon files (.ico)", ".ico"), _iconField)); + } + + private class DontWrapJarChangeListener implements ChangeListener { + + public void stateChanged(ChangeEvent e) { + boolean dontWrap = _dontWrapJarCheck.isSelected(); + if (dontWrap) { + _jarLabel.setIcon(loadImage("images/asterix-o.gif")); + _jarLabel.setText(Messages.getString("jarPath")); + _jarField.setToolTipText(Messages.getString("jarPathTip")); + } else { + _jarLabel.setIcon(loadImage("images/asterix.gif")); + _jarLabel.setText(Messages.getString("jar")); + _jarField.setToolTipText(Messages.getString("jarTip")); + } + _jarButton.setEnabled(!dontWrap); + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java old mode 100755 new mode 100644 index 89a5017ee23..a13bda66d84 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java @@ -1,79 +1,79 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; - -import javax.swing.JFileChooser; -import javax.swing.JTextField; - -import net.sf.launch4j.FileChooserFilter; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class BrowseActionListener implements ActionListener { - private final boolean _save; - private final JFileChooser _fileChooser; - private final FileChooserFilter _filter; - private final JTextField _field; - - public BrowseActionListener(boolean save, JFileChooser fileChooser, - FileChooserFilter filter, JTextField field) { - _save = save; - _fileChooser = fileChooser; - _filter = filter; - _field = field; - } - - public void actionPerformed(ActionEvent e) { - if (!_field.isEnabled()) { - return; - } - _fileChooser.setFileFilter(_filter); - _fileChooser.setSelectedFile(new File("")); - int result = _save - ? _fileChooser.showSaveDialog(MainFrame.getInstance()) - : _fileChooser.showOpenDialog(MainFrame.getInstance()); - if (result == JFileChooser.APPROVE_OPTION) { - _field.setText(_fileChooser.getSelectedFile().getPath()); - } - _fileChooser.removeChoosableFileFilter(_filter); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; + +import javax.swing.JFileChooser; +import javax.swing.JTextField; + +import net.sf.launch4j.FileChooserFilter; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class BrowseActionListener implements ActionListener { + private final boolean _save; + private final JFileChooser _fileChooser; + private final FileChooserFilter _filter; + private final JTextField _field; + + public BrowseActionListener(boolean save, JFileChooser fileChooser, + FileChooserFilter filter, JTextField field) { + _save = save; + _fileChooser = fileChooser; + _filter = filter; + _field = field; + } + + public void actionPerformed(ActionEvent e) { + if (!_field.isEnabled()) { + return; + } + _fileChooser.setFileFilter(_filter); + _fileChooser.setSelectedFile(new File("")); + int result = _save + ? _fileChooser.showSaveDialog(MainFrame.getInstance()) + : _fileChooser.showOpenDialog(MainFrame.getInstance()); + if (result == JFileChooser.APPROVE_OPTION) { + _field.setText(_fileChooser.getSelectedFile().getPath()); + } + _fileChooser.removeChoosableFileFilter(_filter); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java old mode 100755 new mode 100644 index 65d82096ee3..8bdff451029 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java @@ -1,222 +1,222 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.util.jar.Attributes; -import java.util.jar.JarFile; - -import javax.swing.DefaultListModel; -import javax.swing.JFileChooser; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.binding.Validator; -import net.sf.launch4j.config.ClassPath; -import net.sf.launch4j.form.ClassPathForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class ClassPathFormImpl extends ClassPathForm { - private final JFileChooser _fileChooser; - private final FileChooserFilter _filter - = new FileChooserFilter("Executable jar", ".jar"); - - public ClassPathFormImpl(Bindings bindings, JFileChooser fc) { - bindings.addOptComponent("classPath", ClassPath.class, _classpathCheck) - .add("classPath.mainClass", _mainclassField) - .add("classPath.paths", _classpathList); - _fileChooser = fc; - - ClasspathCheckListener cpl = new ClasspathCheckListener(); - _classpathCheck.addChangeListener(cpl); - cpl.stateChanged(null); - - _classpathList.setModel(new DefaultListModel()); - _classpathList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - _classpathList.addListSelectionListener(new ClasspathSelectionListener()); - - _newClasspathButton.addActionListener(new NewClasspathListener()); - _acceptClasspathButton.addActionListener( - new AcceptClasspathListener(_classpathField)); - _removeClasspathButton.addActionListener(new RemoveClasspathListener()); - _importClasspathButton.addActionListener(new ImportClasspathListener()); - _classpathUpButton.addActionListener(new MoveUpListener()); - _classpathDownButton.addActionListener(new MoveDownListener()); - } - - private class ClasspathCheckListener implements ChangeListener { - public void stateChanged(ChangeEvent e) { - boolean on = _classpathCheck.isSelected(); - _importClasspathButton.setEnabled(on); - _classpathUpButton.setEnabled(on); - _classpathDownButton.setEnabled(on); - _classpathField.setEnabled(on); - _newClasspathButton.setEnabled(on); - _acceptClasspathButton.setEnabled(on); - _removeClasspathButton.setEnabled(on); - } - } - - private class NewClasspathListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - _classpathList.clearSelection(); - _classpathField.setText(""); - _classpathField.requestFocusInWindow(); - } - } - - private class AcceptClasspathListener extends AbstractAcceptListener { - public AcceptClasspathListener(JTextField f) { - super(f, true); - } - - public void actionPerformed(ActionEvent e) { - String cp = getText(); - if (Validator.isEmpty(cp)) { - signalViolation(Messages.getString("specifyClassPath")); - return; - } - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - if (_classpathList.isSelectionEmpty()) { - model.addElement(cp); - clear(); - } else { - model.setElementAt(cp, _classpathList.getSelectedIndex()); - } - } - } - - private class ClasspathSelectionListener implements ListSelectionListener { - public void valueChanged(ListSelectionEvent e) { - if (e.getValueIsAdjusting()) { - return; - } - if (_classpathList.isSelectionEmpty()) { - _classpathField.setText(""); - } else { - _classpathField.setText((String) _classpathList.getSelectedValue()); - } - _classpathField.requestFocusInWindow(); - } - } - - private class RemoveClasspathListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (_classpathList.isSelectionEmpty() - || !MainFrame.getInstance().confirm( - Messages.getString("confirmClassPathRemoval"))) { - return; - } - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - while (!_classpathList.isSelectionEmpty()) { - model.remove(_classpathList.getSelectedIndex()); - } - } - } - - private class MoveUpListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - int x = _classpathList.getSelectedIndex(); - if (x < 1) { - return; - } - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - Object o = model.get(x - 1); - model.set(x - 1, model.get(x)); - model.set(x, o); - _classpathList.setSelectedIndex(x - 1); - } - } - - private class MoveDownListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - int x = _classpathList.getSelectedIndex(); - if (x == -1 || x >= model.getSize() - 1) { - return; - } - Object o = model.get(x + 1); - model.set(x + 1, model.get(x)); - model.set(x, o); - _classpathList.setSelectedIndex(x + 1); - } - } - - private class ImportClasspathListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - try { - _fileChooser.setFileFilter(_filter); - _fileChooser.setSelectedFile(new File("")); - if (_fileChooser.showOpenDialog(MainFrame.getInstance()) - == JFileChooser.APPROVE_OPTION) { - JarFile jar = new JarFile(_fileChooser.getSelectedFile()); - if (jar.getManifest() == null) { - jar.close(); - MainFrame.getInstance().info(Messages.getString("noManifest")); - return; - } - Attributes attr = jar.getManifest().getMainAttributes(); - String mainClass = (String) attr.getValue("Main-Class"); - String classPath = (String) attr.getValue("Class-Path"); - jar.close(); - _mainclassField.setText(mainClass != null ? mainClass : ""); - DefaultListModel model = new DefaultListModel(); - if (classPath != null) { - String[] paths = classPath.split(" "); - for (int i = 0; i < paths.length; i++) { - model.addElement(paths[i]); - } - } - _classpathList.setModel(model); - } - } catch (IOException ex) { - MainFrame.getInstance().warn(ex.getMessage()); - } - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.util.jar.Attributes; +import java.util.jar.JarFile; + +import javax.swing.DefaultListModel; +import javax.swing.JFileChooser; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.binding.Validator; +import net.sf.launch4j.config.ClassPath; +import net.sf.launch4j.form.ClassPathForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class ClassPathFormImpl extends ClassPathForm { + private final JFileChooser _fileChooser; + private final FileChooserFilter _filter + = new FileChooserFilter("Executable jar", ".jar"); + + public ClassPathFormImpl(Bindings bindings, JFileChooser fc) { + bindings.addOptComponent("classPath", ClassPath.class, _classpathCheck) + .add("classPath.mainClass", _mainclassField) + .add("classPath.paths", _classpathList); + _fileChooser = fc; + + ClasspathCheckListener cpl = new ClasspathCheckListener(); + _classpathCheck.addChangeListener(cpl); + cpl.stateChanged(null); + + _classpathList.setModel(new DefaultListModel()); + _classpathList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + _classpathList.addListSelectionListener(new ClasspathSelectionListener()); + + _newClasspathButton.addActionListener(new NewClasspathListener()); + _acceptClasspathButton.addActionListener( + new AcceptClasspathListener(_classpathField)); + _removeClasspathButton.addActionListener(new RemoveClasspathListener()); + _importClasspathButton.addActionListener(new ImportClasspathListener()); + _classpathUpButton.addActionListener(new MoveUpListener()); + _classpathDownButton.addActionListener(new MoveDownListener()); + } + + private class ClasspathCheckListener implements ChangeListener { + public void stateChanged(ChangeEvent e) { + boolean on = _classpathCheck.isSelected(); + _importClasspathButton.setEnabled(on); + _classpathUpButton.setEnabled(on); + _classpathDownButton.setEnabled(on); + _classpathField.setEnabled(on); + _newClasspathButton.setEnabled(on); + _acceptClasspathButton.setEnabled(on); + _removeClasspathButton.setEnabled(on); + } + } + + private class NewClasspathListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + _classpathList.clearSelection(); + _classpathField.setText(""); + _classpathField.requestFocusInWindow(); + } + } + + private class AcceptClasspathListener extends AbstractAcceptListener { + public AcceptClasspathListener(JTextField f) { + super(f, true); + } + + public void actionPerformed(ActionEvent e) { + String cp = getText(); + if (Validator.isEmpty(cp)) { + signalViolation(Messages.getString("specifyClassPath")); + return; + } + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + if (_classpathList.isSelectionEmpty()) { + model.addElement(cp); + clear(); + } else { + model.setElementAt(cp, _classpathList.getSelectedIndex()); + } + } + } + + private class ClasspathSelectionListener implements ListSelectionListener { + public void valueChanged(ListSelectionEvent e) { + if (e.getValueIsAdjusting()) { + return; + } + if (_classpathList.isSelectionEmpty()) { + _classpathField.setText(""); + } else { + _classpathField.setText((String) _classpathList.getSelectedValue()); + } + _classpathField.requestFocusInWindow(); + } + } + + private class RemoveClasspathListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + if (_classpathList.isSelectionEmpty() + || !MainFrame.getInstance().confirm( + Messages.getString("confirmClassPathRemoval"))) { + return; + } + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + while (!_classpathList.isSelectionEmpty()) { + model.remove(_classpathList.getSelectedIndex()); + } + } + } + + private class MoveUpListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + int x = _classpathList.getSelectedIndex(); + if (x < 1) { + return; + } + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + Object o = model.get(x - 1); + model.set(x - 1, model.get(x)); + model.set(x, o); + _classpathList.setSelectedIndex(x - 1); + } + } + + private class MoveDownListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + int x = _classpathList.getSelectedIndex(); + if (x == -1 || x >= model.getSize() - 1) { + return; + } + Object o = model.get(x + 1); + model.set(x + 1, model.get(x)); + model.set(x, o); + _classpathList.setSelectedIndex(x + 1); + } + } + + private class ImportClasspathListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + try { + _fileChooser.setFileFilter(_filter); + _fileChooser.setSelectedFile(new File("")); + if (_fileChooser.showOpenDialog(MainFrame.getInstance()) + == JFileChooser.APPROVE_OPTION) { + JarFile jar = new JarFile(_fileChooser.getSelectedFile()); + if (jar.getManifest() == null) { + jar.close(); + MainFrame.getInstance().info(Messages.getString("noManifest")); + return; + } + Attributes attr = jar.getManifest().getMainAttributes(); + String mainClass = (String) attr.getValue("Main-Class"); + String classPath = (String) attr.getValue("Class-Path"); + jar.close(); + _mainclassField.setText(mainClass != null ? mainClass : ""); + DefaultListModel model = new DefaultListModel(); + if (classPath != null) { + String[] paths = classPath.split(" "); + for (int i = 0; i < paths.length; i++) { + model.addElement(paths[i]); + } + } + _classpathList.setModel(model); + } + } catch (IOException ex) { + MainFrame.getInstance().warn(ex.getMessage()); + } + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java old mode 100755 new mode 100644 index d29720642b5..cb618494161 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java @@ -1,100 +1,100 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 10, 2005 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.BorderFactory; -import javax.swing.JFileChooser; -import javax.swing.JTextArea; - -import net.sf.launch4j.binding.Binding; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.form.ConfigForm; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ConfigFormImpl extends ConfigForm { - private final Bindings _bindings = new Bindings(); - private final JFileChooser _fileChooser = new FileChooser(ConfigFormImpl.class); - - public ConfigFormImpl() { - _tab.setBorder(BorderFactory.createMatteBorder(0, -1, -1, -1, getBackground())); - _tab.addTab(Messages.getString("tab.basic"), - new BasicFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.classpath"), - new ClassPathFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.header"), - new HeaderFormImpl(_bindings)); - _tab.addTab(Messages.getString("tab.singleInstance"), - new SingleInstanceFormImpl(_bindings)); - _tab.addTab(Messages.getString("tab.jre"), - new JreFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.envVars"), - new EnvironmentVarsFormImpl(_bindings)); - _tab.addTab(Messages.getString("tab.splash"), - new SplashFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.version"), - new VersionInfoFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.messages"), - new MessagesFormImpl(_bindings)); - } - - public void clear(IValidatable bean) { - _bindings.clear(bean); - } - - public void put(IValidatable bean) { - _bindings.put(bean); - } - - public void get(IValidatable bean) { - _bindings.get(bean); - } - - public boolean isModified() { - return _bindings.isModified(); - } - - public JTextArea getLogTextArea() { - return _logTextArea; - } - - public Binding getBinding(String property) { - return _bindings.getBinding(property); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 10, 2005 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.BorderFactory; +import javax.swing.JFileChooser; +import javax.swing.JTextArea; + +import net.sf.launch4j.binding.Binding; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.form.ConfigForm; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ConfigFormImpl extends ConfigForm { + private final Bindings _bindings = new Bindings(); + private final JFileChooser _fileChooser = new FileChooser(ConfigFormImpl.class); + + public ConfigFormImpl() { + _tab.setBorder(BorderFactory.createMatteBorder(0, -1, -1, -1, getBackground())); + _tab.addTab(Messages.getString("tab.basic"), + new BasicFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.classpath"), + new ClassPathFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.header"), + new HeaderFormImpl(_bindings)); + _tab.addTab(Messages.getString("tab.singleInstance"), + new SingleInstanceFormImpl(_bindings)); + _tab.addTab(Messages.getString("tab.jre"), + new JreFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.envVars"), + new EnvironmentVarsFormImpl(_bindings)); + _tab.addTab(Messages.getString("tab.splash"), + new SplashFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.version"), + new VersionInfoFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.messages"), + new MessagesFormImpl(_bindings)); + } + + public void clear(IValidatable bean) { + _bindings.clear(bean); + } + + public void put(IValidatable bean) { + _bindings.put(bean); + } + + public void get(IValidatable bean) { + _bindings.get(bean); + } + + public boolean isModified() { + return _bindings.isModified(); + } + + public JTextArea getLogTextArea() { + return _logTextArea; + } + + public Binding getBinding(String property) { + return _bindings.getBinding(property); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java old mode 100755 new mode 100644 index 2f325fe3cf9..d6553b0e94a --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java @@ -1,50 +1,50 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Jun 10, 2006 - */ -package net.sf.launch4j.formimpl; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.form.EnvironmentVarsForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class EnvironmentVarsFormImpl extends EnvironmentVarsForm { - - public EnvironmentVarsFormImpl(Bindings bindings) { - bindings.add("variables", _envVarsTextArea); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Jun 10, 2006 + */ +package net.sf.launch4j.formimpl; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.form.EnvironmentVarsForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class EnvironmentVarsFormImpl extends EnvironmentVarsForm { + + public EnvironmentVarsFormImpl(Bindings bindings) { + bindings.add("variables", _envVarsTextArea); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java old mode 100755 new mode 100644 index c1b984e5878..5cc1c125095 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java @@ -1,65 +1,65 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Jul 19, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.io.File; -import java.util.prefs.Preferences; - -import javax.swing.JFileChooser; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class FileChooser extends JFileChooser { - private final Preferences _prefs; - private final String _key; - - public FileChooser(Class clazz) { - _prefs = Preferences.userNodeForPackage(clazz); - _key = "currentDir-" - + clazz.getName().substring(clazz.getName().lastIndexOf('.') + 1); - String path = _prefs.get(_key, null); - if (path != null) { - setCurrentDirectory(new File(path)); - } - } - - public void approveSelection() { - _prefs.put(_key, getCurrentDirectory().getPath()); - super.approveSelection(); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Jul 19, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.io.File; +import java.util.prefs.Preferences; + +import javax.swing.JFileChooser; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class FileChooser extends JFileChooser { + private final Preferences _prefs; + private final String _key; + + public FileChooser(Class clazz) { + _prefs = Preferences.userNodeForPackage(clazz); + _key = "currentDir-" + + clazz.getName().substring(clazz.getName().lastIndexOf('.') + 1); + String path = _prefs.get(_key, null); + if (path != null) { + setCurrentDirectory(new File(path)); + } + } + + public void approveSelection() { + _prefs.put(_key, getCurrentDirectory().getPath()); + super.approveSelection(); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/GlassPane.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/GlassPane.java old mode 100755 new mode 100644 index c1b1d8dd4f0..46126740ab9 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/GlassPane.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/GlassPane.java @@ -1,67 +1,67 @@ -package net.sf.launch4j.formimpl; - -import java.awt.AWTEvent; -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Toolkit; -import java.awt.Window; -import java.awt.event.AWTEventListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; - -import javax.swing.JComponent; -import javax.swing.SwingUtilities; - -/** - * This is the glass pane class that intercepts screen interactions during - * system busy states. - * - * Based on JavaWorld article by Yexin Chen. - */ -public class GlassPane extends JComponent implements AWTEventListener { - private final Window _window; - - public GlassPane(Window w) { - _window = w; - addMouseListener(new MouseAdapter() {}); - addKeyListener(new KeyAdapter() {}); - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - } - - /** - * Receives all key events in the AWT and processes the ones that originated - * from the current window with the glass pane. - * - * @param event - * the AWTEvent that was fired - */ - public void eventDispatched(AWTEvent event) { - Object source = event.getSource(); - if (event instanceof KeyEvent - && source instanceof Component) { - /* - * If the event originated from the window w/glass pane, - * consume the event. - */ - if ((SwingUtilities.windowForComponent((Component) source) == _window)) { - ((KeyEvent) event).consume(); - } - } - } - - /** - * Sets the glass pane as visible or invisible. The mouse cursor will be set - * accordingly. - */ - public void setVisible(boolean visible) { - if (visible) { - // Start receiving all events and consume them if necessary - Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK); - } else { - // Stop receiving all events - Toolkit.getDefaultToolkit().removeAWTEventListener(this); - } - super.setVisible(visible); - } -} +package net.sf.launch4j.formimpl; + +import java.awt.AWTEvent; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Toolkit; +import java.awt.Window; +import java.awt.event.AWTEventListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; + +import javax.swing.JComponent; +import javax.swing.SwingUtilities; + +/** + * This is the glass pane class that intercepts screen interactions during + * system busy states. + * + * Based on JavaWorld article by Yexin Chen. + */ +public class GlassPane extends JComponent implements AWTEventListener { + private final Window _window; + + public GlassPane(Window w) { + _window = w; + addMouseListener(new MouseAdapter() {}); + addKeyListener(new KeyAdapter() {}); + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + } + + /** + * Receives all key events in the AWT and processes the ones that originated + * from the current window with the glass pane. + * + * @param event + * the AWTEvent that was fired + */ + public void eventDispatched(AWTEvent event) { + Object source = event.getSource(); + if (event instanceof KeyEvent + && source instanceof Component) { + /* + * If the event originated from the window w/glass pane, + * consume the event. + */ + if ((SwingUtilities.windowForComponent((Component) source) == _window)) { + ((KeyEvent) event).consume(); + } + } + } + + /** + * Sets the glass pane as visible or invisible. The mouse cursor will be set + * accordingly. + */ + public void setVisible(boolean visible) { + if (visible) { + // Start receiving all events and consume them if necessary + Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK); + } else { + // Stop receiving all events + Toolkit.getDefaultToolkit().removeAWTEventListener(this); + } + super.setVisible(visible); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java old mode 100755 new mode 100644 index accfaa9de50..739bf52537b --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java @@ -1,102 +1,102 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JRadioButton; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.sf.launch4j.binding.Binding; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.form.HeaderForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class HeaderFormImpl extends HeaderForm { - private final Bindings _bindings; - - public HeaderFormImpl(Bindings bindings) { - _bindings = bindings; - _bindings.add("headerTypeIndex", new JRadioButton[] { _guiHeaderRadio, - _consoleHeaderRadio }) - .add("headerObjects", "customHeaderObjects", _headerObjectsCheck, - _headerObjectsTextArea) - .add("libs", "customLibs", _libsCheck, _libsTextArea); - - _guiHeaderRadio.addChangeListener(new HeaderTypeChangeListener()); - _headerObjectsCheck.addActionListener(new HeaderObjectsActionListener()); - _libsCheck.addActionListener(new LibsActionListener()); - } - - private class HeaderTypeChangeListener implements ChangeListener { - public void stateChanged(ChangeEvent e) { - Config c = ConfigPersister.getInstance().getConfig(); - c.setHeaderType(_guiHeaderRadio.isSelected() ? Config.GUI_HEADER - : Config.CONSOLE_HEADER); - if (!_headerObjectsCheck.isSelected()) { - Binding b = _bindings.getBinding("headerObjects"); - b.put(c); - } - } - } - - private class HeaderObjectsActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (!_headerObjectsCheck.isSelected()) { - ConfigPersister.getInstance().getConfig().setHeaderObjects(null); - Binding b = _bindings.getBinding("headerObjects"); - b.put(ConfigPersister.getInstance().getConfig()); - } - } - } - - private class LibsActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (!_libsCheck.isSelected()) { - ConfigPersister.getInstance().getConfig().setLibs(null); - Binding b = _bindings.getBinding("libs"); - b.put(ConfigPersister.getInstance().getConfig()); - } - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JRadioButton; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import net.sf.launch4j.binding.Binding; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.form.HeaderForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class HeaderFormImpl extends HeaderForm { + private final Bindings _bindings; + + public HeaderFormImpl(Bindings bindings) { + _bindings = bindings; + _bindings.add("headerTypeIndex", new JRadioButton[] { _guiHeaderRadio, + _consoleHeaderRadio }) + .add("headerObjects", "customHeaderObjects", _headerObjectsCheck, + _headerObjectsTextArea) + .add("libs", "customLibs", _libsCheck, _libsTextArea); + + _guiHeaderRadio.addChangeListener(new HeaderTypeChangeListener()); + _headerObjectsCheck.addActionListener(new HeaderObjectsActionListener()); + _libsCheck.addActionListener(new LibsActionListener()); + } + + private class HeaderTypeChangeListener implements ChangeListener { + public void stateChanged(ChangeEvent e) { + Config c = ConfigPersister.getInstance().getConfig(); + c.setHeaderType(_guiHeaderRadio.isSelected() ? Config.GUI_HEADER + : Config.CONSOLE_HEADER); + if (!_headerObjectsCheck.isSelected()) { + Binding b = _bindings.getBinding("headerObjects"); + b.put(c); + } + } + } + + private class HeaderObjectsActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + if (!_headerObjectsCheck.isSelected()) { + ConfigPersister.getInstance().getConfig().setHeaderObjects(null); + Binding b = _bindings.getBinding("headerObjects"); + b.put(ConfigPersister.getInstance().getConfig()); + } + } + } + + private class LibsActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + if (!_libsCheck.isSelected()) { + ConfigPersister.getInstance().getConfig().setLibs(null); + Binding b = _bindings.getBinding("libs"); + b.put(ConfigPersister.getInstance().getConfig()); + } + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java old mode 100755 new mode 100644 index 48a2f18e837..76d9d418e92 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java @@ -1,166 +1,166 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.JFileChooser; -import javax.swing.JTextField; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.binding.Validator; -import net.sf.launch4j.form.JreForm; -import net.sf.launch4j.config.Jre; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class JreFormImpl extends JreForm { - - public JreFormImpl(Bindings bindings, JFileChooser fc) { - _jdkPreferenceCombo.setModel(new DefaultComboBoxModel(new String[] { - Messages.getString("jdkPreference.jre.only"), - Messages.getString("jdkPreference.prefer.jre"), - Messages.getString("jdkPreference.prefer.jdk"), - Messages.getString("jdkPreference.jdk.only")})); - bindings.add("jre.path", _jrePathField) - .add("jre.minVersion", _jreMinField) - .add("jre.maxVersion", _jreMaxField) - .add("jre.jdkPreferenceIndex", _jdkPreferenceCombo, - Jre.DEFAULT_JDK_PREFERENCE_INDEX) - .add("jre.initialHeapSize", _initialHeapSizeField) - .add("jre.initialHeapPercent", _initialHeapPercentField) - .add("jre.maxHeapSize", _maxHeapSizeField) - .add("jre.maxHeapPercent", _maxHeapPercentField) - .add("jre.options", _jvmOptionsTextArea); - - _varCombo.setModel(new DefaultComboBoxModel(new String[] { - "EXEDIR", "EXEFILE", "PWD", "OLDPWD", - "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", - "HKEY_USERS", "HKEY_CURRENT_CONFIG" })); - - _varCombo.addActionListener(new VarComboActionListener()); - _varCombo.setSelectedIndex(0); - - _propertyButton.addActionListener(new PropertyActionListener()); - _optionButton.addActionListener(new OptionActionListener()); - - _envPropertyButton.addActionListener(new EnvPropertyActionListener(_envVarField)); - _envOptionButton.addActionListener(new EnvOptionActionListener(_envVarField)); - } - - private class VarComboActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - _optionButton.setEnabled(((String) _varCombo.getSelectedItem()) - .startsWith("HKEY_")); - } - } - - private class PropertyActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - final int pos = _jvmOptionsTextArea.getCaretPosition(); - final String var = (String) _varCombo.getSelectedItem(); - if (var.startsWith("HKEY_")) { - _jvmOptionsTextArea.insert("-Dreg.key=\"%" - + var + "\\\\...%\"\n", pos); - } else { - _jvmOptionsTextArea.insert("-Dlaunch4j." + var.toLowerCase() - + "=\"%" + var + "%\"\n", pos); - } - } - } - - private class OptionActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - final int pos = _jvmOptionsTextArea.getCaretPosition(); - final String var = (String) _varCombo.getSelectedItem(); - if (var.startsWith("HKEY_")) { - _jvmOptionsTextArea.insert("%" + var + "\\\\...%\n", pos); - } else { - _jvmOptionsTextArea.insert("%" + var + "%\n", pos); - } - } - } - - private abstract class EnvActionListener extends AbstractAcceptListener { - public EnvActionListener(JTextField f, boolean listen) { - super(f, listen); - } - - public void actionPerformed(ActionEvent e) { - final int pos = _jvmOptionsTextArea.getCaretPosition(); - final String var = getText() - .replaceAll("\"", "") - .replaceAll("%", ""); - if (Validator.isEmpty(var)) { - signalViolation(Messages.getString("specifyVar")); - return; - } - add(var, pos); - clear(); - } - - protected abstract void add(String var, int pos); - } - - private class EnvPropertyActionListener extends EnvActionListener { - public EnvPropertyActionListener(JTextField f) { - super(f, true); - } - - protected void add(String var, int pos) { - final String prop = var - .replaceAll(" ", ".") - .replaceAll("_", ".") - .toLowerCase(); - _jvmOptionsTextArea.insert("-Denv." + prop + "=\"%" + var - + "%\"\n", pos); - } - } - - private class EnvOptionActionListener extends EnvActionListener { - public EnvOptionActionListener(JTextField f) { - super(f, false); - } - - protected void add(String var, int pos) { - _jvmOptionsTextArea.insert("%" + var + "%\n", pos); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JFileChooser; +import javax.swing.JTextField; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.binding.Validator; +import net.sf.launch4j.form.JreForm; +import net.sf.launch4j.config.Jre; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class JreFormImpl extends JreForm { + + public JreFormImpl(Bindings bindings, JFileChooser fc) { + _jdkPreferenceCombo.setModel(new DefaultComboBoxModel(new String[] { + Messages.getString("jdkPreference.jre.only"), + Messages.getString("jdkPreference.prefer.jre"), + Messages.getString("jdkPreference.prefer.jdk"), + Messages.getString("jdkPreference.jdk.only")})); + bindings.add("jre.path", _jrePathField) + .add("jre.minVersion", _jreMinField) + .add("jre.maxVersion", _jreMaxField) + .add("jre.jdkPreferenceIndex", _jdkPreferenceCombo, + Jre.DEFAULT_JDK_PREFERENCE_INDEX) + .add("jre.initialHeapSize", _initialHeapSizeField) + .add("jre.initialHeapPercent", _initialHeapPercentField) + .add("jre.maxHeapSize", _maxHeapSizeField) + .add("jre.maxHeapPercent", _maxHeapPercentField) + .add("jre.options", _jvmOptionsTextArea); + + _varCombo.setModel(new DefaultComboBoxModel(new String[] { + "EXEDIR", "EXEFILE", "PWD", "OLDPWD", + "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", + "HKEY_USERS", "HKEY_CURRENT_CONFIG" })); + + _varCombo.addActionListener(new VarComboActionListener()); + _varCombo.setSelectedIndex(0); + + _propertyButton.addActionListener(new PropertyActionListener()); + _optionButton.addActionListener(new OptionActionListener()); + + _envPropertyButton.addActionListener(new EnvPropertyActionListener(_envVarField)); + _envOptionButton.addActionListener(new EnvOptionActionListener(_envVarField)); + } + + private class VarComboActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + _optionButton.setEnabled(((String) _varCombo.getSelectedItem()) + .startsWith("HKEY_")); + } + } + + private class PropertyActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + final int pos = _jvmOptionsTextArea.getCaretPosition(); + final String var = (String) _varCombo.getSelectedItem(); + if (var.startsWith("HKEY_")) { + _jvmOptionsTextArea.insert("-Dreg.key=\"%" + + var + "\\\\...%\"\n", pos); + } else { + _jvmOptionsTextArea.insert("-Dlaunch4j." + var.toLowerCase() + + "=\"%" + var + "%\"\n", pos); + } + } + } + + private class OptionActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + final int pos = _jvmOptionsTextArea.getCaretPosition(); + final String var = (String) _varCombo.getSelectedItem(); + if (var.startsWith("HKEY_")) { + _jvmOptionsTextArea.insert("%" + var + "\\\\...%\n", pos); + } else { + _jvmOptionsTextArea.insert("%" + var + "%\n", pos); + } + } + } + + private abstract class EnvActionListener extends AbstractAcceptListener { + public EnvActionListener(JTextField f, boolean listen) { + super(f, listen); + } + + public void actionPerformed(ActionEvent e) { + final int pos = _jvmOptionsTextArea.getCaretPosition(); + final String var = getText() + .replaceAll("\"", "") + .replaceAll("%", ""); + if (Validator.isEmpty(var)) { + signalViolation(Messages.getString("specifyVar")); + return; + } + add(var, pos); + clear(); + } + + protected abstract void add(String var, int pos); + } + + private class EnvPropertyActionListener extends EnvActionListener { + public EnvPropertyActionListener(JTextField f) { + super(f, true); + } + + protected void add(String var, int pos) { + final String prop = var + .replaceAll(" ", ".") + .replaceAll("_", ".") + .toLowerCase(); + _jvmOptionsTextArea.insert("-Denv." + prop + "=\"%" + var + + "%\"\n", pos); + } + } + + private class EnvOptionActionListener extends EnvActionListener { + public EnvOptionActionListener(JTextField f) { + super(f, false); + } + + protected void add(String var, int pos) { + _jvmOptionsTextArea.insert("%" + var + "%\n", pos); + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java old mode 100755 new mode 100644 index 4a2cc871596..89c783c32b4 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java @@ -1,358 +1,358 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on 2005-05-09 - */ -package net.sf.launch4j.formimpl; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; - -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JToolBar; -import javax.swing.UIManager; - -import com.jgoodies.looks.Options; -import com.jgoodies.looks.plastic.PlasticXPLookAndFeel; - -import foxtrot.Task; -import foxtrot.Worker; - -import net.sf.launch4j.Builder; -import net.sf.launch4j.BuilderException; -import net.sf.launch4j.ExecException; -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.Log; -import net.sf.launch4j.Main; -import net.sf.launch4j.Util; -import net.sf.launch4j.binding.Binding; -import net.sf.launch4j.binding.BindingException; -import net.sf.launch4j.binding.InvariantViolationException; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.config.ConfigPersisterException; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class MainFrame extends JFrame { - private static MainFrame _instance; - - private final JToolBar _toolBar; - private final JButton _runButton; - private final ConfigFormImpl _configForm; - private final JFileChooser _fileChooser = new FileChooser(MainFrame.class); - private File _outfile; - private boolean _saved = false; - - public static void createInstance() { - try { - Toolkit.getDefaultToolkit().setDynamicLayout(true); - System.setProperty("sun.awt.noerasebackground","true"); - - // JGoodies - Options.setDefaultIconSize(new Dimension(16, 16)); // menu icons - Options.setUseNarrowButtons(false); - Options.setPopupDropShadowEnabled(true); - - UIManager.setLookAndFeel(new PlasticXPLookAndFeel()); - _instance = new MainFrame(); - } catch (Exception e) { - System.err.println(e); - } - } - - public static MainFrame getInstance() { - return _instance; - } - - public MainFrame() { - showConfigName(null); - setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - addWindowListener(new MainFrameListener()); - setGlassPane(new GlassPane(this)); - _fileChooser.setFileFilter(new FileChooserFilter( - Messages.getString("MainFrame.config.files"), - new String[] {".xml", ".cfg"})); - - _toolBar = new JToolBar(); - _toolBar.setFloatable(false); - _toolBar.setRollover(true); - addButton("images/new.png", Messages.getString("MainFrame.new.config"), - new NewActionListener()); - addButton("images/open.png", Messages.getString("MainFrame.open.config"), - new OpenActionListener()); - addButton("images/save.png", Messages.getString("MainFrame.save.config"), - new SaveActionListener()); - _toolBar.addSeparator(); - addButton("images/build.png", Messages.getString("MainFrame.build.wrapper"), - new BuildActionListener()); - _runButton = addButton("images/run.png", - Messages.getString("MainFrame.test.wrapper"), - new RunActionListener()); - setRunEnabled(false); - _toolBar.addSeparator(); - addButton("images/info.png", Messages.getString("MainFrame.about.launch4j"), - new AboutActionListener()); - - _configForm = new ConfigFormImpl(); - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(_toolBar, BorderLayout.NORTH); - getContentPane().add(_configForm, BorderLayout.CENTER); - pack(); - Dimension scr = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension fr = getSize(); - fr.width += 25; - fr.height += 100; - setBounds((scr.width - fr.width) / 2, (scr.height - fr.height) / 2, - fr.width, fr.height); - setVisible(true); - } - - private JButton addButton(String iconPath, String tooltip, ActionListener l) { - ImageIcon icon = new ImageIcon(MainFrame.class.getClassLoader() - .getResource(iconPath)); - JButton b = new JButton(icon); - b.setToolTipText(tooltip); - b.addActionListener(l); - _toolBar.add(b); - return b; - } - - public void info(String text) { - JOptionPane.showMessageDialog(this, - text, - Main.getName(), - JOptionPane.INFORMATION_MESSAGE); - } - - public void warn(String text) { - JOptionPane.showMessageDialog(this, - text, - Main.getName(), - JOptionPane.WARNING_MESSAGE); - } - - public void warn(InvariantViolationException e) { - Binding b = e.getBinding(); - if (b != null) { - b.markInvalid(); - } - warn(e.getMessage()); - if (b != null) { - e.getBinding().markValid(); - } - } - - public boolean confirm(String text) { - return JOptionPane.showConfirmDialog(MainFrame.this, - text, - Messages.getString("MainFrame.confirm"), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; - } - - private boolean isModified() { - return (!_configForm.isModified()) - || confirm(Messages.getString("MainFrame.discard.changes")); - } - - private boolean save() { - // XXX - try { - _configForm.get(ConfigPersister.getInstance().getConfig()); - if (_fileChooser.showSaveDialog(MainFrame.this) == JOptionPane.YES_OPTION) { - File f = _fileChooser.getSelectedFile(); - if (!f.getPath().endsWith(".xml")) { - f = new File(f.getPath() + ".xml"); - } - ConfigPersister.getInstance().save(f); - _saved = true; - showConfigName(f); - return true; - } - return false; - } catch (InvariantViolationException ex) { - warn(ex); - return false; - } catch (BindingException ex) { - warn(ex.getMessage()); - return false; - } catch (ConfigPersisterException ex) { - warn(ex.getMessage()); - return false; - } - } - - private void showConfigName(File config) { - setTitle(Main.getName() + " - " + (config != null ? config.getName() - : Messages.getString("MainFrame.untitled"))); - } - - private void setRunEnabled(boolean enabled) { - if (!enabled) { - _outfile = null; - } - _runButton.setEnabled(enabled); - } - - private void clearConfig() { - ConfigPersister.getInstance().createBlank(); - _configForm.clear(ConfigPersister.getInstance().getConfig()); - } - - private class MainFrameListener extends WindowAdapter { - public void windowOpened(WindowEvent e) { - clearConfig(); - } - - public void windowClosing(WindowEvent e) { - if (isModified()) { - System.exit(0); - } - } - } - - private class NewActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (isModified()) { - clearConfig(); - } - _saved = false; - showConfigName(null); - setRunEnabled(false); - } - } - - private class OpenActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - try { - if (isModified() && _fileChooser.showOpenDialog(MainFrame.this) - == JOptionPane.YES_OPTION) { - final File f = _fileChooser.getSelectedFile(); - if (f.getPath().endsWith(".xml")) { - ConfigPersister.getInstance().load(f); - _saved = true; - } else { - ConfigPersister.getInstance().loadVersion1(f); - _saved = false; - } - _configForm.put(ConfigPersister.getInstance().getConfig()); - showConfigName(f); - setRunEnabled(false); - } - } catch (ConfigPersisterException ex) { - warn(ex.getMessage()); - } catch (BindingException ex) { - warn(ex.getMessage()); - } - } - } - - private class SaveActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - save(); - } - } - - private class BuildActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - final Log log = Log.getSwingLog(_configForm.getLogTextArea()); - try { - if ((!_saved || _configForm.isModified()) - && !save()) { - return; - } - log.clear(); - ConfigPersister.getInstance().getConfig().checkInvariants(); - Builder b = new Builder(log); - _outfile = b.build(); - setRunEnabled(ConfigPersister.getInstance().getConfig() - .getHeaderType() == Config.GUI_HEADER // TODO fix console app test - && (Util.WINDOWS_OS || !ConfigPersister.getInstance() - .getConfig().isDontWrapJar())); - } catch (InvariantViolationException ex) { - setRunEnabled(false); - ex.setBinding(_configForm.getBinding(ex.getProperty())); - warn(ex); - } catch (BuilderException ex) { - setRunEnabled(false); - log.append(ex.getMessage()); - } - } - } - - private class RunActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - try { - getGlassPane().setVisible(true); - Worker.post(new Task() { - public Object run() throws ExecException { - Log log = Log.getSwingLog(_configForm.getLogTextArea()); - log.clear(); - String path = _outfile.getPath(); - if (Util.WINDOWS_OS) { - log.append(Messages.getString("MainFrame.executing") + path); - Util.exec(new String[] { path }, log); - } else { - log.append(Messages.getString("MainFrame.jar.integrity.test") - + path); - Util.exec(new String[] { "java", "-jar", path }, log); - } - return null; - } - }); - } catch (Exception ex) { - // XXX errors logged by exec - } finally { - getGlassPane().setVisible(false); - } - }; - } - - private class AboutActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - info(Main.getDescription()); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on 2005-05-09 + */ +package net.sf.launch4j.formimpl; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JToolBar; +import javax.swing.UIManager; + +import com.jgoodies.looks.Options; +import com.jgoodies.looks.plastic.PlasticXPLookAndFeel; + +import foxtrot.Task; +import foxtrot.Worker; + +import net.sf.launch4j.Builder; +import net.sf.launch4j.BuilderException; +import net.sf.launch4j.ExecException; +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.Log; +import net.sf.launch4j.Main; +import net.sf.launch4j.Util; +import net.sf.launch4j.binding.Binding; +import net.sf.launch4j.binding.BindingException; +import net.sf.launch4j.binding.InvariantViolationException; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.config.ConfigPersisterException; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class MainFrame extends JFrame { + private static MainFrame _instance; + + private final JToolBar _toolBar; + private final JButton _runButton; + private final ConfigFormImpl _configForm; + private final JFileChooser _fileChooser = new FileChooser(MainFrame.class); + private File _outfile; + private boolean _saved = false; + + public static void createInstance() { + try { + Toolkit.getDefaultToolkit().setDynamicLayout(true); + System.setProperty("sun.awt.noerasebackground","true"); + + // JGoodies + Options.setDefaultIconSize(new Dimension(16, 16)); // menu icons + Options.setUseNarrowButtons(false); + Options.setPopupDropShadowEnabled(true); + + UIManager.setLookAndFeel(new PlasticXPLookAndFeel()); + _instance = new MainFrame(); + } catch (Exception e) { + System.err.println(e); + } + } + + public static MainFrame getInstance() { + return _instance; + } + + public MainFrame() { + showConfigName(null); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + addWindowListener(new MainFrameListener()); + setGlassPane(new GlassPane(this)); + _fileChooser.setFileFilter(new FileChooserFilter( + Messages.getString("MainFrame.config.files"), + new String[] {".xml", ".cfg"})); + + _toolBar = new JToolBar(); + _toolBar.setFloatable(false); + _toolBar.setRollover(true); + addButton("images/new.png", Messages.getString("MainFrame.new.config"), + new NewActionListener()); + addButton("images/open.png", Messages.getString("MainFrame.open.config"), + new OpenActionListener()); + addButton("images/save.png", Messages.getString("MainFrame.save.config"), + new SaveActionListener()); + _toolBar.addSeparator(); + addButton("images/build.png", Messages.getString("MainFrame.build.wrapper"), + new BuildActionListener()); + _runButton = addButton("images/run.png", + Messages.getString("MainFrame.test.wrapper"), + new RunActionListener()); + setRunEnabled(false); + _toolBar.addSeparator(); + addButton("images/info.png", Messages.getString("MainFrame.about.launch4j"), + new AboutActionListener()); + + _configForm = new ConfigFormImpl(); + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(_toolBar, BorderLayout.NORTH); + getContentPane().add(_configForm, BorderLayout.CENTER); + pack(); + Dimension scr = Toolkit.getDefaultToolkit().getScreenSize(); + Dimension fr = getSize(); + fr.width += 25; + fr.height += 100; + setBounds((scr.width - fr.width) / 2, (scr.height - fr.height) / 2, + fr.width, fr.height); + setVisible(true); + } + + private JButton addButton(String iconPath, String tooltip, ActionListener l) { + ImageIcon icon = new ImageIcon(MainFrame.class.getClassLoader() + .getResource(iconPath)); + JButton b = new JButton(icon); + b.setToolTipText(tooltip); + b.addActionListener(l); + _toolBar.add(b); + return b; + } + + public void info(String text) { + JOptionPane.showMessageDialog(this, + text, + Main.getName(), + JOptionPane.INFORMATION_MESSAGE); + } + + public void warn(String text) { + JOptionPane.showMessageDialog(this, + text, + Main.getName(), + JOptionPane.WARNING_MESSAGE); + } + + public void warn(InvariantViolationException e) { + Binding b = e.getBinding(); + if (b != null) { + b.markInvalid(); + } + warn(e.getMessage()); + if (b != null) { + e.getBinding().markValid(); + } + } + + public boolean confirm(String text) { + return JOptionPane.showConfirmDialog(MainFrame.this, + text, + Messages.getString("MainFrame.confirm"), + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; + } + + private boolean isModified() { + return (!_configForm.isModified()) + || confirm(Messages.getString("MainFrame.discard.changes")); + } + + private boolean save() { + // XXX + try { + _configForm.get(ConfigPersister.getInstance().getConfig()); + if (_fileChooser.showSaveDialog(MainFrame.this) == JOptionPane.YES_OPTION) { + File f = _fileChooser.getSelectedFile(); + if (!f.getPath().endsWith(".xml")) { + f = new File(f.getPath() + ".xml"); + } + ConfigPersister.getInstance().save(f); + _saved = true; + showConfigName(f); + return true; + } + return false; + } catch (InvariantViolationException ex) { + warn(ex); + return false; + } catch (BindingException ex) { + warn(ex.getMessage()); + return false; + } catch (ConfigPersisterException ex) { + warn(ex.getMessage()); + return false; + } + } + + private void showConfigName(File config) { + setTitle(Main.getName() + " - " + (config != null ? config.getName() + : Messages.getString("MainFrame.untitled"))); + } + + private void setRunEnabled(boolean enabled) { + if (!enabled) { + _outfile = null; + } + _runButton.setEnabled(enabled); + } + + private void clearConfig() { + ConfigPersister.getInstance().createBlank(); + _configForm.clear(ConfigPersister.getInstance().getConfig()); + } + + private class MainFrameListener extends WindowAdapter { + public void windowOpened(WindowEvent e) { + clearConfig(); + } + + public void windowClosing(WindowEvent e) { + if (isModified()) { + System.exit(0); + } + } + } + + private class NewActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + if (isModified()) { + clearConfig(); + } + _saved = false; + showConfigName(null); + setRunEnabled(false); + } + } + + private class OpenActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + try { + if (isModified() && _fileChooser.showOpenDialog(MainFrame.this) + == JOptionPane.YES_OPTION) { + final File f = _fileChooser.getSelectedFile(); + if (f.getPath().endsWith(".xml")) { + ConfigPersister.getInstance().load(f); + _saved = true; + } else { + ConfigPersister.getInstance().loadVersion1(f); + _saved = false; + } + _configForm.put(ConfigPersister.getInstance().getConfig()); + showConfigName(f); + setRunEnabled(false); + } + } catch (ConfigPersisterException ex) { + warn(ex.getMessage()); + } catch (BindingException ex) { + warn(ex.getMessage()); + } + } + } + + private class SaveActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + save(); + } + } + + private class BuildActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + final Log log = Log.getSwingLog(_configForm.getLogTextArea()); + try { + if ((!_saved || _configForm.isModified()) + && !save()) { + return; + } + log.clear(); + ConfigPersister.getInstance().getConfig().checkInvariants(); + Builder b = new Builder(log); + _outfile = b.build(); + setRunEnabled(ConfigPersister.getInstance().getConfig() + .getHeaderType() == Config.GUI_HEADER // TODO fix console app test + && (Util.WINDOWS_OS || !ConfigPersister.getInstance() + .getConfig().isDontWrapJar())); + } catch (InvariantViolationException ex) { + setRunEnabled(false); + ex.setBinding(_configForm.getBinding(ex.getProperty())); + warn(ex); + } catch (BuilderException ex) { + setRunEnabled(false); + log.append(ex.getMessage()); + } + } + } + + private class RunActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + try { + getGlassPane().setVisible(true); + Worker.post(new Task() { + public Object run() throws ExecException { + Log log = Log.getSwingLog(_configForm.getLogTextArea()); + log.clear(); + String path = _outfile.getPath(); + if (Util.WINDOWS_OS) { + log.append(Messages.getString("MainFrame.executing") + path); + Util.exec(new String[] { path }, log); + } else { + log.append(Messages.getString("MainFrame.jar.integrity.test") + + path); + Util.exec(new String[] { "java", "-jar", path }, log); + } + return null; + } + }); + } catch (Exception ex) { + // XXX errors logged by exec + } finally { + getGlassPane().setVisible(false); + } + }; + } + + private class AboutActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + info(Main.getDescription()); + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/Messages.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/Messages.java old mode 100755 new mode 100644 index 5e1c64110db..5285552b7b4 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/Messages.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/Messages.java @@ -1,55 +1,55 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -package net.sf.launch4j.formimpl; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.formimpl.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +package net.sf.launch4j.formimpl; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.formimpl.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java old mode 100755 new mode 100644 index c05d7f0474d..356c50eb26a --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java @@ -1,58 +1,58 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on Oct 7, 2006 - */ -package net.sf.launch4j.formimpl; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Msg; -import net.sf.launch4j.form.MessagesForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class MessagesFormImpl extends MessagesForm { - - public MessagesFormImpl(Bindings bindings) { - Msg m = new Msg(); - bindings.addOptComponent("messages", Msg.class, _messagesCheck) - .add("messages.startupErr", _startupErrTextArea, m.getStartupErr()) - .add("messages.bundledJreErr", _bundledJreErrTextArea, m.getBundledJreErr()) - .add("messages.jreVersionErr", _jreVersionErrTextArea, m.getJreVersionErr()) - .add("messages.launcherErr", _launcherErrTextArea, m.getLauncherErr()) - .add("messages.instanceAlreadyExistsMsg", _instanceAlreadyExistsMsgTextArea, - m.getInstanceAlreadyExistsMsg()); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on Oct 7, 2006 + */ +package net.sf.launch4j.formimpl; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.Msg; +import net.sf.launch4j.form.MessagesForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class MessagesFormImpl extends MessagesForm { + + public MessagesFormImpl(Bindings bindings) { + Msg m = new Msg(); + bindings.addOptComponent("messages", Msg.class, _messagesCheck) + .add("messages.startupErr", _startupErrTextArea, m.getStartupErr()) + .add("messages.bundledJreErr", _bundledJreErrTextArea, m.getBundledJreErr()) + .add("messages.jreVersionErr", _jreVersionErrTextArea, m.getJreVersionErr()) + .add("messages.launcherErr", _launcherErrTextArea, m.getLauncherErr()) + .add("messages.instanceAlreadyExistsMsg", _instanceAlreadyExistsMsgTextArea, + m.getInstanceAlreadyExistsMsg()); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/SingleInstanceFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/SingleInstanceFormImpl.java old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java old mode 100755 new mode 100644 index 7413d4a213f..d4f00863112 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java @@ -1,61 +1,61 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.JFileChooser; - -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Splash; -import net.sf.launch4j.form.SplashForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class SplashFormImpl extends SplashForm { - - public SplashFormImpl(Bindings bindings, JFileChooser fc) { - bindings.addOptComponent("splash", Splash.class, _splashCheck) - .add("splash.file", _splashFileField) - .add("splash.waitForWindow", _waitForWindowCheck, true) - .add("splash.timeout", _timeoutField, "60") - .add("splash.timeoutErr", _timeoutErrCheck, true); - - _splashFileButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Bitmap files (.bmp)", ".bmp"), _splashFileField)); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.JFileChooser; + +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.Splash; +import net.sf.launch4j.form.SplashForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class SplashFormImpl extends SplashForm { + + public SplashFormImpl(Bindings bindings, JFileChooser fc) { + bindings.addOptComponent("splash", Splash.class, _splashCheck) + .add("splash.file", _splashFileField) + .add("splash.waitForWindow", _waitForWindowCheck, true) + .add("splash.timeout", _timeoutField, "60") + .add("splash.timeoutErr", _timeoutErrCheck, true); + + _splashFileButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Bitmap files (.bmp)", ".bmp"), _splashFileField)); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java old mode 100755 new mode 100644 index c2f60d1d38a..d7c52e40111 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java @@ -1,63 +1,63 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.JFileChooser; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.VersionInfo; -import net.sf.launch4j.form.VersionInfoForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class VersionInfoFormImpl extends VersionInfoForm { - - public VersionInfoFormImpl(Bindings bindings, JFileChooser fc) { - bindings.addOptComponent("versionInfo", VersionInfo.class, _versionInfoCheck) - .add("versionInfo.fileVersion", _fileVersionField) - .add("versionInfo.productVersion", _productVersionField) - .add("versionInfo.fileDescription", _fileDescriptionField) - .add("versionInfo.internalName", _internalNameField) - .add("versionInfo.originalFilename", _originalFilenameField) - .add("versionInfo.productName", _productNameField) - .add("versionInfo.txtFileVersion", _txtFileVersionField) - .add("versionInfo.txtProductVersion", _txtProductVersionField) - .add("versionInfo.companyName", _companyNameField) - .add("versionInfo.copyright", _copyrightField); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.JFileChooser; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.VersionInfo; +import net.sf.launch4j.form.VersionInfoForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class VersionInfoFormImpl extends VersionInfoForm { + + public VersionInfoFormImpl(Bindings bindings, JFileChooser fc) { + bindings.addOptComponent("versionInfo", VersionInfo.class, _versionInfoCheck) + .add("versionInfo.fileVersion", _fileVersionField) + .add("versionInfo.productVersion", _productVersionField) + .add("versionInfo.fileDescription", _fileDescriptionField) + .add("versionInfo.internalName", _internalNameField) + .add("versionInfo.originalFilename", _originalFilenameField) + .add("versionInfo.productName", _productNameField) + .add("versionInfo.txtFileVersion", _txtFileVersionField) + .add("versionInfo.txtProductVersion", _txtProductVersionField) + .add("versionInfo.companyName", _companyNameField) + .add("versionInfo.copyright", _copyrightField); + } +} diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages.properties old mode 100755 new mode 100644 index 53a2442a886..f168a8f5fa3 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages.properties @@ -1,74 +1,74 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -tab.basic=Basic -tab.classpath=Classpath -tab.header=Header -tab.singleInstance=Single instance -tab.jre=JRE -tab.envVars=Set env. variables -tab.splash=Splash -tab.version=Version Info -tab.messages=Messages - -# Basic -jar=Jar: -jarPath=Jar runtime path: -jarTip=Application jar. -jarPathTip=Optional runtime path of the jar relative to the executable. For example, if the executable launcher and the application jar named calc.exe and calc.jar are in the same directory, it would be: calc.jar. - -# Classpath -specifyClassPath=Specify classpath item to add. -confirmClassPathRemoval=Remove selected classpath items? -noManifest=The selected jar does not have a manifest. - -# JRE -specifyVar=Specify environment variable to add. -otherVar=Other var -jdkPreference.jre.only=Only use public JREs -jdkPreference.prefer.jre=Prefer public JRE, but use JDK runtime if newer -jdkPreference.prefer.jdk=Prefer JDK runtime, but use public JRE if newer -jdkPreference.jdk.only=Only use private JDK runtimes - -MainFrame.config.files=launch4j config files (.xml, .cfg) -MainFrame.new.config=New configuration -MainFrame.open.config=Open configuration or import 1.x -MainFrame.save.config=Save configuration -MainFrame.build.wrapper=Build wrapper -MainFrame.test.wrapper=Test wrapper -MainFrame.about.launch4j=About launch4j -MainFrame.discard.changes=Discard changes? -MainFrame.confirm=Confirm -MainFrame.untitled=untitled -MainFrame.executing=Executing: -MainFrame.jar.integrity.test=Jar integrity test, executing: +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +tab.basic=Basic +tab.classpath=Classpath +tab.header=Header +tab.singleInstance=Single instance +tab.jre=JRE +tab.envVars=Set env. variables +tab.splash=Splash +tab.version=Version Info +tab.messages=Messages + +# Basic +jar=Jar: +jarPath=Jar runtime path: +jarTip=Application jar. +jarPathTip=Optional runtime path of the jar relative to the executable. For example, if the executable launcher and the application jar named calc.exe and calc.jar are in the same directory, it would be: calc.jar. + +# Classpath +specifyClassPath=Specify classpath item to add. +confirmClassPathRemoval=Remove selected classpath items? +noManifest=The selected jar does not have a manifest. + +# JRE +specifyVar=Specify environment variable to add. +otherVar=Other var +jdkPreference.jre.only=Only use public JREs +jdkPreference.prefer.jre=Prefer public JRE, but use JDK runtime if newer +jdkPreference.prefer.jdk=Prefer JDK runtime, but use public JRE if newer +jdkPreference.jdk.only=Only use private JDK runtimes + +MainFrame.config.files=launch4j config files (.xml, .cfg) +MainFrame.new.config=New configuration +MainFrame.open.config=Open configuration or import 1.x +MainFrame.save.config=Save configuration +MainFrame.build.wrapper=Build wrapper +MainFrame.test.wrapper=Test wrapper +MainFrame.about.launch4j=About launch4j +MainFrame.discard.changes=Discard changes? +MainFrame.confirm=Confirm +MainFrame.untitled=untitled +MainFrame.executing=Executing: +MainFrame.jar.integrity.test=Jar integrity test, executing: diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties old mode 100755 new mode 100644 index 1d2fac25f5f..42e2a996523 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties @@ -1,56 +1,56 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -tab.basic = B\u00E1sico -tab.header = Cabecera -tab.jre = JRE -tab.splash = Pantalla de bienvenida -tab.version = Informaci\u00F3n de la versi\u00F3n - -jar = Jar -jarPath = Ruta del jar -jarTip = Jar de la aplicaci\u00F3n. -jarPathTip = Ruta del jar relativa al ejecutable. Por ejemplo, si el lanzador ejecutable y el jar de la aplicaci\u00F3n, llamados calc.exe y calc.jar respectivamente, est\u00E1n en el mismo directorio, ser\u00EDa\: calc.jar. - -MainFrame.config.files = Ficheros de configuraci\u00F3n de launch4j (.xml, .cfg) -MainFrame.new.config = Nueva configuraci\u00F3n -MainFrame.open.config = Abrir configuraci\u00F3n o importar 1.x -MainFrame.save.config = Guardar configuraci\u00F3n -MainFrame.build.wrapper = Construir el empaquetador -MainFrame.test.wrapper = Comprobar el empaquetador -MainFrame.about.launch4j = Acerca de launch4j -MainFrame.discard.changes = \u00BFDescartar cambios? -MainFrame.confirm = Confirmar -MainFrame.untitled = Sin nombre -MainFrame.executing = Ejecutando\: -MainFrame.jar.integrity.test = Prueba de integridad jar, ejecutando\: +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +tab.basic = B\u00E1sico +tab.header = Cabecera +tab.jre = JRE +tab.splash = Pantalla de bienvenida +tab.version = Informaci\u00F3n de la versi\u00F3n + +jar = Jar +jarPath = Ruta del jar +jarTip = Jar de la aplicaci\u00F3n. +jarPathTip = Ruta del jar relativa al ejecutable. Por ejemplo, si el lanzador ejecutable y el jar de la aplicaci\u00F3n, llamados calc.exe y calc.jar respectivamente, est\u00E1n en el mismo directorio, ser\u00EDa\: calc.jar. + +MainFrame.config.files = Ficheros de configuraci\u00F3n de launch4j (.xml, .cfg) +MainFrame.new.config = Nueva configuraci\u00F3n +MainFrame.open.config = Abrir configuraci\u00F3n o importar 1.x +MainFrame.save.config = Guardar configuraci\u00F3n +MainFrame.build.wrapper = Construir el empaquetador +MainFrame.test.wrapper = Comprobar el empaquetador +MainFrame.about.launch4j = Acerca de launch4j +MainFrame.discard.changes = \u00BFDescartar cambios? +MainFrame.confirm = Confirmar +MainFrame.untitled = Sin nombre +MainFrame.executing = Ejecutando\: +MainFrame.jar.integrity.test = Prueba de integridad jar, ejecutando\: diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/messages.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/messages.properties old mode 100755 new mode 100644 index cf28d15afd4..77cbcfd13a0 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/messages.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/messages.properties @@ -1,45 +1,45 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -Main.usage=usage - -Builder.compiling.resources=Compiling resources -Builder.linking=Linking -Builder.wrapping=Wrapping -Builder.success=Successfully created -Builder.generated.resource.file=Generated resource file...\n -Builder.line.has.errors=Line {0} has errors... - -Util.exec.failed=Exec failed -Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. -Util.use.double.backslash=Use \\\\ to code Windows paths in fields that don't represent files or paths! +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +Main.usage=usage + +Builder.compiling.resources=Compiling resources +Builder.linking=Linking +Builder.wrapping=Wrapping +Builder.success=Successfully created +Builder.generated.resource.file=Generated resource file...\n +Builder.line.has.errors=Line {0} has errors... + +Util.exec.failed=Exec failed +Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. +Util.use.double.backslash=Use \\\\ to code Windows paths in fields that don't represent files or paths! diff --git a/build/windows/launcher/launch4j/src/net/sf/launch4j/messages_es.properties b/build/windows/launcher/launch4j/src/net/sf/launch4j/messages_es.properties old mode 100755 new mode 100644 index b179d9bd511..d7da9bc8217 --- a/build/windows/launcher/launch4j/src/net/sf/launch4j/messages_es.properties +++ b/build/windows/launcher/launch4j/src/net/sf/launch4j/messages_es.properties @@ -1,45 +1,45 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -# - -Main.usage=Uso - -Builder.compiling.resources=Compilando recursos -Builder.linking=Enlazando -Builder.wrapping=Empaquetando -Builder.success=Creado con \ufffdxito -Builder.generated.resource.file=Fichero de recursos generado...\n -Builder.line.has.errors=Line {0} has errors... - -Util.exec.failed=Fallo en la ejecuci\ufffd -Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Mart�nez Ros +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Launch4j 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# + +Main.usage=Uso + +Builder.compiling.resources=Compilando recursos +Builder.linking=Enlazando +Builder.wrapping=Empaquetando +Builder.success=Creado con \ufffdxito +Builder.generated.resource.file=Fichero de recursos generado...\n +Builder.line.has.errors=Line {0} has errors... + +Util.exec.failed=Fallo en la ejecuci\ufffd +Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. Util.use.double.backslash=Use \\\\ to code Windows paths in fields that don't represent files or paths! \ No newline at end of file diff --git a/build/windows/launcher/launch4j/w32api/MinGW.LICENSE.txt b/build/windows/launcher/launch4j/w32api/MinGW.LICENSE.txt old mode 100755 new mode 100644 index 141412dd9f1..aea85bd8dcd --- a/build/windows/launcher/launch4j/w32api/MinGW.LICENSE.txt +++ b/build/windows/launcher/launch4j/w32api/MinGW.LICENSE.txt @@ -1,25 +1,25 @@ -MinGW - Licensing Terms - -Various pieces distributed with MinGW come with its own copyright and license: - -Basic MinGW runtime - MinGW base runtime package is uncopyrighted and placed in the public domain. - This basically means that you can do what you want with the code. - -w32api - You are free to use, modify and copy this package. - No restrictions are imposed on programs or object files compiled with this library. - You may not restrict the the usage of this library. - You may distribute this library as part of another package or as a modified package - if and only if you do not restrict the usage of the portions consisting - of this (optionally modified) library. - If distributed as a modified package then this file must be included. - - 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. - -MinGW profiling code - MinGW profiling code is distributed under the GNU General Public License. - -The development tools such as GCC, GDB, GNU Make, etc all covered by GNU General Public License. +MinGW - Licensing Terms + +Various pieces distributed with MinGW come with its own copyright and license: + +Basic MinGW runtime + MinGW base runtime package is uncopyrighted and placed in the public domain. + This basically means that you can do what you want with the code. + +w32api + You are free to use, modify and copy this package. + No restrictions are imposed on programs or object files compiled with this library. + You may not restrict the the usage of this library. + You may distribute this library as part of another package or as a modified package + if and only if you do not restrict the usage of the portions consisting + of this (optionally modified) library. + If distributed as a modified package then this file must be included. + + 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. + +MinGW profiling code + MinGW profiling code is distributed under the GNU General Public License. + +The development tools such as GCC, GDB, GNU Make, etc all covered by GNU General Public License. diff --git a/build/windows/launcher/launch4j/web/bullet.gif b/build/windows/launcher/launch4j/web/bullet.gif old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/web/changelog.html b/build/windows/launcher/launch4j/web/changelog.html old mode 100755 new mode 100644 index 83511a55489..08ea00849e1 --- a/build/windows/launcher/launch4j/web/changelog.html +++ b/build/windows/launcher/launch4j/web/changelog.html @@ -1,48 +1,48 @@ - - - - Launch4j - Cross-platform Java executable wrapper - - - - - - - -

-
- launch4j 3.0.1 -
- -
-

Changelog

- -

Changes in version 3.0.1 (20-07-2008)

-
    -
  • Enhanced the runtime logging (--l4j-debug).
  • -
  • Fixed critical bug #1925387 64-bit JDK detection problem caused a runtime search error (found by Stivo).
  • -
  • Fixed bug #1919406, #1989479 Not every option is loaded from saved xml file (found by Robert Lachner, Jan-Philipp Rathje).
  • -
  • Fixed bug #1930222 Simple typo (found by Daniel).
  • -
+ + + + Launch4j - Cross-platform Java executable wrapper + + + + + + + +
+
+ launch4j 3.0.1 +
+ +
+

Changelog

+ +

Changes in version 3.0.1 (20-07-2008)

+
    +
  • Enhanced the runtime logging (--l4j-debug).
  • +
  • Fixed critical bug #1925387 64-bit JDK detection problem caused a runtime search error (found by Stivo).
  • +
  • Fixed bug #1919406, #1989479 Not every option is loaded from saved xml file (found by Robert Lachner, Jan-Philipp Rathje).
  • +
  • Fixed bug #1930222 Simple typo (found by Daniel).
  • +

Changes in version 3.0.0 (16-03-2008)

    @@ -65,292 +65,292 @@

    Changed license to BSD, MIT (26-01-2008)

    will be licensed under the similar MIT license.
- -

Changes in version 3.0.0-pre2 (29-10-2006)

-
    -
  • Enhanced GUI.
  • -
  • Redesigned error reporting.
  • -
  • Added custom error messages.
  • -
  • Added support website feature.
  • -
  • Added PWD and OLDPWD special variables and access to the registry.
  • -
  • Runtime ini file extension changed to .l4j.ini, added comments (#).
  • -
  • FR #1427811 Initial process priority.
  • -
  • FR #1547339 Added VarFileInfo structure to Version Info (Stephan Laertz).
  • -
  • FR #1584295 Updated documentation for --l4j-debug. -
  • Fixed <jarArgs/> and <args/> config conversion bug (found by Dafe Simonek).
  • -
  • Fixed the Ant task exception reporting bug, added tmpdir and bindir attributes.
  • -
  • Fixed bug #1563415 Problem with launching application when ini file exists (found by mojomax).
  • -
  • Fixed bug #1527619 Console header wildcard expansion (found by erikjv).
  • -
  • Fixed bug #1544167 NPE when dontwrap and only classpath given (found by Hendrik Schreiber).
  • -
  • Fixed bug #1584264 Dropdown boxes get mixed up (found by Larsen).
  • -
- -

News (17-10-2006)

- - -

Changes in version 3.0.0-pre1 (21-07-2006)

-
    -
  • Improved configuration file format and embedded Ant config.
  • -
  • Launch executable jars, regular jars and class files.
  • -
  • Added dynamic classpath resolution with environment variable references and wildcards.
  • -
  • Added option to set environment variables before launching the application.
  • -
  • New command line switches to change the compiled options.
  • -
  • Improved debug information.
  • -
  • Added support for XP visual style manifests.
  • -
  • Added option to disable use of private JREs.
  • -
  • Many small fixes and improvements...
  • -
- -

Configuration file changes in 3.x

-
    -
  • Previous formats (1.x and 2.x) are supported.
  • -
  • <headerType> accepts gui|console
  • -
  • <jarArgs> was changed to <cmdLine>
  • -
  • - <launch4jConfig><headerObjects><file> was changed to - <launch4jConfig><obj> -
  • -
  • - <launch4jConfig><libs><file> was changed to - <launch4jConfig><lib> -
  • -
  • - <launch4jConfig><jre><args> was changed to multiple - <launch4jConfig><jre><opt> -
  • -
- -

Embedded Ant configuration changes in 3.x

-
    -
  • - <jre args="value"> was changed to - <jre><opt>value</opt></jre> -
  • -
  • Now it's possible to define headerObjects, libs and classpath.
  • -
- -

Changes in version 2.1.5 (21-07-2006)

-
    -
  • Changed the Java download site to http://java.com/download.
  • -
  • Now it's possible to use absolute and relative paths to specify the bundled JRE.
  • -
- -

Changes in version 2.1.4 (15-06-2006)

-
    -
  • - Fixed bug #1503996 Only the first wrapper instance had a custom process name - (found by Helge Böhme). -
  • -
- -

Changes in version 2.1.3 (31-05-2006)

-
    -
  • - Fixed bug #1497453 Ant task doesn't support relative jar path with '..' - (found by Aston, Pavel Moukhataev). -
  • -
  • Jar argument size limit is now 16KB.
  • -
  • Environment variable size limit raised to 32KB.
  • -
  • Allow to concatenate multiple env. variables in one property (Maria D.)
  • -
  • Added launch4j.tmpdir property.
  • -
- -

Changes in version 2.1.2 (03-04-2006)

-
    -
  • Important bugfix: insufficient command line buffer size was increased to 32KB - (found by Sebastian Kopsan).
  • -
  • Added runtime JVM options from an .ini file.
  • -
  • Launch4j's bin directory is now configurable through launch4j.bindir - system property.
  • -
- -

Changes in version 2.1.1 (25-01-2006)

-
    -
  • Fixed bug #1402748. Validation error occurred when using an Ant task with - embedded config and dontWrapJar option (found by Chris Nokleberg).
  • -
- -

Changes in version 2.1.0 (10-01-2006)

-
    -
  • More features and smaller header: 18 KB!!
  • -
  • Added launcher mode, you can choose whether or not to wrap the jar.
  • -
  • Spanish translation of the website/docs and program messages - (Patricio Martínez Ros).
  • -
  • JRE's bin directory is appended to the Path environment variable - (Ianiv Schweber).
  • -
  • Added special variables EXEDIR and EXEFILE that hold the executable's - directory and full path.
  • -
  • Support for mapping environment variables to system properties.
  • -
  • Added debug launching mode - various information is displayed before - starting the Java application.
  • -
  • Fixed min/max JRE version checking, previous versions allowed these - to be equal (found by Ryan).
  • -
  • Bug fixed. Quotes in jar/JVM arguments were handled incorrectly (found by Juan Alvarez Ferrando).
  • -
  • A few other enhancements.
  • -
- -

Changes in version 2.0.0 (31-10-2005)

-
    -
  • Launch4j for Mac OS X is available thanks to Peter Centgraf.
  • -
  • Added support for custom headers.
  • -
  • Fixed bug #1343908, command line arguments with spaces were handled - incorrectly by the console header (found by Oliver Schaefer / Steve Alberty).
  • -
  • Fixed stdin redirection bug (found by Timo Santasalo).
  • -
- -

Changes in version 2.0 RC3 (13-08-2005) - final RC

-
    -
  • Correct handling of pathnames with spaces.
  • -
  • Fixed the '%20' pathname bug.
  • -
  • Fixed basedir bug (Richard Xing).
  • -
  • Splash screen can be closed when the application window becomes visible - with out specifying it's title (Martin Busik). - Update your config file: <waitForTitle>title</waitForTitle> - is now <waitForWindow>true</waitForWindow>. -
  • -
  • Fixed build.bat files in demo directories.
  • -
- -

Changes in version 2.0 RC2 (21-06-2005)

-
    -
  • chdir allows to change the current directory to arbitrary paths - relative to the executable (FR #1144907). It's incompatible with - previous versions, update your config file: - <chdir>true</chdir> - is now <chdir>.</chdir>. -
  • -
  • Bundled JRE path no longer depends on chdir function.
  • -
  • Fixed Ant task bug, build files outside launch4j's directory - wouldn't work. Josh Elsasser submitted a patch that works without - setting launch4j's home dir in the build file. Thanks! -
  • -
  • Removed static edge from splash screen (Serge Baranov).
  • -
  • Program checks that the output file path doesn't contain spaces.
  • -
  • Fixed a NPE bug caused by a missing maxVersion property - (found by Morgan Schweers). -
  • -
  • Fixed relative JRE path bug (found by Nili_).
  • -
  • Cleaned up the Builder class.
  • -
  • Fixed Ant task NPE where the config was entirely defined in the - build file (Josh Elsasser). -
  • -
- -

Changes in version 2.0 RC (07-06-2005)

-
    -
  • Added an Ant task for better build integration.
  • -
  • Added 2.x documentation.
  • -
  • Updated the demo configuration files.
  • -
  • Fixed issues with relative paths in the configuration.
  • -
  • Removed the '-1' option in console mode.
  • -
  • Minor fixes.
  • -
- -

Changes in version 2.0 beta2 (23-05-2005)

-
    -
  • # comments are recognized when importing 1.x cfg files.
  • -
  • Added version information.
  • -
  • Resource file is displayed when a resource error occurs.
  • -
  • Fixed a bug found by Max, options on the first tab were always enabled.
  • -
- -

Changes in version 2.0 beta1 (13-05-2005)

-
    -
  • Completely new, cross-platform wrapper - create windows executables on Linux.
  • -
  • New .xml configuration file.
  • -
  • Application icon with multiple resolutions and color depths.
  • -
  • Swing GUI interface.
  • -
  • Header compiled with MinGW port of gcc instead of VC++.
  • -
- -

Changes in version 1.4.2 (12-03-2005)

-
    -
  • Fixed bug #1158143, stayAlive without a splash screen caused - an infinite loop (found by Gregory Kotsaftis). -
  • -
- -

Changes in version 1.4.1 (04-03-2005)

-
    -
  • Fixed bug #1119040, buffer for reading config properties - was too short (found by Tom Jensen and Neil). -
  • -
  • Added configurable splash timeout (FR #1102951).
  • -
  • Added option to disable the error message on splash timeout (FR #1109159).
  • -
  • Option to keep the gui launcher 'alive' after starting an application (FR #1124653).
  • -
  • Removed version info.
  • -
  • 'waitfor' property is now optional.
  • -
- -

Changes in version 1.4.0 (26-01-2005)

-
    -
  • Removed .lch4j suffix from process name, now it has the - form of the executable filename. The temporary launchers are stored in - launch4j-tmp directory (suggested by Emmanuel). -
  • -
  • Added support for console apps (FR #1050053).
  • -
- -

Changes in version 1.3.1 (05-11-2004)

-
    -
  • Fixed a bug where explorer window was opened instead of - launching the application when setProcName was set to false - (found by Rob Jones). -
  • -
  • Fixed temporary launcher deletion bug.
  • -
- -

Changes in version 1.3.0 (01-11-2004)

-
    -
  • Now you can configure launch4j to: -
      -
    • Use a bundled JRE.
    • -
    • Search for java, show an error message if the - right version cannot be found and open the java download page.
    • -
    • And a feature you asked for: use bundled JRE, if - that fails search for java and bring up the java download page on error.
    • -
    -
  • -
  • Enhanced code that sets the custom process name. In - case launch4j can't refresh the temporary launcher, bundled JRE on a - read only file system for example, it will use one created previously, - if it's present and has the correct size. If not, launching will still - continue, but with javaw.exe process name.Temporary launchers are - now created in the jre directory instead of jre/bin. -
  • -
  • errTitle property allows to set the title of the error message box.
  • -
- -

Changes in version 1.2.1 (25-09-2004)

-
    -
  • Bugfix that allows launching from command line using short - name (#1026514 / found by Zach Del) -
  • -
- -

Changes in version 1.2.0 (10-09-2004)

-
    -
  • Custom process name (myapp.lch4j.exe)
  • -
  • 9 KB stub!
  • -
  • Jar arguments
  • -
  • Bugfix that allows launching from command line.
  • -
  • Hide splash on javaw error.
  • -
  • Easier configuration with case insensitive parameters + show unrecognized parameter.
  • -
  • 12 KB demo application, 34 KB with splash screen.
  • -
  • Configuration parameter 'args' changed to 'jvmArgs'
  • -
-
+ +

Changes in version 3.0.0-pre2 (29-10-2006)

+
    +
  • Enhanced GUI.
  • +
  • Redesigned error reporting.
  • +
  • Added custom error messages.
  • +
  • Added support website feature.
  • +
  • Added PWD and OLDPWD special variables and access to the registry.
  • +
  • Runtime ini file extension changed to .l4j.ini, added comments (#).
  • +
  • FR #1427811 Initial process priority.
  • +
  • FR #1547339 Added VarFileInfo structure to Version Info (Stephan Laertz).
  • +
  • FR #1584295 Updated documentation for --l4j-debug. +
  • Fixed <jarArgs/> and <args/> config conversion bug (found by Dafe Simonek).
  • +
  • Fixed the Ant task exception reporting bug, added tmpdir and bindir attributes.
  • +
  • Fixed bug #1563415 Problem with launching application when ini file exists (found by mojomax).
  • +
  • Fixed bug #1527619 Console header wildcard expansion (found by erikjv).
  • +
  • Fixed bug #1544167 NPE when dontwrap and only classpath given (found by Hendrik Schreiber).
  • +
  • Fixed bug #1584264 Dropdown boxes get mixed up (found by Larsen).
  • +
+ +

News (17-10-2006)

+ + +

Changes in version 3.0.0-pre1 (21-07-2006)

+
    +
  • Improved configuration file format and embedded Ant config.
  • +
  • Launch executable jars, regular jars and class files.
  • +
  • Added dynamic classpath resolution with environment variable references and wildcards.
  • +
  • Added option to set environment variables before launching the application.
  • +
  • New command line switches to change the compiled options.
  • +
  • Improved debug information.
  • +
  • Added support for XP visual style manifests.
  • +
  • Added option to disable use of private JREs.
  • +
  • Many small fixes and improvements...
  • +
+ +

Configuration file changes in 3.x

+
    +
  • Previous formats (1.x and 2.x) are supported.
  • +
  • <headerType> accepts gui|console
  • +
  • <jarArgs> was changed to <cmdLine>
  • +
  • + <launch4jConfig><headerObjects><file> was changed to + <launch4jConfig><obj> +
  • +
  • + <launch4jConfig><libs><file> was changed to + <launch4jConfig><lib> +
  • +
  • + <launch4jConfig><jre><args> was changed to multiple + <launch4jConfig><jre><opt> +
  • +
+ +

Embedded Ant configuration changes in 3.x

+
    +
  • + <jre args="value"> was changed to + <jre><opt>value</opt></jre> +
  • +
  • Now it's possible to define headerObjects, libs and classpath.
  • +
+ +

Changes in version 2.1.5 (21-07-2006)

+
    +
  • Changed the Java download site to http://java.com/download.
  • +
  • Now it's possible to use absolute and relative paths to specify the bundled JRE.
  • +
+ +

Changes in version 2.1.4 (15-06-2006)

+
    +
  • + Fixed bug #1503996 Only the first wrapper instance had a custom process name + (found by Helge Böhme). +
  • +
+ +

Changes in version 2.1.3 (31-05-2006)

+
    +
  • + Fixed bug #1497453 Ant task doesn't support relative jar path with '..' + (found by Aston, Pavel Moukhataev). +
  • +
  • Jar argument size limit is now 16KB.
  • +
  • Environment variable size limit raised to 32KB.
  • +
  • Allow to concatenate multiple env. variables in one property (Maria D.)
  • +
  • Added launch4j.tmpdir property.
  • +
+ +

Changes in version 2.1.2 (03-04-2006)

+
    +
  • Important bugfix: insufficient command line buffer size was increased to 32KB + (found by Sebastian Kopsan).
  • +
  • Added runtime JVM options from an .ini file.
  • +
  • Launch4j's bin directory is now configurable through launch4j.bindir + system property.
  • +
+ +

Changes in version 2.1.1 (25-01-2006)

+
    +
  • Fixed bug #1402748. Validation error occurred when using an Ant task with + embedded config and dontWrapJar option (found by Chris Nokleberg).
  • +
+ +

Changes in version 2.1.0 (10-01-2006)

+
    +
  • More features and smaller header: 18 KB!!
  • +
  • Added launcher mode, you can choose whether or not to wrap the jar.
  • +
  • Spanish translation of the website/docs and program messages + (Patricio Martínez Ros).
  • +
  • JRE's bin directory is appended to the Path environment variable + (Ianiv Schweber).
  • +
  • Added special variables EXEDIR and EXEFILE that hold the executable's + directory and full path.
  • +
  • Support for mapping environment variables to system properties.
  • +
  • Added debug launching mode - various information is displayed before + starting the Java application.
  • +
  • Fixed min/max JRE version checking, previous versions allowed these + to be equal (found by Ryan).
  • +
  • Bug fixed. Quotes in jar/JVM arguments were handled incorrectly (found by Juan Alvarez Ferrando).
  • +
  • A few other enhancements.
  • +
+ +

Changes in version 2.0.0 (31-10-2005)

+
    +
  • Launch4j for Mac OS X is available thanks to Peter Centgraf.
  • +
  • Added support for custom headers.
  • +
  • Fixed bug #1343908, command line arguments with spaces were handled + incorrectly by the console header (found by Oliver Schaefer / Steve Alberty).
  • +
  • Fixed stdin redirection bug (found by Timo Santasalo).
  • +
+ +

Changes in version 2.0 RC3 (13-08-2005) - final RC

+
    +
  • Correct handling of pathnames with spaces.
  • +
  • Fixed the '%20' pathname bug.
  • +
  • Fixed basedir bug (Richard Xing).
  • +
  • Splash screen can be closed when the application window becomes visible + with out specifying it's title (Martin Busik). + Update your config file: <waitForTitle>title</waitForTitle> + is now <waitForWindow>true</waitForWindow>. +
  • +
  • Fixed build.bat files in demo directories.
  • +
+ +

Changes in version 2.0 RC2 (21-06-2005)

+
    +
  • chdir allows to change the current directory to arbitrary paths + relative to the executable (FR #1144907). It's incompatible with + previous versions, update your config file: + <chdir>true</chdir> + is now <chdir>.</chdir>. +
  • +
  • Bundled JRE path no longer depends on chdir function.
  • +
  • Fixed Ant task bug, build files outside launch4j's directory + wouldn't work. Josh Elsasser submitted a patch that works without + setting launch4j's home dir in the build file. Thanks! +
  • +
  • Removed static edge from splash screen (Serge Baranov).
  • +
  • Program checks that the output file path doesn't contain spaces.
  • +
  • Fixed a NPE bug caused by a missing maxVersion property + (found by Morgan Schweers). +
  • +
  • Fixed relative JRE path bug (found by Nili_).
  • +
  • Cleaned up the Builder class.
  • +
  • Fixed Ant task NPE where the config was entirely defined in the + build file (Josh Elsasser). +
  • +
+ +

Changes in version 2.0 RC (07-06-2005)

+
    +
  • Added an Ant task for better build integration.
  • +
  • Added 2.x documentation.
  • +
  • Updated the demo configuration files.
  • +
  • Fixed issues with relative paths in the configuration.
  • +
  • Removed the '-1' option in console mode.
  • +
  • Minor fixes.
  • +
+ +

Changes in version 2.0 beta2 (23-05-2005)

+
    +
  • # comments are recognized when importing 1.x cfg files.
  • +
  • Added version information.
  • +
  • Resource file is displayed when a resource error occurs.
  • +
  • Fixed a bug found by Max, options on the first tab were always enabled.
  • +
+ +

Changes in version 2.0 beta1 (13-05-2005)

+
    +
  • Completely new, cross-platform wrapper - create windows executables on Linux.
  • +
  • New .xml configuration file.
  • +
  • Application icon with multiple resolutions and color depths.
  • +
  • Swing GUI interface.
  • +
  • Header compiled with MinGW port of gcc instead of VC++.
  • +
+ +

Changes in version 1.4.2 (12-03-2005)

+
    +
  • Fixed bug #1158143, stayAlive without a splash screen caused + an infinite loop (found by Gregory Kotsaftis). +
  • +
+ +

Changes in version 1.4.1 (04-03-2005)

+
    +
  • Fixed bug #1119040, buffer for reading config properties + was too short (found by Tom Jensen and Neil). +
  • +
  • Added configurable splash timeout (FR #1102951).
  • +
  • Added option to disable the error message on splash timeout (FR #1109159).
  • +
  • Option to keep the gui launcher 'alive' after starting an application (FR #1124653).
  • +
  • Removed version info.
  • +
  • 'waitfor' property is now optional.
  • +
+ +

Changes in version 1.4.0 (26-01-2005)

+
    +
  • Removed .lch4j suffix from process name, now it has the + form of the executable filename. The temporary launchers are stored in + launch4j-tmp directory (suggested by Emmanuel). +
  • +
  • Added support for console apps (FR #1050053).
  • +
+ +

Changes in version 1.3.1 (05-11-2004)

+
    +
  • Fixed a bug where explorer window was opened instead of + launching the application when setProcName was set to false + (found by Rob Jones). +
  • +
  • Fixed temporary launcher deletion bug.
  • +
+ +

Changes in version 1.3.0 (01-11-2004)

+
    +
  • Now you can configure launch4j to: +
      +
    • Use a bundled JRE.
    • +
    • Search for java, show an error message if the + right version cannot be found and open the java download page.
    • +
    • And a feature you asked for: use bundled JRE, if + that fails search for java and bring up the java download page on error.
    • +
    +
  • +
  • Enhanced code that sets the custom process name. In + case launch4j can't refresh the temporary launcher, bundled JRE on a + read only file system for example, it will use one created previously, + if it's present and has the correct size. If not, launching will still + continue, but with javaw.exe process name.Temporary launchers are + now created in the jre directory instead of jre/bin. +
  • +
  • errTitle property allows to set the title of the error message box.
  • +
+ +

Changes in version 1.2.1 (25-09-2004)

+
    +
  • Bugfix that allows launching from command line using short + name (#1026514 / found by Zach Del) +
  • +
+ +

Changes in version 1.2.0 (10-09-2004)

+
    +
  • Custom process name (myapp.lch4j.exe)
  • +
  • 9 KB stub!
  • +
  • Jar arguments
  • +
  • Bugfix that allows launching from command line.
  • +
  • Hide splash on javaw error.
  • +
  • Easier configuration with case insensitive parameters + show unrecognized parameter.
  • +
  • 12 KB demo application, 34 KB with splash screen.
  • +
  • Configuration parameter 'args' changed to 'jvmArgs'
  • +
+
-
- - + All trademarks mentioned are properties of their respective owners.
+ Copyright © 2005-2008 Grzegorz Kowal +

+ sf.net + + Valid HTML 4.01! +

+
+ + + diff --git a/build/windows/launcher/launch4j/web/docs.html b/build/windows/launcher/launch4j/web/docs.html old mode 100755 new mode 100644 index 67f898eb27d..75db70c5ab5 --- a/build/windows/launcher/launch4j/web/docs.html +++ b/build/windows/launcher/launch4j/web/docs.html @@ -1,256 +1,256 @@ - - - - Launch4j - Cross-platform Java executable wrapper - - - - - - - -
-
- launch4j 3.0.1 -
- -
-Running launch4j
-Configuration file
-Importing 1.x configuration
-Ant Task
-Additional JVM options at runtime
-Runtime options
-Settings
- -

Running launch4j

-Run launch4j.exe or launch4j script without command -line arguments to enter the GUI mode. - -
launch4j.exe
- -To wrap a jar in console mode use launch4jc.exe and -specify the configuration file. - -
launch4jc.exe config.xml
- -On Linux use the launch4j script. - -
launch4j ./demo/l4j/config.xml
- -

Configuration file

-Launch4j requires an xml configuration file for each output executable. -You can create and edit it conveniently using the graphic user -interface or your favorite editor. Alternatively it's possible to pass -all of the configuration parameters through the Ant task. All files -may be absolute paths or relative to the configuration file path. - -
-<!-- Bold elements are required -->
-<launch4jConfig>
-  <headerType>gui|console</headerType>
-  <outfile>file.exe</outfile>
-  <jar>file</jar>
-  <dontWrapJar>true|false</dontWrapJar>
-  <errTitle>text</errTitle>
-  <downloadUrl>http://java.com/download</downloadUrl>
-  <supportUrl>url</supportUrl>
-  <cmdLine>text</cmdLine>
-  <chdir>path</chdir>
-  <priority>normal|idle|high</priority>
-  <customProcName>true|false</customProcName>
-  <stayAlive>true|false</stayAlive>
-  <icon>file</icon>
-  <obj>header object file</obj>
-  ...
-  <lib>w32api lib</lib>
-  ...
-  <var>var=text</var>
-  ...
-  <classPath>
-    <mainClass>main class</mainClass>
-    <cp>classpath</cp>
-    ...
+
+
+	
+		Launch4j - Cross-platform Java executable wrapper
+		
+		
+		
+		
+		
+	
+	
+		
+
+ launch4j 3.0.1 +
+ +
+Running launch4j
+Configuration file
+Importing 1.x configuration
+Ant Task
+Additional JVM options at runtime
+Runtime options
+Settings
+ +

Running launch4j

+Run launch4j.exe or launch4j script without command +line arguments to enter the GUI mode. + +
launch4j.exe
+ +To wrap a jar in console mode use launch4jc.exe and +specify the configuration file. + +
launch4jc.exe config.xml
+ +On Linux use the launch4j script. + +
launch4j ./demo/l4j/config.xml
+ +

Configuration file

+Launch4j requires an xml configuration file for each output executable. +You can create and edit it conveniently using the graphic user +interface or your favorite editor. Alternatively it's possible to pass +all of the configuration parameters through the Ant task. All files +may be absolute paths or relative to the configuration file path. + +
+<!-- Bold elements are required -->
+<launch4jConfig>
+  <headerType>gui|console</headerType>
+  <outfile>file.exe</outfile>
+  <jar>file</jar>
+  <dontWrapJar>true|false</dontWrapJar>
+  <errTitle>text</errTitle>
+  <downloadUrl>http://java.com/download</downloadUrl>
+  <supportUrl>url</supportUrl>
+  <cmdLine>text</cmdLine>
+  <chdir>path</chdir>
+  <priority>normal|idle|high</priority>
+  <customProcName>true|false</customProcName>
+  <stayAlive>true|false</stayAlive>
+  <icon>file</icon>
+  <obj>header object file</obj>
+  ...
+  <lib>w32api lib</lib>
+  ...
+  <var>var=text</var>
+  ...
+  <classPath>
+    <mainClass>main class</mainClass>
+    <cp>classpath</cp>
+    ...
   </classPath>
   <singleInstance>
     <mutexName>text</mutexName>
     <windowTitle>text</windowTitle>
-  </singleInstance> 
-  <jre>
-    <!-- Specify one of the following or both -->
-    <path>bundled JRE path</path>
-    <minVersion>x.x.x[_xx]</minVersion>
-    <maxVersion>x.x.x[_xx]</maxVersion>
-    <jdkPreference>jreOnly|preferJre|preferJdk|jdkOnly</jdkPreference>
-    <!-- Heap sizes in MB and % of free memory -->
+  </singleInstance> 
+  <jre>
+    <!-- Specify one of the following or both -->
+    <path>bundled JRE path</path>
+    <minVersion>x.x.x[_xx]</minVersion>
+    <maxVersion>x.x.x[_xx]</maxVersion>
+    <jdkPreference>jreOnly|preferJre|preferJdk|jdkOnly</jdkPreference>
+    <!-- Heap sizes in MB and % of free memory -->
     <initialHeapSize>MB</initialHeapSize>
-    <initialHeapPercent>%</initialHeapPercent>
+    <initialHeapPercent>%</initialHeapPercent>
     <maxHeapSize>MB</maxHeapSize>
-    <maxHeapPercent>%</maxHeapPercent>
-    <opt>text</opt>
-    ...
-  </jre>
-  <splash>
-    <file>file</file>
-    <waitForWindow>true|false</waitForWindow>
-    <timeout>seconds [60]</timeout>
-    <timeoutErr>true|false</timeoutErr>
-  </splash>
-  <versionInfo>
-    <fileVersion>x.x.x.x</fileVersion>
-    <txtFileVersion>text</txtFileVersion>
-    <fileDescription>text</fileDescription>
-    <copyright>text</copyright>
-    <productVersion>x.x.x.x</productVersion>
-    <txtProductVersion>text</txtProductVersion>
-    <productName>text</productName>
-    <companyName>text</companyName>
-    <internalName>filename</internalName>
-    <originalFilename>filename.exe</originalFilename>
-  </versionInfo>
-  <messages>
-    <startupErr>text</startupErr>
-    <bundledJreErr>text</bundledJreErr>
-    <jreVersionErr>text</jreVersionErr>
-    <launcherErr>text</launcherErr>
-  </messages>
-</launch4jConfig>
-
- -
-
<headerType>
-
- Type of the header used to wrap the application. - - - - - - - - - - - - - - - - - - - - - - - -
Header typeLauncherSplash screenWait for the application to close
guijavawyeswrapper waits only if stayAlive is set to true, - otherwise it terminates immediately or after closing - the splash screen. -
consolejavanoalways waits and returns application's exit code.
-
-
-
-
<outfile>
-
Output executable file.
-
-
-
<jar>
-
- Optional, by default specifies the jar to wrap. To launch a jar without - wrapping it enter the runtime path of the jar relative to - the executable and set <dontWrapJar> to true. - For example, if the executable launcher and the application jar named - calc.exe and calc.jar are in the same directory - then you would use <jar>calc.jar</jar> - and <dontWrapJar>true</dontWrapJar>. -
-
-
-
<dontWrapJar>
-
- Optional, defaults to false. Launch4j by default wraps jars in native - executables, you can prevent this by setting <dontWrapJar> to true. - The exe acts then as a launcher and starts the application specified in - <jar> or <classPath><mainClass> -
-
-
-
<errTitle>
-
- Optional, sets the title of the error message box that's displayed if Java cannot - be found for instance. This usually should contain the name of your - application. The console header prefixes error messages with this - property (myapp: error...) -
-
-
-
<cmdLine>
-
Optional, constant command line arguments.
-
-
-
<chdir>
-
Optional. Change current directory to an arbitrary path relative to the executable. - If you omit this property or leave it blank it will have no effect. - Setting it to . will change the current dir to the same directory - as the executable. .. will change it to the parent directory, and so on. -
-
-
<chdir>.</chdir>
-
-
-
<chdir>../somedir</chdir>
-
-
-
-
<customProcName>
-
Optional, defaults to false. - Set the process name as the executable filename and use Xp style manifests - (if any). - Creates a temporary file in launch4j-tmp directory inside the used JRE. - These files are deleted by any launch4j wrapped application, which sets - the process name and uses the same JRE. The removal takes place - when the application starts, - so at least one copy of this file will always be present. -
-
-
-
<stayAlive>
-
Optional, defaults to false in GUI header, always true in console header. - When enabled the launcher waits for the Java application - to finish and returns it's exit code. -
-
-
-
<icon>
-
Application icon in ICO format. May contain multiple color depths/resolutions.
-
-
-
<obj>
-
Optional, custom headers only. Ordered list of header object files.
-
-
-
<lib>
-
Optional, custom headers only. Ordered list of libraries used by header.
+ <maxHeapPercent>%</maxHeapPercent> + <opt>text</opt> + ... + </jre> + <splash> + <file>file</file> + <waitForWindow>true|false</waitForWindow> + <timeout>seconds [60]</timeout> + <timeoutErr>true|false</timeoutErr> + </splash> + <versionInfo> + <fileVersion>x.x.x.x</fileVersion> + <txtFileVersion>text</txtFileVersion> + <fileDescription>text</fileDescription> + <copyright>text</copyright> + <productVersion>x.x.x.x</productVersion> + <txtProductVersion>text</txtProductVersion> + <productName>text</productName> + <companyName>text</companyName> + <internalName>filename</internalName> + <originalFilename>filename.exe</originalFilename> + </versionInfo> + <messages> + <startupErr>text</startupErr> + <bundledJreErr>text</bundledJreErr> + <jreVersionErr>text</jreVersionErr> + <launcherErr>text</launcherErr> + </messages> +</launch4jConfig> +
+ +
+
<headerType>
+
+ Type of the header used to wrap the application. + + + + + + + + + + + + + + + + + + + + + + + +
Header typeLauncherSplash screenWait for the application to close
guijavawyeswrapper waits only if stayAlive is set to true, + otherwise it terminates immediately or after closing + the splash screen. +
consolejavanoalways waits and returns application's exit code.
+
+
+
+
<outfile>
+
Output executable file.
+
+
+
<jar>
+
+ Optional, by default specifies the jar to wrap. To launch a jar without + wrapping it enter the runtime path of the jar relative to + the executable and set <dontWrapJar> to true. + For example, if the executable launcher and the application jar named + calc.exe and calc.jar are in the same directory + then you would use <jar>calc.jar</jar> + and <dontWrapJar>true</dontWrapJar>. +
+
+
+
<dontWrapJar>
+
+ Optional, defaults to false. Launch4j by default wraps jars in native + executables, you can prevent this by setting <dontWrapJar> to true. + The exe acts then as a launcher and starts the application specified in + <jar> or <classPath><mainClass> +
+
+
+
<errTitle>
+
+ Optional, sets the title of the error message box that's displayed if Java cannot + be found for instance. This usually should contain the name of your + application. The console header prefixes error messages with this + property (myapp: error...) +
+
+
+
<cmdLine>
+
Optional, constant command line arguments.
+
+
+
<chdir>
+
Optional. Change current directory to an arbitrary path relative to the executable. + If you omit this property or leave it blank it will have no effect. + Setting it to . will change the current dir to the same directory + as the executable. .. will change it to the parent directory, and so on. +
+
+
<chdir>.</chdir>
+
+
+
<chdir>../somedir</chdir>
+
+
+
+
<customProcName>
+
Optional, defaults to false. + Set the process name as the executable filename and use Xp style manifests + (if any). + Creates a temporary file in launch4j-tmp directory inside the used JRE. + These files are deleted by any launch4j wrapped application, which sets + the process name and uses the same JRE. The removal takes place + when the application starts, + so at least one copy of this file will always be present. +
+
+
+
<stayAlive>
+
Optional, defaults to false in GUI header, always true in console header. + When enabled the launcher waits for the Java application + to finish and returns it's exit code. +
+
+
+
<icon>
+
Application icon in ICO format. May contain multiple color depths/resolutions.
+
+
+
<obj>
+
Optional, custom headers only. Ordered list of header object files.
+
+
+
<lib>
+
Optional, custom headers only. Ordered list of libraries used by header.
<singleInstance>
@@ -265,66 +265,66 @@

Configuration file

to bring up instead of running a new instance.
- -
-
<jre>
-
Required element that groups JRE settings.
-
-
-
-
<path>, <minVersion>, <maxVersion>
-
The <path> property is used - to specify the absolute or relative path (to the executable) of a bundled JRE, it - does not rely on the current directory or <chdir>. - Note that this path is not checked until the actual application execution. - If you'd like the wrapper to search for a JRE (public or SDK private) - use the <minVersion> property, you may also specify +
+
+
<jre>
+
Required element that groups JRE settings.
+
+
+
+
<path>, <minVersion>, <maxVersion>
+
The <path> property is used + to specify the absolute or relative path (to the executable) of a bundled JRE, it + does not rely on the current directory or <chdir>. + Note that this path is not checked until the actual application execution. + If you'd like the wrapper to search for a JRE (public or SDK private) + use the <minVersion> property, you may also specify the <maxVersion> to prevent it from using higher Java versions. - Launch4j will always use the highest version available (in the min/max range of course). + Launch4j will always use the highest version available (in the min/max range of course). If a Sun's JRE is not available or does not satisfy the search criteria, the search will be repeated on IBM runtimes. - You can also combine these properties to change the startup process... -
-
-
-
-
<path>
-
Run if bundled JRE and javaw.exe are present, otherwise stop with error.
-
<path> + <minVersion>  [+ <maxVersion>]
-
Use bundled JRE first, if it cannot be located search for Java, - if that fails display error message and open the Java download page. -
-
<minVersion>  [+ <maxVersion>]
-
Search for Java, if an appropriate version cannot be found display - error message and open the Java download page. -
-
-
-
-
-
-
<jdkPreference>
-
Optional, defaults to preferJre; Allows you to specify a preference + You can also combine these properties to change the startup process... +
+
+
+
+
<path>
+
Run if bundled JRE and javaw.exe are present, otherwise stop with error.
+
<path> + <minVersion>  [+ <maxVersion>]
+
Use bundled JRE first, if it cannot be located search for Java, + if that fails display error message and open the Java download page. +
+
<minVersion>  [+ <maxVersion>]
+
Search for Java, if an appropriate version cannot be found display + error message and open the Java download page. +
+
+
+
+
+
+
<jdkPreference>
+
Optional, defaults to preferJre; Allows you to specify a preference for a public JRE or a private JDK runtime. Valid values are:
-
-
-
jreOnly
-
Always use a public JRE (equivalent to the - old option dontUsePrivateJres=true)
-
preferJre
-
Prefer a public JRE, but use a JDK private - runtime if it is newer than the public - JRE (equivalent to the old option - dontUsePrivateJres=false)
-
preferJdk
-
Prefer a JDK private runtime, but use a - public JRE if it is newer than the - JDK
-
jdkOnly
-
Always use a private JDK runtime (fails - if there is no JDK installed)
+
+
+
jreOnly
+
Always use a public JRE (equivalent to the + old option dontUsePrivateJres=true)
+
preferJre
+
Prefer a public JRE, but use a JDK private + runtime if it is newer than the public + JRE (equivalent to the old option + dontUsePrivateJres=false)
+
preferJdk
+
Prefer a JDK private runtime, but use a + public JRE if it is newer than the + JDK
+
jdkOnly
+
Always use a private JDK runtime (fails + if there is no JDK installed)
@@ -352,234 +352,234 @@

Configuration file

Optional, max heap size in % of free memory.
-
-
<opt>
-
Optional, accepts everything you would normally pass to - java/javaw launcher: assertion options, system properties and X options. - Here you can map environment and special variables EXEDIR - (exe's runtime directory), EXEFILE (exe's runtime full file path) - to system properties. All variable references must be surrounded with - percentage signs and quoted. -
-<opt>-Dlaunch4j.exedir="%EXEDIR%"</opt>
-<opt>-Dlaunch4j.exefile="%EXEFILE%"</opt>
-<opt>-Denv.path="%Path%"</opt>
-<opt>-Dsettings="%HomeDrive%%HomePath%\\settings.ini"</opt>
-
-
-
-
- -
-
<splash>
-
Optional, groups the splash screen settings. Allowed only in GUI header.
-
-
-
-
<file>
-
Splash screen image in BMP format.
-
-
-
<waitForWindow>
-
Optional, defaults to true. Close the splash screen when an application - window or Java error message box appears. If set to false, - the splash screen will be closed on timeout. -
-
-
-
<timeout>
-
Optional, defaults to 60. Number of seconds after which the splash screen - must be closed. Splash timeout may cause an error depending on - <timeoutErr>. -
-
-
-
<timeoutErr>
-
Optional, defaults to true. True signals an error on splash timeout, - false closes the splash screen quietly. -
-
-
- -
-
<versionInfo>
-
Optional, version information to be displayed by the Windows Explorer.
-
-
-
-
<fileVersion>
-
Version number 'x.x.x.x'
-
-
-
<txtFileVersion>
-
Free form file version, for example '1.20.RC1'.
-
-
-
<fileDescription>
-
File description presented to the user.
-
-
-
<copyright>
-
Legal copyright.
-
-
-
<productVersion>
-
Version number 'x.x.x.x'
-
-
-
<txtProductVersion>
-
Free form file version, for example '1.20.RC1'.
-
-
-
<productName>
-
Text.
-
-
-
<companyName>
-
Optional text.
-
-
-
<internalName>
-
Internal name without extension, original filename or module name for example.
-
-
-
<originalFilename>
-
Original name of the file without the path. Allows to determine - whether a file has been renamed by a user. -
-
-
- -

Importing 1.x configuration

-It's possible to import a 1.x configuration file using the GUI -interface. Open the file, correct the paths and save it as a new xml -configuration. - -

Ant task

-You may set a launch4j directory property or change the task definition. - -
<property name="launch4j.dir" location="/opt/launch4j" />
- -Define the task in your Ant build script. - -
-<taskdef name="launch4j"
-    classname="net.sf.launch4j.ant.Launch4jTask"
-    classpath="${launch4j.dir}/launch4j.jar
-        :${launch4j.dir}/lib/xstream.jar" />
-
- -Execute the task! - -
<launch4j configFile="./l4j/demo.xml" />
- -You can set or override the following configuration properties... -

- jar="absolute path or relative to basedir"
- jarPath="relative path"
- outfile
- fileVersion
- txtFileVersion
- productVersion
- txtProductVersion
- bindir="alternate bin directory..."
- tmpdir="alternate working directory..." -

- -
-<launch4j configFile="./l4j/demo.xml" outfile="mydemo.exe"
-    fileVersion="1.0.0.0" txtFileVersion="1.0 RC2" />
-
- -You can also define the entire configuration in the task, but it will -not be possible to edit such a file in the GUI mode. All paths except -for <chdir>, <jre><path> and jarPath -are calculated using the basedir project attribute. - -
-<launch4j>
-  <config headerType="gui" outfile="demo.exe"
-      dontWrapJar="true" jarPath="demo.jar" >
-    <var>SETTINGS="%HomeDrive%%HomePath%\\settings.ini"</var>
-    <classPath mainClass="org.demo.DemoApp">
-        <cp>./lib/looks.jar</cp>
-        <cp>%USER_LIBS%/*.jar</cp>
-    </classPath>
-    <jre minVersion="1.4.0">
-        <opt>-Dlaunch4j.exedir="%EXEDIR%"</opt>
-        <opt>-Dlaunch4j.exefile="%EXEFILE%"</opt>
-    </jre>
-  </config>
-</launch4j>
-
- -

Additional JVM options at runtime

-When you create a wrapper or launcher all configuration details are compiled into the -executable and cannot be changed without recreating it or hacking with a resource editor. -Launch4j 2.1.2 introduces a new feature that allows to pass additional JVM options -at runtime from an .l4j.ini file. Now you can specify the options in the configuration file, -ini file or in both, but you cannot override them. The ini file's name must correspond -to the executable's (myapp.exe : myapp.l4j.ini). -The arguments should be separated with spaces or new lines, environment variable -expansion is supported, for example: -
-# Launch4j runtime config
--Dswing.aatext=true
--Dsomevar="%SOMEVAR%"
--Xms16m
-
- -

Runtime options

-
-
--l4j-debug
-
- To make sure the output executable is configured correctly you can use the - debug launching mode to log various information to the launch4j.log file. -
- -
--l4j-default-proc
-
- Use default process name. -
- -
--l4j-dont-wait
-
- Disable the "stay alive" function. -
- -
--l4j-no-splash
-
- Disable the splash screen. -
- -
--l4j-no-splash-err
-
- Disable splash screen error on timeout, might be useful on very slow computers. -
-
- -

Settings

-
-
Alternate bin directory: launch4j.bindir
-
- It's possible to override the default bin directory location which contains windres and ld - tools using the launch4j.bindir system property. The property can have two forms: - a path relative to Launch4j's directory (altbin for example) or an absolute path. -
- -
Working directory: launch4j.tmpdir
-
Change the working directory if the default path contains spaces which windres cannot handle.
-
-
+
+
<opt>
+
Optional, accepts everything you would normally pass to + java/javaw launcher: assertion options, system properties and X options. + Here you can map environment and special variables EXEDIR + (exe's runtime directory), EXEFILE (exe's runtime full file path) + to system properties. All variable references must be surrounded with + percentage signs and quoted. +
+<opt>-Dlaunch4j.exedir="%EXEDIR%"</opt>
+<opt>-Dlaunch4j.exefile="%EXEFILE%"</opt>
+<opt>-Denv.path="%Path%"</opt>
+<opt>-Dsettings="%HomeDrive%%HomePath%\\settings.ini"</opt>
+
+
+
+ + +
+
<splash>
+
Optional, groups the splash screen settings. Allowed only in GUI header.
+
+
+
+
<file>
+
Splash screen image in BMP format.
+
+
+
<waitForWindow>
+
Optional, defaults to true. Close the splash screen when an application + window or Java error message box appears. If set to false, + the splash screen will be closed on timeout. +
+
+
+
<timeout>
+
Optional, defaults to 60. Number of seconds after which the splash screen + must be closed. Splash timeout may cause an error depending on + <timeoutErr>. +
+
+
+
<timeoutErr>
+
Optional, defaults to true. True signals an error on splash timeout, + false closes the splash screen quietly. +
+
+
+ +
+
<versionInfo>
+
Optional, version information to be displayed by the Windows Explorer.
+
+
+
+
<fileVersion>
+
Version number 'x.x.x.x'
+
+
+
<txtFileVersion>
+
Free form file version, for example '1.20.RC1'.
+
+
+
<fileDescription>
+
File description presented to the user.
+
+
+
<copyright>
+
Legal copyright.
+
+
+
<productVersion>
+
Version number 'x.x.x.x'
+
+
+
<txtProductVersion>
+
Free form file version, for example '1.20.RC1'.
+
+
+
<productName>
+
Text.
+
+
+
<companyName>
+
Optional text.
+
+
+
<internalName>
+
Internal name without extension, original filename or module name for example.
+
+
+
<originalFilename>
+
Original name of the file without the path. Allows to determine + whether a file has been renamed by a user. +
+
+
+ +

Importing 1.x configuration

+It's possible to import a 1.x configuration file using the GUI +interface. Open the file, correct the paths and save it as a new xml +configuration. + +

Ant task

+You may set a launch4j directory property or change the task definition. + +
<property name="launch4j.dir" location="/opt/launch4j" />
+ +Define the task in your Ant build script. + +
+<taskdef name="launch4j"
+    classname="net.sf.launch4j.ant.Launch4jTask"
+    classpath="${launch4j.dir}/launch4j.jar
+        :${launch4j.dir}/lib/xstream.jar" />
+
+ +Execute the task! + +
<launch4j configFile="./l4j/demo.xml" />
+ +You can set or override the following configuration properties... +

+ jar="absolute path or relative to basedir"
+ jarPath="relative path"
+ outfile
+ fileVersion
+ txtFileVersion
+ productVersion
+ txtProductVersion
+ bindir="alternate bin directory..."
+ tmpdir="alternate working directory..." +

+ +
+<launch4j configFile="./l4j/demo.xml" outfile="mydemo.exe"
+    fileVersion="1.0.0.0" txtFileVersion="1.0 RC2" />
+
+ +You can also define the entire configuration in the task, but it will +not be possible to edit such a file in the GUI mode. All paths except +for <chdir>, <jre><path> and jarPath +are calculated using the basedir project attribute. + +
+<launch4j>
+  <config headerType="gui" outfile="demo.exe"
+      dontWrapJar="true" jarPath="demo.jar" >
+    <var>SETTINGS="%HomeDrive%%HomePath%\\settings.ini"</var>
+    <classPath mainClass="org.demo.DemoApp">
+        <cp>./lib/looks.jar</cp>
+        <cp>%USER_LIBS%/*.jar</cp>
+    </classPath>
+    <jre minVersion="1.4.0">
+        <opt>-Dlaunch4j.exedir="%EXEDIR%"</opt>
+        <opt>-Dlaunch4j.exefile="%EXEFILE%"</opt>
+    </jre>
+  </config>
+</launch4j>
+
+ +

Additional JVM options at runtime

+When you create a wrapper or launcher all configuration details are compiled into the +executable and cannot be changed without recreating it or hacking with a resource editor. +Launch4j 2.1.2 introduces a new feature that allows to pass additional JVM options +at runtime from an .l4j.ini file. Now you can specify the options in the configuration file, +ini file or in both, but you cannot override them. The ini file's name must correspond +to the executable's (myapp.exe : myapp.l4j.ini). +The arguments should be separated with spaces or new lines, environment variable +expansion is supported, for example: +
+# Launch4j runtime config
+-Dswing.aatext=true
+-Dsomevar="%SOMEVAR%"
+-Xms16m
+
+ +

Runtime options

+
+
--l4j-debug
+
+ To make sure the output executable is configured correctly you can use the + debug launching mode to log various information to the launch4j.log file. +
+ +
--l4j-default-proc
+
+ Use default process name. +
+ +
--l4j-dont-wait
+
+ Disable the "stay alive" function. +
+ +
--l4j-no-splash
+
+ Disable the splash screen. +
+ +
--l4j-no-splash-err
+
+ Disable splash screen error on timeout, might be useful on very slow computers. +
+
+ +

Settings

+
+
Alternate bin directory: launch4j.bindir
+
+ It's possible to override the default bin directory location which contains windres and ld + tools using the launch4j.bindir system property. The property can have two forms: + a path relative to Launch4j's directory (altbin for example) or an absolute path. +
+ +
Working directory: launch4j.tmpdir
+
Change the working directory if the default path contains spaces which windres cannot handle.
+
+
- - - + All trademarks mentioned are properties of their respective owners.
+ Copyright © 2005-2008 Grzegorz Kowal +

+ sf.net + + Valid HTML 4.01! +

+ + + + diff --git a/build/windows/launcher/launch4j/web/index.html b/build/windows/launcher/launch4j/web/index.html old mode 100755 new mode 100644 index d1f928e6ec4..8f8674e9c7c --- a/build/windows/launcher/launch4j/web/index.html +++ b/build/windows/launcher/launch4j/web/index.html @@ -1,128 +1,128 @@ - - - - Launch4j - Cross-platform Java executable wrapper - - - - - - - -
-
- launch4j 3.0.1 -
- -
-

Cross-platform Java executable wrapper

-

- Launch4j is a cross-platform tool for wrapping - Java applications distributed as jars in lightweight Windows - native executables. The executable can be - configured to search for a certain JRE version or - use a bundled one, and it's possible to set - runtime options, like the initial/max heap size. - The wrapper also provides better user experience - through an application icon, a native pre-JRE - splash screen, a custom process name, and a Java - download page in case the appropriate JRE cannot - be found. -

-How to use Launch4 -

Features

-
    -
  • Launch4j wraps jars in Windows native executables and allows to run them - like a regular Windows program. It's possible to wrap applications - on Windows, Linux, Mac OS X and Solaris! -
  • -
  • Also creates launchers for jars and class files without wrapping.
  • -
  • - Supports executable jars and dynamic classpath resolution using - environment variables and wildcards. -
  • -
  • Doesn't extract the jar from the executable.
  • -
  • Custom application icon with multiple resolutions and color depths.
  • -
  • Native pre-JRE splash screen in BMP format shown until - the Java application starts. -
  • -
  • Process name as the executable filename to easily - identify your application, initial priority and - single aplication instance features. -
  • -
  • Works with a bundled JRE or searches for newest Sun or IBM JRE / JDK in given - version range.
  • -
  • Opens Java download page if an appropriate Java version cannot be - found or a support website in case of an error. -
  • -
  • Supports GUI and console apps.
  • -
  • Supports Vista manifests and XP visual style manifests.
  • -
  • Passes command line arguments, also supports constant arguments.
  • -
  • Allows to set the initial/max heap size also dynamically in percent of free memory.
  • -
  • JVM options: set system properties, tweak the garbage collection...
  • -
  • Runtime JVM options from an .l4j.ini file.
  • -
  • Runtime command line switches to change the compiled options.
  • -
  • Access to environment variables, the registry and executable file path through system properties.
  • -
  • Set environment variables.
  • -
  • Option to change current directory to the executable location.
  • -
  • The JRE's bin directory is appended to the Path environment variable.
  • -
  • Custom version information shown by Windows Explorer.
  • -
  • GUI and command line interface.
  • -
  • Build integration through an Ant task and a Maven Plugin.
  • -
  • Lightweight: 26 KB!
  • -
  • It's free and may be used for commercial purposes.
  • -
  • Includes a sample application and Ant script - that automates the build process from Java sources to native executable. -
  • -
  • The wrapped program works on all Windows platforms (98/Me/NT/2K/XP/Vista), - Launch4j works on NT/2K/XP/Vista, Linux, Mac OS X (build on 10.4) and Sparc Solaris 8-10. -
  • -
-

License

-

- This program is free software licensed under the - BSD license, the head subproject - (the code which is attached to the wrapped jars) is licensed under the - MIT license. - Launch4j may be used for wrapping closed source, commercial applications. -

-

Info

-

- Running Launch4j on other Java enabled platforms is a matter of getting a binary version - of MinGW binutils 2.15.90 (windres and ld only) - for your system or compiling them. If you'll provide these, I'll be able to create a binary package - available for download. -

- -
+ + + + Launch4j - Cross-platform Java executable wrapper + + + + + + + +
+
+ launch4j 3.0.1 +
+ +
+

Cross-platform Java executable wrapper

+

+ Launch4j is a cross-platform tool for wrapping + Java applications distributed as jars in lightweight Windows + native executables. The executable can be + configured to search for a certain JRE version or + use a bundled one, and it's possible to set + runtime options, like the initial/max heap size. + The wrapper also provides better user experience + through an application icon, a native pre-JRE + splash screen, a custom process name, and a Java + download page in case the appropriate JRE cannot + be found. +

+How to use Launch4 +

Features

+
    +
  • Launch4j wraps jars in Windows native executables and allows to run them + like a regular Windows program. It's possible to wrap applications + on Windows, Linux, Mac OS X and Solaris! +
  • +
  • Also creates launchers for jars and class files without wrapping.
  • +
  • + Supports executable jars and dynamic classpath resolution using + environment variables and wildcards. +
  • +
  • Doesn't extract the jar from the executable.
  • +
  • Custom application icon with multiple resolutions and color depths.
  • +
  • Native pre-JRE splash screen in BMP format shown until + the Java application starts. +
  • +
  • Process name as the executable filename to easily + identify your application, initial priority and + single aplication instance features. +
  • +
  • Works with a bundled JRE or searches for newest Sun or IBM JRE / JDK in given + version range.
  • +
  • Opens Java download page if an appropriate Java version cannot be + found or a support website in case of an error. +
  • +
  • Supports GUI and console apps.
  • +
  • Supports Vista manifests and XP visual style manifests.
  • +
  • Passes command line arguments, also supports constant arguments.
  • +
  • Allows to set the initial/max heap size also dynamically in percent of free memory.
  • +
  • JVM options: set system properties, tweak the garbage collection...
  • +
  • Runtime JVM options from an .l4j.ini file.
  • +
  • Runtime command line switches to change the compiled options.
  • +
  • Access to environment variables, the registry and executable file path through system properties.
  • +
  • Set environment variables.
  • +
  • Option to change current directory to the executable location.
  • +
  • The JRE's bin directory is appended to the Path environment variable.
  • +
  • Custom version information shown by Windows Explorer.
  • +
  • GUI and command line interface.
  • +
  • Build integration through an Ant task and a Maven Plugin.
  • +
  • Lightweight: 26 KB!
  • +
  • It's free and may be used for commercial purposes.
  • +
  • Includes a sample application and Ant script + that automates the build process from Java sources to native executable. +
  • +
  • The wrapped program works on all Windows platforms (98/Me/NT/2K/XP/Vista), + Launch4j works on NT/2K/XP/Vista, Linux, Mac OS X (build on 10.4) and Sparc Solaris 8-10. +
  • +
+

License

+

+ This program is free software licensed under the + BSD license, the head subproject + (the code which is attached to the wrapped jars) is licensed under the + MIT license. + Launch4j may be used for wrapping closed source, commercial applications. +

+

Info

+

+ Running Launch4j on other Java enabled platforms is a matter of getting a binary version + of MinGW binutils 2.15.90 (windres and ld only) + for your system or compiling them. If you'll provide these, I'll be able to create a binary package + available for download. +

+ +
-
- - + All trademarks mentioned are properties of their respective owners.
+ Copyright © 2005-2008 Grzegorz Kowal +

+ sf.net + + Valid HTML 4.01! +

+
+ + + diff --git a/build/windows/launcher/launch4j/web/launch4j-use.gif b/build/windows/launcher/launch4j/web/launch4j-use.gif old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/web/launch4j.gif b/build/windows/launcher/launch4j/web/launch4j.gif old mode 100755 new mode 100644 diff --git a/build/windows/launcher/launch4j/web/links.html b/build/windows/launcher/launch4j/web/links.html old mode 100755 new mode 100644 index 4213b86f9d6..d417b015be6 --- a/build/windows/launcher/launch4j/web/links.html +++ b/build/windows/launcher/launch4j/web/links.html @@ -1,73 +1,73 @@ - - - - Launch4j - Cross-platform Java executable wrapper - - - - - - - - + + + diff --git a/build/windows/launcher/launch4j/web/style.css b/build/windows/launcher/launch4j/web/style.css old mode 100755 new mode 100644 index f57c086d684..6d33617f985 --- a/build/windows/launcher/launch4j/web/style.css +++ b/build/windows/launcher/launch4j/web/style.css @@ -1,159 +1,159 @@ -body, table { - font: 12px/20px Verdana, Arial, Helvetica, sans-serif; -} - - -pre { - padding: 8px; - border: 1px dashed #999999; - background-color: #f1f1f1; - font: 13px/20px "Courier New", Courier, monospace; -} - - -.version { - color: #307fe1; - font-weight: bold; -} - - -.codeword { - color: #3333ff; -} -.attrib { - color: #404040; -} -.option { - font-family: "Courier New", Courier, monospace; - font-weight: bold; -} - - -dt { - margin-top: 1.5em; - color: #404040; - font-size: 115%; - border-bottom: 1px solid #cccccc; -} -dd { - margin-left: 1em; -} - - -.warn, ul.changes em { - color: #ff0000; -} - - -table { - margin-top: 1em; - padding: 0; - border: 1px solid #999999; - border-collapse: collapse; - text-align: center; -} -table th { - padding: 2px 4px; - border: 1px solid #999999; - background-color: #f1f1f1; -} -table td { - padding: 2px 4px; - border: 1px solid #999999; -} -.description { - text-align: left; -} - - -#container { - width: 90%; - margin: 10px auto; - border-width: 0; - background-color: #ffffff; -} - - -#top { - padding: 0.5em; - background-color: #ffffff; -} -#top h1 { - margin: 0; - padding: 0; -} - - -#leftnav { - float: left; - width: 170px; - margin: 0; - padding: 0.5em; - background-color: #ffffff; -} -#leftnav ul { - margin: 0; - padding: 0; - border: none; - list-style-type: none; - font-size: 115%; -} -#leftnav a { - width: 170px; - height: 1.6em; - line-height: 1.6em; - display: block; - padding-left: 0.2em; -} -#leftnav a:link, #leftnav a:visited { - text-decoration: none; - color: #666666; -} -#leftnav a:hover { - background-color: #307fe1; - color: #ffffff; -} - - -#content { - max-width: 52em; - margin-left: 190px; - padding: 1em; - border-left: 1px solid #cccccc; - background-color: #ffffff; -} - -#content ul { - list-style-image: url('https://github.com/bullet.gif'); -} - -#content a:link { - text-decoration: none; - color: #307fe1; -} -#content a:visited { - text-decoration: none; - color: #307fe1; -} -#content a:hover { - color: #307fe1; - text-decoration: underline; -} - -#content h2 { - font-size: 150%; -} -#content h2:first-child { - margin: 0 0 0.5em; -} - - -.footer { - clear: both; - margin: 0; - padding: 0.5em; - background-color: #ffffff; - color: #333333; - text-align: center; - font-size: 90%; -} +body, table { + font: 12px/20px Verdana, Arial, Helvetica, sans-serif; +} + + +pre { + padding: 8px; + border: 1px dashed #999999; + background-color: #f1f1f1; + font: 13px/20px "Courier New", Courier, monospace; +} + + +.version { + color: #307fe1; + font-weight: bold; +} + + +.codeword { + color: #3333ff; +} +.attrib { + color: #404040; +} +.option { + font-family: "Courier New", Courier, monospace; + font-weight: bold; +} + + +dt { + margin-top: 1.5em; + color: #404040; + font-size: 115%; + border-bottom: 1px solid #cccccc; +} +dd { + margin-left: 1em; +} + + +.warn, ul.changes em { + color: #ff0000; +} + + +table { + margin-top: 1em; + padding: 0; + border: 1px solid #999999; + border-collapse: collapse; + text-align: center; +} +table th { + padding: 2px 4px; + border: 1px solid #999999; + background-color: #f1f1f1; +} +table td { + padding: 2px 4px; + border: 1px solid #999999; +} +.description { + text-align: left; +} + + +#container { + width: 90%; + margin: 10px auto; + border-width: 0; + background-color: #ffffff; +} + + +#top { + padding: 0.5em; + background-color: #ffffff; +} +#top h1 { + margin: 0; + padding: 0; +} + + +#leftnav { + float: left; + width: 170px; + margin: 0; + padding: 0.5em; + background-color: #ffffff; +} +#leftnav ul { + margin: 0; + padding: 0; + border: none; + list-style-type: none; + font-size: 115%; +} +#leftnav a { + width: 170px; + height: 1.6em; + line-height: 1.6em; + display: block; + padding-left: 0.2em; +} +#leftnav a:link, #leftnav a:visited { + text-decoration: none; + color: #666666; +} +#leftnav a:hover { + background-color: #307fe1; + color: #ffffff; +} + + +#content { + max-width: 52em; + margin-left: 190px; + padding: 1em; + border-left: 1px solid #cccccc; + background-color: #ffffff; +} + +#content ul { + list-style-image: url('https://github.com/bullet.gif'); +} + +#content a:link { + text-decoration: none; + color: #307fe1; +} +#content a:visited { + text-decoration: none; + color: #307fe1; +} +#content a:hover { + color: #307fe1; + text-decoration: underline; +} + +#content h2 { + font-size: 150%; +} +#content h2:first-child { + margin: 0 0 0.5em; +} + + +.footer { + clear: both; + margin: 0; + padding: 0.5em; + background-color: #ffffff; + color: #333333; + text-align: center; + font-size: 90%; +} diff --git a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168.c b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168.c index 2b9fefa2633..e8c3fb8b45f 100644 --- a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168.c +++ b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168.c @@ -1,1054 +1,1054 @@ -/**********************************************************/ -/* Serial Bootloader for Atmel megaAVR Controllers */ -/* */ -/* tested with ATmega8, ATmega128 and ATmega168 */ -/* should work with other mega's, see code for details */ -/* */ -/* ATmegaBOOT.c */ -/* */ -/* */ -/* 20090308: integrated Mega changes into main bootloader */ -/* source by D. Mellis */ -/* 20080930: hacked for Arduino Mega (with the 1280 */ -/* processor, backwards compatible) */ -/* by D. Cuartielles */ -/* 20070626: hacked for Arduino Diecimila (which auto- */ -/* resets when a USB connection is made to it) */ -/* by D. Mellis */ -/* 20060802: hacked for Arduino by D. Cuartielles */ -/* based on a previous hack by D. Mellis */ -/* and D. Cuartielles */ -/* */ -/* Monitor and debug functions were added to the original */ -/* code by Dr. Erik Lins, chip45.com. (See below) */ -/* */ -/* Thanks to Karl Pitrich for fixing a bootloader pin */ -/* problem and more informative LED blinking! */ -/* */ -/* For the latest version see: */ -/* http://www.chip45.com/ */ -/* */ -/* ------------------------------------------------------ */ -/* */ -/* based on stk500boot.c */ -/* Copyright (c) 2003, Jason P. Kyle */ -/* All rights reserved. */ -/* see avr1.org for original file and information */ -/* */ -/* 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., */ -/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* */ -/* Licence can be viewed at */ -/* http://www.fsf.org/licenses/gpl.txt */ -/* */ -/* Target = Atmel AVR m128,m64,m32,m16,m8,m162,m163,m169, */ -/* m8515,m8535. ATmega161 has a very small boot block so */ -/* isn't supported. */ -/* */ -/* Tested with m168 */ -/**********************************************************/ - -/* $Id$ */ - - -/* some includes */ -#include -#include -#include -#include -#include -#include - -/* the current avr-libc eeprom functions do not support the ATmega168 */ -/* own eeprom write/read functions are used instead */ -#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) -#include -#endif - -/* Use the F_CPU defined in Makefile */ - -/* 20060803: hacked by DojoCorp */ -/* 20070626: hacked by David A. Mellis to decrease waiting time for auto-reset */ -/* set the waiting time for the bootloader */ -/* get this from the Makefile instead */ -/* #define MAX_TIME_COUNT (F_CPU>>4) */ - -/* 20070707: hacked by David A. Mellis - after this many errors give up and launch application */ -#define MAX_ERROR_COUNT 5 - -/* set the UART baud rate */ -/* 20060803: hacked by DojoCorp */ -//#define BAUD_RATE 115200 -#ifndef BAUD_RATE -#define BAUD_RATE 19200 -#endif - - -/* SW_MAJOR and MINOR needs to be updated from time to time to avoid warning message from AVR Studio */ -/* never allow AVR Studio to do an update !!!! */ -#define HW_VER 0x02 -#define SW_MAJOR 0x01 -#define SW_MINOR 0x10 - - -/* Adjust to suit whatever pin your hardware uses to enter the bootloader */ -/* ATmega128 has two UARTS so two pins are used to enter bootloader and select UART */ -/* ATmega1280 has four UARTS, but for Arduino Mega, we will only use RXD0 to get code */ -/* BL0... means UART0, BL1... means UART1 */ -#ifdef __AVR_ATmega128__ -#define BL_DDR DDRF -#define BL_PORT PORTF -#define BL_PIN PINF -#define BL0 PINF7 -#define BL1 PINF6 -#elif defined __AVR_ATmega1280__ -/* we just don't do anything for the MEGA and enter bootloader on reset anyway*/ -#else -/* other ATmegas have only one UART, so only one pin is defined to enter bootloader */ -#define BL_DDR DDRD -#define BL_PORT PORTD -#define BL_PIN PIND -#define BL PIND6 -#endif - - -/* onboard LED is used to indicate, that the bootloader was entered (3x flashing) */ -/* if monitor functions are included, LED goes on after monitor was entered */ -#if defined __AVR_ATmega128__ || defined __AVR_ATmega1280__ -/* Onboard LED is connected to pin PB7 (e.g. Crumb128, PROBOmega128, Savvy128, Arduino Mega) */ -#define LED_DDR DDRB -#define LED_PORT PORTB -#define LED_PIN PINB -#define LED PINB7 -#else -/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duomilanuove */ -/* other boards like e.g. Crumb8, Crumb168 are using PB2 */ -#define LED_DDR DDRB -#define LED_PORT PORTB -#define LED_PIN PINB -#define LED PINB5 -#endif - - -/* monitor functions will only be compiled when using ATmega128, due to bootblock size constraints */ -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) -#define MONITOR 1 -#endif - - -/* define various device id's */ -/* manufacturer byte is always the same */ -#define SIG1 0x1E // Yep, Atmel is the only manufacturer of AVR micros. Single source :( - -#if defined __AVR_ATmega1280__ -#define SIG2 0x97 -#define SIG3 0x03 -#define PAGE_SIZE 0x80U //128 words - -#elif defined __AVR_ATmega1281__ -#define SIG2 0x97 -#define SIG3 0x04 -#define PAGE_SIZE 0x80U //128 words - -#elif defined __AVR_ATmega128__ -#define SIG2 0x97 -#define SIG3 0x02 -#define PAGE_SIZE 0x80U //128 words - -#elif defined __AVR_ATmega64__ -#define SIG2 0x96 -#define SIG3 0x02 -#define PAGE_SIZE 0x80U //128 words - -#elif defined __AVR_ATmega32__ -#define SIG2 0x95 -#define SIG3 0x02 -#define PAGE_SIZE 0x40U //64 words - -#elif defined __AVR_ATmega16__ -#define SIG2 0x94 -#define SIG3 0x03 -#define PAGE_SIZE 0x40U //64 words - -#elif defined __AVR_ATmega8__ -#define SIG2 0x93 -#define SIG3 0x07 -#define PAGE_SIZE 0x20U //32 words - -#elif defined __AVR_ATmega88__ -#define SIG2 0x93 -#define SIG3 0x0a -#define PAGE_SIZE 0x20U //32 words - -#elif defined __AVR_ATmega168__ -#define SIG2 0x94 -#define SIG3 0x06 -#define PAGE_SIZE 0x40U //64 words - -#elif defined __AVR_ATmega328P__ -#define SIG2 0x95 -#define SIG3 0x0F -#define PAGE_SIZE 0x40U //64 words - -#elif defined __AVR_ATmega162__ -#define SIG2 0x94 -#define SIG3 0x04 -#define PAGE_SIZE 0x40U //64 words - -#elif defined __AVR_ATmega163__ -#define SIG2 0x94 -#define SIG3 0x02 -#define PAGE_SIZE 0x40U //64 words - -#elif defined __AVR_ATmega169__ -#define SIG2 0x94 -#define SIG3 0x05 -#define PAGE_SIZE 0x40U //64 words - -#elif defined __AVR_ATmega8515__ -#define SIG2 0x93 -#define SIG3 0x06 -#define PAGE_SIZE 0x20U //32 words - -#elif defined __AVR_ATmega8535__ -#define SIG2 0x93 -#define SIG3 0x08 -#define PAGE_SIZE 0x20U //32 words -#endif - - -/* function prototypes */ -void putch(char); -char getch(void); -void getNch(uint8_t); -void byte_response(uint8_t); -void nothing_response(void); -char gethex(void); -void puthex(char); -void flash_led(uint8_t); - -/* some variables */ -union address_union { - uint16_t word; - uint8_t byte[2]; -} address; - -union length_union { - uint16_t word; - uint8_t byte[2]; -} length; - -struct flags_struct { - unsigned eeprom : 1; - unsigned rampz : 1; -} flags; - -uint8_t buff[256]; -uint8_t address_high; - -uint8_t pagesz=0x80; - -uint8_t i; -uint8_t bootuart = 0; - -uint8_t error_count = 0; - -void (*app_start)(void) = 0x0000; - - -/* main program starts here */ -int main(void) -{ - uint8_t ch,ch2; - uint16_t w; - -#ifdef WATCHDOG_MODS - ch = MCUSR; - MCUSR = 0; - - WDTCSR |= _BV(WDCE) | _BV(WDE); - WDTCSR = 0; - - // Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot. - if (! (ch & _BV(EXTRF))) // if its a not an external reset... - app_start(); // skip bootloader -#else - asm volatile("nop\n\t"); -#endif - - /* set pin direction for bootloader pin and enable pullup */ - /* for ATmega128, two pins need to be initialized */ -#ifdef __AVR_ATmega128__ - BL_DDR &= ~_BV(BL0); - BL_DDR &= ~_BV(BL1); - BL_PORT |= _BV(BL0); - BL_PORT |= _BV(BL1); -#else - /* We run the bootloader regardless of the state of this pin. Thus, don't - put it in a different state than the other pins. --DAM, 070709 - This also applies to Arduino Mega -- DC, 080930 - BL_DDR &= ~_BV(BL); - BL_PORT |= _BV(BL); - */ -#endif - - -#ifdef __AVR_ATmega128__ - /* check which UART should be used for booting */ - if(bit_is_clear(BL_PIN, BL0)) { - bootuart = 1; - } - else if(bit_is_clear(BL_PIN, BL1)) { - bootuart = 2; - } -#endif - -#if defined __AVR_ATmega1280__ - /* the mega1280 chip has four serial ports ... we could eventually use any of them, or not? */ - /* however, we don't wanna confuse people, to avoid making a mess, we will stick to RXD0, TXD0 */ - bootuart = 1; -#endif - - /* check if flash is programmed already, if not start bootloader anyway */ - if(pgm_read_byte_near(0x0000) != 0xFF) { - -#ifdef __AVR_ATmega128__ - /* no UART was selected, start application */ - if(!bootuart) { - app_start(); - } -#else - /* check if bootloader pin is set low */ - /* we don't start this part neither for the m8, nor m168 */ - //if(bit_is_set(BL_PIN, BL)) { - // app_start(); - // } -#endif - } - -#ifdef __AVR_ATmega128__ - /* no bootuart was selected, default to uart 0 */ - if(!bootuart) { - bootuart = 1; - } -#endif - - - /* initialize UART(s) depending on CPU defined */ -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) - if(bootuart == 1) { - UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); - UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; - UCSR0A = 0x00; - UCSR0C = 0x06; - UCSR0B = _BV(TXEN0)|_BV(RXEN0); - } - if(bootuart == 2) { - UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); - UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; - UCSR1A = 0x00; - UCSR1C = 0x06; - UCSR1B = _BV(TXEN1)|_BV(RXEN1); - } -#elif defined __AVR_ATmega163__ - UBRR = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); - UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8; - UCSRA = 0x00; - UCSRB = _BV(TXEN)|_BV(RXEN); -#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) - -#ifdef DOUBLE_SPEED - UCSR0A = (1<> 8; -#else - UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); - UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; -#endif - - UCSR0B = (1<>8; // set baud rate - UBRRL = (((F_CPU/BAUD_RATE)/16)-1); - UCSRB = (1<> 8; - UCSRA = 0x00; - UCSRC = 0x06; - UCSRB = _BV(TXEN)|_BV(RXEN); -#endif - -#if defined __AVR_ATmega1280__ - /* Enable internal pull-up resistor on pin D0 (RX), in order - to supress line noise that prevents the bootloader from - timing out (DAM: 20070509) */ - /* feature added to the Arduino Mega --DC: 080930 */ - DDRE &= ~_BV(PINE0); - PORTE |= _BV(PINE0); -#endif - - - /* set LED pin as output */ - LED_DDR |= _BV(LED); - - - /* flash onboard LED to signal entering of bootloader */ -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) - // 4x for UART0, 5x for UART1 - flash_led(NUM_LED_FLASHES + bootuart); -#else - flash_led(NUM_LED_FLASHES); -#endif - - /* 20050803: by DojoCorp, this is one of the parts provoking the - system to stop listening, cancelled from the original */ - //putch('\0'); - - /* forever loop */ - for (;;) { - - /* get character from UART */ - ch = getch(); - - /* A bunch of if...else if... gives smaller code than switch...case ! */ - - /* Hello is anyone home ? */ - if(ch=='0') { - nothing_response(); - } - - - /* Request programmer ID */ - /* Not using PROGMEM string due to boot block in m128 being beyond 64kB boundry */ - /* Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares. */ - else if(ch=='1') { - if (getch() == ' ') { - putch(0x14); - putch('A'); - putch('V'); - putch('R'); - putch(' '); - putch('I'); - putch('S'); - putch('P'); - putch(0x10); - } else { - if (++error_count == MAX_ERROR_COUNT) - app_start(); - } - } - - - /* AVR ISP/STK500 board commands DON'T CARE so default nothing_response */ - else if(ch=='@') { - ch2 = getch(); - if (ch2>0x85) getch(); - nothing_response(); - } - - - /* AVR ISP/STK500 board requests */ - else if(ch=='A') { - ch2 = getch(); - if(ch2==0x80) byte_response(HW_VER); // Hardware version - else if(ch2==0x81) byte_response(SW_MAJOR); // Software major version - else if(ch2==0x82) byte_response(SW_MINOR); // Software minor version - else if(ch2==0x98) byte_response(0x03); // Unknown but seems to be required by avr studio 3.56 - else byte_response(0x00); // Covers various unnecessary responses we don't care about - } - - - /* Device Parameters DON'T CARE, DEVICE IS FIXED */ - else if(ch=='B') { - getNch(20); - nothing_response(); - } - - - /* Parallel programming stuff DON'T CARE */ - else if(ch=='E') { - getNch(5); - nothing_response(); - } - - - /* P: Enter programming mode */ - /* R: Erase device, don't care as we will erase one page at a time anyway. */ - else if(ch=='P' || ch=='R') { - nothing_response(); - } - - - /* Leave programming mode */ - else if(ch=='Q') { - nothing_response(); -#ifdef WATCHDOG_MODS - // autoreset via watchdog (sneaky!) - WDTCSR = _BV(WDE); - while (1); // 16 ms -#endif - } - - - /* Set address, little endian. EEPROM in bytes, FLASH in words */ - /* Perhaps extra address bytes may be added in future to support > 128kB FLASH. */ - /* This might explain why little endian was used here, big endian used everywhere else. */ - else if(ch=='U') { - address.byte[0] = getch(); - address.byte[1] = getch(); - nothing_response(); - } - - - /* Universal SPI programming command, disabled. Would be used for fuses and lock bits. */ - else if(ch=='V') { - if (getch() == 0x30) { - getch(); - ch = getch(); - getch(); - if (ch == 0) { - byte_response(SIG1); - } else if (ch == 1) { - byte_response(SIG2); - } else { - byte_response(SIG3); - } - } else { - getNch(3); - byte_response(0x00); - } - } - - - /* Write memory, length is big endian and is in bytes */ - else if(ch=='d') { - length.byte[1] = getch(); - length.byte[0] = getch(); - flags.eeprom = 0; - if (getch() == 'E') flags.eeprom = 1; - for (w=0;w127) address_high = 0x01; //Only possible with m128, m256 will need 3rd address byte. FIXME - else address_high = 0x00; -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) - RAMPZ = address_high; -#endif - address.word = address.word << 1; //address * 2 -> byte location - /* if ((length.byte[0] & 0x01) == 0x01) length.word++; //Even up an odd number of bytes */ - if ((length.byte[0] & 0x01)) length.word++; //Even up an odd number of bytes - cli(); //Disable interrupts, just to be sure -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) - while(bit_is_set(EECR,EEPE)); //Wait for previous EEPROM writes to complete -#else - while(bit_is_set(EECR,EEWE)); //Wait for previous EEPROM writes to complete -#endif - asm volatile( - "clr r17 \n\t" //page_word_count - "lds r30,address \n\t" //Address of FLASH location (in bytes) - "lds r31,address+1 \n\t" - "ldi r28,lo8(buff) \n\t" //Start of buffer array in RAM - "ldi r29,hi8(buff) \n\t" - "lds r24,length \n\t" //Length of data to be written (in bytes) - "lds r25,length+1 \n\t" - "length_loop: \n\t" //Main loop, repeat for number of words in block - "cpi r17,0x00 \n\t" //If page_word_count=0 then erase page - "brne no_page_erase \n\t" - "wait_spm1: \n\t" - "lds r16,%0 \n\t" //Wait for previous spm to complete - "andi r16,1 \n\t" - "cpi r16,1 \n\t" - "breq wait_spm1 \n\t" - "ldi r16,0x03 \n\t" //Erase page pointed to by Z - "sts %0,r16 \n\t" - "spm \n\t" -#ifdef __AVR_ATmega163__ - ".word 0xFFFF \n\t" - "nop \n\t" -#endif - "wait_spm2: \n\t" - "lds r16,%0 \n\t" //Wait for previous spm to complete - "andi r16,1 \n\t" - "cpi r16,1 \n\t" - "breq wait_spm2 \n\t" - - "ldi r16,0x11 \n\t" //Re-enable RWW section - "sts %0,r16 \n\t" - "spm \n\t" -#ifdef __AVR_ATmega163__ - ".word 0xFFFF \n\t" - "nop \n\t" -#endif - "no_page_erase: \n\t" - "ld r0,Y+ \n\t" //Write 2 bytes into page buffer - "ld r1,Y+ \n\t" - - "wait_spm3: \n\t" - "lds r16,%0 \n\t" //Wait for previous spm to complete - "andi r16,1 \n\t" - "cpi r16,1 \n\t" - "breq wait_spm3 \n\t" - "ldi r16,0x01 \n\t" //Load r0,r1 into FLASH page buffer - "sts %0,r16 \n\t" - "spm \n\t" - - "inc r17 \n\t" //page_word_count++ - "cpi r17,%1 \n\t" - "brlo same_page \n\t" //Still same page in FLASH - "write_page: \n\t" - "clr r17 \n\t" //New page, write current one first - "wait_spm4: \n\t" - "lds r16,%0 \n\t" //Wait for previous spm to complete - "andi r16,1 \n\t" - "cpi r16,1 \n\t" - "breq wait_spm4 \n\t" -#ifdef __AVR_ATmega163__ - "andi r30,0x80 \n\t" // m163 requires Z6:Z1 to be zero during page write -#endif - "ldi r16,0x05 \n\t" //Write page pointed to by Z - "sts %0,r16 \n\t" - "spm \n\t" -#ifdef __AVR_ATmega163__ - ".word 0xFFFF \n\t" - "nop \n\t" - "ori r30,0x7E \n\t" // recover Z6:Z1 state after page write (had to be zero during write) -#endif - "wait_spm5: \n\t" - "lds r16,%0 \n\t" //Wait for previous spm to complete - "andi r16,1 \n\t" - "cpi r16,1 \n\t" - "breq wait_spm5 \n\t" - "ldi r16,0x11 \n\t" //Re-enable RWW section - "sts %0,r16 \n\t" - "spm \n\t" -#ifdef __AVR_ATmega163__ - ".word 0xFFFF \n\t" - "nop \n\t" -#endif - "same_page: \n\t" - "adiw r30,2 \n\t" //Next word in FLASH - "sbiw r24,2 \n\t" //length-2 - "breq final_write \n\t" //Finished - "rjmp length_loop \n\t" - "final_write: \n\t" - "cpi r17,0 \n\t" - "breq block_done \n\t" - "adiw r24,2 \n\t" //length+2, fool above check on length after short page write - "rjmp write_page \n\t" - "block_done: \n\t" - "clr __zero_reg__ \n\t" //restore zero register -#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega128__ || __AVR_ATmega1280__ || __AVR_ATmega1281__ - : "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" -#else - : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" -#endif - ); - /* Should really add a wait for RWW section to be enabled, don't actually need it since we never */ - /* exit the bootloader without a power cycle anyhow */ - } - putch(0x14); - putch(0x10); - } else { - if (++error_count == MAX_ERROR_COUNT) - app_start(); - } - } - - - /* Read memory block mode, length is big endian. */ - else if(ch=='t') { - length.byte[1] = getch(); - length.byte[0] = getch(); -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) - if (address.word>0x7FFF) flags.rampz = 1; // No go with m256, FIXME - else flags.rampz = 0; -#endif - address.word = address.word << 1; // address * 2 -> byte location - if (getch() == 'E') flags.eeprom = 1; - else flags.eeprom = 0; - if (getch() == ' ') { // Command terminator - putch(0x14); - for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay - if (flags.eeprom) { // Byte access EEPROM read -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) - while(EECR & (1<= 'a') { - return (a - 'a' + 0x0a); - } else if(a >= '0') { - return(a - '0'); - } - return a; -} - - -char gethex(void) { - return (gethexnib() << 4) + gethexnib(); -} - - -void puthex(char ch) { - char ah; - - ah = ch >> 4; - if(ah >= 0x0a) { - ah = ah - 0x0a + 'a'; - } else { - ah += '0'; - } - - ch &= 0x0f; - if(ch >= 0x0a) { - ch = ch - 0x0a + 'a'; - } else { - ch += '0'; - } - - putch(ah); - putch(ch); -} - - -void putch(char ch) -{ -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) - if(bootuart == 1) { - while (!(UCSR0A & _BV(UDRE0))); - UDR0 = ch; - } - else if (bootuart == 2) { - while (!(UCSR1A & _BV(UDRE1))); - UDR1 = ch; - } -#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) - while (!(UCSR0A & _BV(UDRE0))); - UDR0 = ch; -#else - /* m8,16,32,169,8515,8535,163 */ - while (!(UCSRA & _BV(UDRE))); - UDR = ch; -#endif -} - - -char getch(void) -{ -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) - uint32_t count = 0; - if(bootuart == 1) { - while(!(UCSR0A & _BV(RXC0))) { - /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ - /* HACKME:: here is a good place to count times*/ - count++; - if (count > MAX_TIME_COUNT) - app_start(); - } - - return UDR0; - } - else if(bootuart == 2) { - while(!(UCSR1A & _BV(RXC1))) { - /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ - /* HACKME:: here is a good place to count times*/ - count++; - if (count > MAX_TIME_COUNT) - app_start(); - } - - return UDR1; - } - return 0; -#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) - uint32_t count = 0; - while(!(UCSR0A & _BV(RXC0))){ - /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ - /* HACKME:: here is a good place to count times*/ - count++; - if (count > MAX_TIME_COUNT) - app_start(); - } - return UDR0; -#else - /* m8,16,32,169,8515,8535,163 */ - uint32_t count = 0; - while(!(UCSRA & _BV(RXC))){ - /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ - /* HACKME:: here is a good place to count times*/ - count++; - if (count > MAX_TIME_COUNT) - app_start(); - } - return UDR; -#endif -} - - -void getNch(uint8_t count) -{ - while(count--) { -#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) - if(bootuart == 1) { - while(!(UCSR0A & _BV(RXC0))); - UDR0; - } - else if(bootuart == 2) { - while(!(UCSR1A & _BV(RXC1))); - UDR1; - } -#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) - getch(); -#else - /* m8,16,32,169,8515,8535,163 */ - /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ - //while(!(UCSRA & _BV(RXC))); - //UDR; - getch(); // need to handle time out -#endif - } -} - - -void byte_response(uint8_t val) -{ - if (getch() == ' ') { - putch(0x14); - putch(val); - putch(0x10); - } else { - if (++error_count == MAX_ERROR_COUNT) - app_start(); - } -} - - -void nothing_response(void) -{ - if (getch() == ' ') { - putch(0x14); - putch(0x10); - } else { - if (++error_count == MAX_ERROR_COUNT) - app_start(); - } -} - -void flash_led(uint8_t count) -{ - while (count--) { - LED_PORT |= _BV(LED); - _delay_ms(100); - LED_PORT &= ~_BV(LED); - _delay_ms(100); - } -} - - -/* end of file ATmegaBOOT.c */ +/**********************************************************/ +/* Serial Bootloader for Atmel megaAVR Controllers */ +/* */ +/* tested with ATmega8, ATmega128 and ATmega168 */ +/* should work with other mega's, see code for details */ +/* */ +/* ATmegaBOOT.c */ +/* */ +/* */ +/* 20090308: integrated Mega changes into main bootloader */ +/* source by D. Mellis */ +/* 20080930: hacked for Arduino Mega (with the 1280 */ +/* processor, backwards compatible) */ +/* by D. Cuartielles */ +/* 20070626: hacked for Arduino Diecimila (which auto- */ +/* resets when a USB connection is made to it) */ +/* by D. Mellis */ +/* 20060802: hacked for Arduino by D. Cuartielles */ +/* based on a previous hack by D. Mellis */ +/* and D. Cuartielles */ +/* */ +/* Monitor and debug functions were added to the original */ +/* code by Dr. Erik Lins, chip45.com. (See below) */ +/* */ +/* Thanks to Karl Pitrich for fixing a bootloader pin */ +/* problem and more informative LED blinking! */ +/* */ +/* For the latest version see: */ +/* http://www.chip45.com/ */ +/* */ +/* ------------------------------------------------------ */ +/* */ +/* based on stk500boot.c */ +/* Copyright (c) 2003, Jason P. Kyle */ +/* All rights reserved. */ +/* see avr1.org for original file and information */ +/* */ +/* 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., */ +/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* */ +/* Licence can be viewed at */ +/* http://www.fsf.org/licenses/gpl.txt */ +/* */ +/* Target = Atmel AVR m128,m64,m32,m16,m8,m162,m163,m169, */ +/* m8515,m8535. ATmega161 has a very small boot block so */ +/* isn't supported. */ +/* */ +/* Tested with m168 */ +/**********************************************************/ + +/* $Id$ */ + + +/* some includes */ +#include +#include +#include +#include +#include +#include + +/* the current avr-libc eeprom functions do not support the ATmega168 */ +/* own eeprom write/read functions are used instead */ +#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) +#include +#endif + +/* Use the F_CPU defined in Makefile */ + +/* 20060803: hacked by DojoCorp */ +/* 20070626: hacked by David A. Mellis to decrease waiting time for auto-reset */ +/* set the waiting time for the bootloader */ +/* get this from the Makefile instead */ +/* #define MAX_TIME_COUNT (F_CPU>>4) */ + +/* 20070707: hacked by David A. Mellis - after this many errors give up and launch application */ +#define MAX_ERROR_COUNT 5 + +/* set the UART baud rate */ +/* 20060803: hacked by DojoCorp */ +//#define BAUD_RATE 115200 +#ifndef BAUD_RATE +#define BAUD_RATE 19200 +#endif + + +/* SW_MAJOR and MINOR needs to be updated from time to time to avoid warning message from AVR Studio */ +/* never allow AVR Studio to do an update !!!! */ +#define HW_VER 0x02 +#define SW_MAJOR 0x01 +#define SW_MINOR 0x10 + + +/* Adjust to suit whatever pin your hardware uses to enter the bootloader */ +/* ATmega128 has two UARTS so two pins are used to enter bootloader and select UART */ +/* ATmega1280 has four UARTS, but for Arduino Mega, we will only use RXD0 to get code */ +/* BL0... means UART0, BL1... means UART1 */ +#ifdef __AVR_ATmega128__ +#define BL_DDR DDRF +#define BL_PORT PORTF +#define BL_PIN PINF +#define BL0 PINF7 +#define BL1 PINF6 +#elif defined __AVR_ATmega1280__ +/* we just don't do anything for the MEGA and enter bootloader on reset anyway*/ +#else +/* other ATmegas have only one UART, so only one pin is defined to enter bootloader */ +#define BL_DDR DDRD +#define BL_PORT PORTD +#define BL_PIN PIND +#define BL PIND6 +#endif + + +/* onboard LED is used to indicate, that the bootloader was entered (3x flashing) */ +/* if monitor functions are included, LED goes on after monitor was entered */ +#if defined __AVR_ATmega128__ || defined __AVR_ATmega1280__ +/* Onboard LED is connected to pin PB7 (e.g. Crumb128, PROBOmega128, Savvy128, Arduino Mega) */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB7 +#else +/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duomilanuove */ +/* other boards like e.g. Crumb8, Crumb168 are using PB2 */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB5 +#endif + + +/* monitor functions will only be compiled when using ATmega128, due to bootblock size constraints */ +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) +#define MONITOR 1 +#endif + + +/* define various device id's */ +/* manufacturer byte is always the same */ +#define SIG1 0x1E // Yep, Atmel is the only manufacturer of AVR micros. Single source :( + +#if defined __AVR_ATmega1280__ +#define SIG2 0x97 +#define SIG3 0x03 +#define PAGE_SIZE 0x80U //128 words + +#elif defined __AVR_ATmega1281__ +#define SIG2 0x97 +#define SIG3 0x04 +#define PAGE_SIZE 0x80U //128 words + +#elif defined __AVR_ATmega128__ +#define SIG2 0x97 +#define SIG3 0x02 +#define PAGE_SIZE 0x80U //128 words + +#elif defined __AVR_ATmega64__ +#define SIG2 0x96 +#define SIG3 0x02 +#define PAGE_SIZE 0x80U //128 words + +#elif defined __AVR_ATmega32__ +#define SIG2 0x95 +#define SIG3 0x02 +#define PAGE_SIZE 0x40U //64 words + +#elif defined __AVR_ATmega16__ +#define SIG2 0x94 +#define SIG3 0x03 +#define PAGE_SIZE 0x40U //64 words + +#elif defined __AVR_ATmega8__ +#define SIG2 0x93 +#define SIG3 0x07 +#define PAGE_SIZE 0x20U //32 words + +#elif defined __AVR_ATmega88__ +#define SIG2 0x93 +#define SIG3 0x0a +#define PAGE_SIZE 0x20U //32 words + +#elif defined __AVR_ATmega168__ +#define SIG2 0x94 +#define SIG3 0x06 +#define PAGE_SIZE 0x40U //64 words + +#elif defined __AVR_ATmega328P__ +#define SIG2 0x95 +#define SIG3 0x0F +#define PAGE_SIZE 0x40U //64 words + +#elif defined __AVR_ATmega162__ +#define SIG2 0x94 +#define SIG3 0x04 +#define PAGE_SIZE 0x40U //64 words + +#elif defined __AVR_ATmega163__ +#define SIG2 0x94 +#define SIG3 0x02 +#define PAGE_SIZE 0x40U //64 words + +#elif defined __AVR_ATmega169__ +#define SIG2 0x94 +#define SIG3 0x05 +#define PAGE_SIZE 0x40U //64 words + +#elif defined __AVR_ATmega8515__ +#define SIG2 0x93 +#define SIG3 0x06 +#define PAGE_SIZE 0x20U //32 words + +#elif defined __AVR_ATmega8535__ +#define SIG2 0x93 +#define SIG3 0x08 +#define PAGE_SIZE 0x20U //32 words +#endif + + +/* function prototypes */ +void putch(char); +char getch(void); +void getNch(uint8_t); +void byte_response(uint8_t); +void nothing_response(void); +char gethex(void); +void puthex(char); +void flash_led(uint8_t); + +/* some variables */ +union address_union { + uint16_t word; + uint8_t byte[2]; +} address; + +union length_union { + uint16_t word; + uint8_t byte[2]; +} length; + +struct flags_struct { + unsigned eeprom : 1; + unsigned rampz : 1; +} flags; + +uint8_t buff[256]; +uint8_t address_high; + +uint8_t pagesz=0x80; + +uint8_t i; +uint8_t bootuart = 0; + +uint8_t error_count = 0; + +void (*app_start)(void) = 0x0000; + + +/* main program starts here */ +int main(void) +{ + uint8_t ch,ch2; + uint16_t w; + +#ifdef WATCHDOG_MODS + ch = MCUSR; + MCUSR = 0; + + WDTCSR |= _BV(WDCE) | _BV(WDE); + WDTCSR = 0; + + // Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot. + if (! (ch & _BV(EXTRF))) // if its a not an external reset... + app_start(); // skip bootloader +#else + asm volatile("nop\n\t"); +#endif + + /* set pin direction for bootloader pin and enable pullup */ + /* for ATmega128, two pins need to be initialized */ +#ifdef __AVR_ATmega128__ + BL_DDR &= ~_BV(BL0); + BL_DDR &= ~_BV(BL1); + BL_PORT |= _BV(BL0); + BL_PORT |= _BV(BL1); +#else + /* We run the bootloader regardless of the state of this pin. Thus, don't + put it in a different state than the other pins. --DAM, 070709 + This also applies to Arduino Mega -- DC, 080930 + BL_DDR &= ~_BV(BL); + BL_PORT |= _BV(BL); + */ +#endif + + +#ifdef __AVR_ATmega128__ + /* check which UART should be used for booting */ + if(bit_is_clear(BL_PIN, BL0)) { + bootuart = 1; + } + else if(bit_is_clear(BL_PIN, BL1)) { + bootuart = 2; + } +#endif + +#if defined __AVR_ATmega1280__ + /* the mega1280 chip has four serial ports ... we could eventually use any of them, or not? */ + /* however, we don't wanna confuse people, to avoid making a mess, we will stick to RXD0, TXD0 */ + bootuart = 1; +#endif + + /* check if flash is programmed already, if not start bootloader anyway */ + if(pgm_read_byte_near(0x0000) != 0xFF) { + +#ifdef __AVR_ATmega128__ + /* no UART was selected, start application */ + if(!bootuart) { + app_start(); + } +#else + /* check if bootloader pin is set low */ + /* we don't start this part neither for the m8, nor m168 */ + //if(bit_is_set(BL_PIN, BL)) { + // app_start(); + // } +#endif + } + +#ifdef __AVR_ATmega128__ + /* no bootuart was selected, default to uart 0 */ + if(!bootuart) { + bootuart = 1; + } +#endif + + + /* initialize UART(s) depending on CPU defined */ +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) + if(bootuart == 1) { + UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); + UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; + UCSR0A = 0x00; + UCSR0C = 0x06; + UCSR0B = _BV(TXEN0)|_BV(RXEN0); + } + if(bootuart == 2) { + UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); + UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; + UCSR1A = 0x00; + UCSR1C = 0x06; + UCSR1B = _BV(TXEN1)|_BV(RXEN1); + } +#elif defined __AVR_ATmega163__ + UBRR = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); + UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8; + UCSRA = 0x00; + UCSRB = _BV(TXEN)|_BV(RXEN); +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) + +#ifdef DOUBLE_SPEED + UCSR0A = (1<> 8; +#else + UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); + UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; +#endif + + UCSR0B = (1<>8; // set baud rate + UBRRL = (((F_CPU/BAUD_RATE)/16)-1); + UCSRB = (1<> 8; + UCSRA = 0x00; + UCSRC = 0x06; + UCSRB = _BV(TXEN)|_BV(RXEN); +#endif + +#if defined __AVR_ATmega1280__ + /* Enable internal pull-up resistor on pin D0 (RX), in order + to supress line noise that prevents the bootloader from + timing out (DAM: 20070509) */ + /* feature added to the Arduino Mega --DC: 080930 */ + DDRE &= ~_BV(PINE0); + PORTE |= _BV(PINE0); +#endif + + + /* set LED pin as output */ + LED_DDR |= _BV(LED); + + + /* flash onboard LED to signal entering of bootloader */ +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) + // 4x for UART0, 5x for UART1 + flash_led(NUM_LED_FLASHES + bootuart); +#else + flash_led(NUM_LED_FLASHES); +#endif + + /* 20050803: by DojoCorp, this is one of the parts provoking the + system to stop listening, cancelled from the original */ + //putch('\0'); + + /* forever loop */ + for (;;) { + + /* get character from UART */ + ch = getch(); + + /* A bunch of if...else if... gives smaller code than switch...case ! */ + + /* Hello is anyone home ? */ + if(ch=='0') { + nothing_response(); + } + + + /* Request programmer ID */ + /* Not using PROGMEM string due to boot block in m128 being beyond 64kB boundry */ + /* Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares. */ + else if(ch=='1') { + if (getch() == ' ') { + putch(0x14); + putch('A'); + putch('V'); + putch('R'); + putch(' '); + putch('I'); + putch('S'); + putch('P'); + putch(0x10); + } else { + if (++error_count == MAX_ERROR_COUNT) + app_start(); + } + } + + + /* AVR ISP/STK500 board commands DON'T CARE so default nothing_response */ + else if(ch=='@') { + ch2 = getch(); + if (ch2>0x85) getch(); + nothing_response(); + } + + + /* AVR ISP/STK500 board requests */ + else if(ch=='A') { + ch2 = getch(); + if(ch2==0x80) byte_response(HW_VER); // Hardware version + else if(ch2==0x81) byte_response(SW_MAJOR); // Software major version + else if(ch2==0x82) byte_response(SW_MINOR); // Software minor version + else if(ch2==0x98) byte_response(0x03); // Unknown but seems to be required by avr studio 3.56 + else byte_response(0x00); // Covers various unnecessary responses we don't care about + } + + + /* Device Parameters DON'T CARE, DEVICE IS FIXED */ + else if(ch=='B') { + getNch(20); + nothing_response(); + } + + + /* Parallel programming stuff DON'T CARE */ + else if(ch=='E') { + getNch(5); + nothing_response(); + } + + + /* P: Enter programming mode */ + /* R: Erase device, don't care as we will erase one page at a time anyway. */ + else if(ch=='P' || ch=='R') { + nothing_response(); + } + + + /* Leave programming mode */ + else if(ch=='Q') { + nothing_response(); +#ifdef WATCHDOG_MODS + // autoreset via watchdog (sneaky!) + WDTCSR = _BV(WDE); + while (1); // 16 ms +#endif + } + + + /* Set address, little endian. EEPROM in bytes, FLASH in words */ + /* Perhaps extra address bytes may be added in future to support > 128kB FLASH. */ + /* This might explain why little endian was used here, big endian used everywhere else. */ + else if(ch=='U') { + address.byte[0] = getch(); + address.byte[1] = getch(); + nothing_response(); + } + + + /* Universal SPI programming command, disabled. Would be used for fuses and lock bits. */ + else if(ch=='V') { + if (getch() == 0x30) { + getch(); + ch = getch(); + getch(); + if (ch == 0) { + byte_response(SIG1); + } else if (ch == 1) { + byte_response(SIG2); + } else { + byte_response(SIG3); + } + } else { + getNch(3); + byte_response(0x00); + } + } + + + /* Write memory, length is big endian and is in bytes */ + else if(ch=='d') { + length.byte[1] = getch(); + length.byte[0] = getch(); + flags.eeprom = 0; + if (getch() == 'E') flags.eeprom = 1; + for (w=0;w127) address_high = 0x01; //Only possible with m128, m256 will need 3rd address byte. FIXME + else address_high = 0x00; +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) + RAMPZ = address_high; +#endif + address.word = address.word << 1; //address * 2 -> byte location + /* if ((length.byte[0] & 0x01) == 0x01) length.word++; //Even up an odd number of bytes */ + if ((length.byte[0] & 0x01)) length.word++; //Even up an odd number of bytes + cli(); //Disable interrupts, just to be sure +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) + while(bit_is_set(EECR,EEPE)); //Wait for previous EEPROM writes to complete +#else + while(bit_is_set(EECR,EEWE)); //Wait for previous EEPROM writes to complete +#endif + asm volatile( + "clr r17 \n\t" //page_word_count + "lds r30,address \n\t" //Address of FLASH location (in bytes) + "lds r31,address+1 \n\t" + "ldi r28,lo8(buff) \n\t" //Start of buffer array in RAM + "ldi r29,hi8(buff) \n\t" + "lds r24,length \n\t" //Length of data to be written (in bytes) + "lds r25,length+1 \n\t" + "length_loop: \n\t" //Main loop, repeat for number of words in block + "cpi r17,0x00 \n\t" //If page_word_count=0 then erase page + "brne no_page_erase \n\t" + "wait_spm1: \n\t" + "lds r16,%0 \n\t" //Wait for previous spm to complete + "andi r16,1 \n\t" + "cpi r16,1 \n\t" + "breq wait_spm1 \n\t" + "ldi r16,0x03 \n\t" //Erase page pointed to by Z + "sts %0,r16 \n\t" + "spm \n\t" +#ifdef __AVR_ATmega163__ + ".word 0xFFFF \n\t" + "nop \n\t" +#endif + "wait_spm2: \n\t" + "lds r16,%0 \n\t" //Wait for previous spm to complete + "andi r16,1 \n\t" + "cpi r16,1 \n\t" + "breq wait_spm2 \n\t" + + "ldi r16,0x11 \n\t" //Re-enable RWW section + "sts %0,r16 \n\t" + "spm \n\t" +#ifdef __AVR_ATmega163__ + ".word 0xFFFF \n\t" + "nop \n\t" +#endif + "no_page_erase: \n\t" + "ld r0,Y+ \n\t" //Write 2 bytes into page buffer + "ld r1,Y+ \n\t" + + "wait_spm3: \n\t" + "lds r16,%0 \n\t" //Wait for previous spm to complete + "andi r16,1 \n\t" + "cpi r16,1 \n\t" + "breq wait_spm3 \n\t" + "ldi r16,0x01 \n\t" //Load r0,r1 into FLASH page buffer + "sts %0,r16 \n\t" + "spm \n\t" + + "inc r17 \n\t" //page_word_count++ + "cpi r17,%1 \n\t" + "brlo same_page \n\t" //Still same page in FLASH + "write_page: \n\t" + "clr r17 \n\t" //New page, write current one first + "wait_spm4: \n\t" + "lds r16,%0 \n\t" //Wait for previous spm to complete + "andi r16,1 \n\t" + "cpi r16,1 \n\t" + "breq wait_spm4 \n\t" +#ifdef __AVR_ATmega163__ + "andi r30,0x80 \n\t" // m163 requires Z6:Z1 to be zero during page write +#endif + "ldi r16,0x05 \n\t" //Write page pointed to by Z + "sts %0,r16 \n\t" + "spm \n\t" +#ifdef __AVR_ATmega163__ + ".word 0xFFFF \n\t" + "nop \n\t" + "ori r30,0x7E \n\t" // recover Z6:Z1 state after page write (had to be zero during write) +#endif + "wait_spm5: \n\t" + "lds r16,%0 \n\t" //Wait for previous spm to complete + "andi r16,1 \n\t" + "cpi r16,1 \n\t" + "breq wait_spm5 \n\t" + "ldi r16,0x11 \n\t" //Re-enable RWW section + "sts %0,r16 \n\t" + "spm \n\t" +#ifdef __AVR_ATmega163__ + ".word 0xFFFF \n\t" + "nop \n\t" +#endif + "same_page: \n\t" + "adiw r30,2 \n\t" //Next word in FLASH + "sbiw r24,2 \n\t" //length-2 + "breq final_write \n\t" //Finished + "rjmp length_loop \n\t" + "final_write: \n\t" + "cpi r17,0 \n\t" + "breq block_done \n\t" + "adiw r24,2 \n\t" //length+2, fool above check on length after short page write + "rjmp write_page \n\t" + "block_done: \n\t" + "clr __zero_reg__ \n\t" //restore zero register +#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega128__ || __AVR_ATmega1280__ || __AVR_ATmega1281__ + : "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" +#else + : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" +#endif + ); + /* Should really add a wait for RWW section to be enabled, don't actually need it since we never */ + /* exit the bootloader without a power cycle anyhow */ + } + putch(0x14); + putch(0x10); + } else { + if (++error_count == MAX_ERROR_COUNT) + app_start(); + } + } + + + /* Read memory block mode, length is big endian. */ + else if(ch=='t') { + length.byte[1] = getch(); + length.byte[0] = getch(); +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) + if (address.word>0x7FFF) flags.rampz = 1; // No go with m256, FIXME + else flags.rampz = 0; +#endif + address.word = address.word << 1; // address * 2 -> byte location + if (getch() == 'E') flags.eeprom = 1; + else flags.eeprom = 0; + if (getch() == ' ') { // Command terminator + putch(0x14); + for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay + if (flags.eeprom) { // Byte access EEPROM read +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) + while(EECR & (1<= 'a') { + return (a - 'a' + 0x0a); + } else if(a >= '0') { + return(a - '0'); + } + return a; +} + + +char gethex(void) { + return (gethexnib() << 4) + gethexnib(); +} + + +void puthex(char ch) { + char ah; + + ah = ch >> 4; + if(ah >= 0x0a) { + ah = ah - 0x0a + 'a'; + } else { + ah += '0'; + } + + ch &= 0x0f; + if(ch >= 0x0a) { + ch = ch - 0x0a + 'a'; + } else { + ch += '0'; + } + + putch(ah); + putch(ch); +} + + +void putch(char ch) +{ +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) + if(bootuart == 1) { + while (!(UCSR0A & _BV(UDRE0))); + UDR0 = ch; + } + else if (bootuart == 2) { + while (!(UCSR1A & _BV(UDRE1))); + UDR1 = ch; + } +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) + while (!(UCSR0A & _BV(UDRE0))); + UDR0 = ch; +#else + /* m8,16,32,169,8515,8535,163 */ + while (!(UCSRA & _BV(UDRE))); + UDR = ch; +#endif +} + + +char getch(void) +{ +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) + uint32_t count = 0; + if(bootuart == 1) { + while(!(UCSR0A & _BV(RXC0))) { + /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ + /* HACKME:: here is a good place to count times*/ + count++; + if (count > MAX_TIME_COUNT) + app_start(); + } + + return UDR0; + } + else if(bootuart == 2) { + while(!(UCSR1A & _BV(RXC1))) { + /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ + /* HACKME:: here is a good place to count times*/ + count++; + if (count > MAX_TIME_COUNT) + app_start(); + } + + return UDR1; + } + return 0; +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) + uint32_t count = 0; + while(!(UCSR0A & _BV(RXC0))){ + /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ + /* HACKME:: here is a good place to count times*/ + count++; + if (count > MAX_TIME_COUNT) + app_start(); + } + return UDR0; +#else + /* m8,16,32,169,8515,8535,163 */ + uint32_t count = 0; + while(!(UCSRA & _BV(RXC))){ + /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ + /* HACKME:: here is a good place to count times*/ + count++; + if (count > MAX_TIME_COUNT) + app_start(); + } + return UDR; +#endif +} + + +void getNch(uint8_t count) +{ + while(count--) { +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) + if(bootuart == 1) { + while(!(UCSR0A & _BV(RXC0))); + UDR0; + } + else if(bootuart == 2) { + while(!(UCSR1A & _BV(RXC1))); + UDR1; + } +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) + getch(); +#else + /* m8,16,32,169,8515,8535,163 */ + /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ + //while(!(UCSRA & _BV(RXC))); + //UDR; + getch(); // need to handle time out +#endif + } +} + + +void byte_response(uint8_t val) +{ + if (getch() == ' ') { + putch(0x14); + putch(val); + putch(0x10); + } else { + if (++error_count == MAX_ERROR_COUNT) + app_start(); + } +} + + +void nothing_response(void) +{ + if (getch() == ' ') { + putch(0x14); + putch(0x10); + } else { + if (++error_count == MAX_ERROR_COUNT) + app_start(); + } +} + +void flash_led(uint8_t count) +{ + while (count--) { + LED_PORT |= _BV(LED); + _delay_ms(100); + LED_PORT &= ~_BV(LED); + _delay_ms(100); + } +} + + +/* end of file ATmegaBOOT.c */ diff --git a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex index f16e877f874..ddae1db542e 100644 --- a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex +++ b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex @@ -1,245 +1,245 @@ -:020000021000EC -:10F000000C9472F80C9492F80C9492F80C9492F878 -:10F010000C9492F80C9492F80C9492F80C9492F848 -:10F020000C9492F80C9492F80C9492F80C9492F838 -:10F030000C9492F80C9492F80C9492F80C9492F828 -:10F040000C9492F80C9492F80C9492F80C9492F818 -:10F050000C9492F80C9492F80C9492F80C9492F808 -:10F060000C9492F80C9492F80C9492F80C9492F8F8 -:10F070000C9492F80C9492F80C9492F80C9492F8E8 -:10F080000C9492F80C9492F80C9492F80C9492F8D8 -:10F090000C9492F80C9492F80C9492F80C9492F8C8 -:10F0A0000C9492F80C9492F80C9492F80C9492F8B8 -:10F0B0000C9492F80C9492F80C9492F80C9492F8A8 -:10F0C0000C9492F80C9492F80C9492F80C9492F898 -:10F0D0000C9492F80C9492F80C9492F80C9492F888 -:10F0E0000C9492F811241FBECFEFD1E2DEBFCDBF4A -:10F0F00012E0A0E0B2E0EEEDFEEF01E00BBF02C0D7 -:10F1000007900D92A833B107D9F71BBE13E0A8E30F -:10F11000B2E001C01D92A334B107E1F70E9412FAD8 -:10F120000C946DFF0C9400F8982F959595959595F6 -:10F130009595905D8F708A301CF1282F295A809107 -:10F140003802813019F0823071F008958091C0004A -:10F1500085FFFCCF9093C6008091C00085FFFCCF57 -:10F160002093C60008958091C80085FFFCCF90933E -:10F17000CE008091C80085FFFCCF2093CE0008957B -:10F18000282F205DDCCF982F80913802813019F034 -:10F19000823041F008958091C00085FFFCCF9093AC -:10F1A000C60008958091C80085FFFCCF9093CE00E3 -:10F1B0000895EF92FF920F931F9380913802813050 -:10F1C00069F1823031F080E01F910F91FF90EF9054 -:10F1D0000895EE24FF2487018091C80087FD17C0A1 -:10F1E0000894E11CF11C011D111D81E4E81682E464 -:10F1F000F8068FE0080780E0180770F3E0913A0204 -:10F20000F0913B0209958091C80087FFE9CF80917A -:10F21000CE001F910F91FF90EF900895EE24FF24F0 -:10F2200087018091C00087FD17C00894E11CF11C84 -:10F23000011D111D81E4E81682E4F8068FE008073D -:10F2400080E0180770F3E0913A02F0913B020995D3 -:10F250008091C00087FFE9CF8091C6001F910F9178 -:10F26000FF90EF9008950E94D9F8982F809138026E -:10F27000813049F0823091F091366CF490330CF08B -:10F280009053892F08958091C00085FFFCCF909303 -:10F29000C60091369CF39755892F08958091C80038 -:10F2A00085FFFCCF9093CE00E7CF1F930E9433F9E8 -:10F2B000182F0E9433F91295107F810F1F91089526 -:10F2C000982F20913802992339F0213031F02230E3 -:10F2D00061F091509923C9F708958091C00087FF8C -:10F2E000FCCF8091C6009150F5CF8091C80087FF78 -:10F2F000FCCF8091CE009150EDCF1F93182F0E942C -:10F30000D9F8803249F0809139028F5F80933902B9 -:10F31000853091F11F910895809138028130B9F0C4 -:10F320008230C1F78091C80085FFFCCF84E18093D3 -:10F33000CE008091C80085FFFCCF1093CE00809155 -:10F34000C80085FFFCCF80E18093CE00E3CF8091A1 -:10F35000C00085FFFCCF84E18093C6008091C0008F -:10F3600085FFFCCF1093C6008091C00085FFFCCFC5 -:10F3700080E18093C600CECFE0913A02F0913B024B -:10F3800009951F9108950E94D9F8803241F080912B -:10F3900039028F5F80933902853029F10895809179 -:10F3A0003802813089F08230C9F78091C80085FF2A -:10F3B000FCCF84E18093CE008091C80085FFFCCF14 -:10F3C00080E18093CE0008958091C00085FFFCCF3E -:10F3D00084E18093C6008091C00085FFFCCF80E16E -:10F3E0008093C6000895E0913A02F0913B0209959E -:10F3F000089540E951E08823A1F02F9A28EE33E0E8 -:10F40000FA013197F1F721503040D1F72F9828EECB -:10F4100033E0FA013197F1F721503040D1F78150B4 -:10F4200061F708952F923F924F925F926F927F9271 -:10F430008F929F92AF92BF92CF92DF92EF92FF9204 -:10F440000F931F93CF93DF93000081E080933802E6 -:10F4500080E18093C4001092C5001092C00086E045 -:10F460008093C20088E18093C1006898709A279ABF -:10F4700081E00E94F9F9E4E1EE2E7EE1D72E67E902 -:10F48000C62E53E0B52E40E1A42E9924939431E486 -:10F49000832E26E5722E92E5692E80E2582E09E42D -:10F4A000402E13E5312EB0E52B2E0E94D9F8803383 -:10F4B000C9F1813309F452C0803409F4C8C08134E1 -:10F4C00009F4EAC0823489F1853409F4CAC0803570 -:10F4D00049F1823539F1813529F1853509F4ECC0DE -:10F4E000863509F409C1843609F428C1843709F442 -:10F4F000ABC1853709F473C2863709F4D9C08132AC -:10F5000009F4B7C2809139028F5F80933902853048 -:10F5100061F6E0913A02F0913B0209950E94D9F818 -:10F52000803339F60E94C3F9C0CF2091380293E1AD -:10F5300005C0223061F09923A9F391502130C9F719 -:10F540008091C00087FFFCCF8091C600F4CF8091EE -:10F55000C80087FFFCCF8091CE00EDCF0E94D9F884 -:10F56000803281F6809138028130D1F1823009F009 -:10F570009CCF8091C80085FFFCCFE092CE008091A7 -:10F58000C80085FFFCCF8092CE008091C80085FF27 -:10F59000FCCF7092CE008091C80085FFFCCF6092B6 -:10F5A000CE008091C80085FFFCCF5092CE008091A4 -:10F5B000C80085FFFCCF4092CE008091C80085FF37 -:10F5C000FCCF3092CE008091C80085FFFCCF209206 -:10F5D000CE008091C80085FFFCCFA092CE0065CF01 -:10F5E0008091C00085FFFCCFE092C6008091C000F2 -:10F5F00085FFFCCF8092C6008091C00085FFFCCFC4 -:10F600007092C6008091C00085FFFCCF6092C6005A -:10F610008091C00085FFFCCF5092C6008091C00051 -:10F6200085FFFCCF4092C6008091C00085FFFCCFD3 -:10F630003092C6008091C00085FFFCCF2092C600AA -:10F640008091C00085FFFCCFA092C6002ECF0E9403 -:10F65000D9F8863808F466CF0E94D9F80E94C3F919 -:10F6600024CF2091380294E0213041F0223069F01B -:10F67000992309F457CF91502130C1F78091C000F0 -:10F6800087FFFCCF8091C600F3CF8091C80087FF31 -:10F69000FCCF8091CE00ECCF0E94D9F8803841F1A8 -:10F6A000813809F447C0823809F4CAC08839E1F0CA -:10F6B00080E00E947DF9F9CE0E94D9F880933C0247 -:10F6C0000E94D9F880933D020E94C3F9EECE0E94B9 -:10F6D000D9F80E94D9F8182F0E94D9F8112309F4FB -:10F6E0007EC2113009F40AC283E00E947DF9DDCEAA -:10F6F00082E00E947DF9D9CE0E94D9F8803339F397 -:10F700002091380292E0213039F0223061F09923C3 -:10F7100079F291502130C9F78091C00087FFFCCF6A -:10F720008091C600F4CF8091C80087FFFCCF809104 -:10F73000CE00EDCF81E00E947DF9B7CE0E94D9F8CE -:10F7400080933F030E94D9F880933E038091420347 -:10F750008E7F809342030E94D9F8853409F4B3C1A7 -:10F7600080913E0390913F03892B89F000E010E0E7 -:10F770000E94D9F8F801E25CFD4F80830F5F1F4FB4 -:10F7800080913E0390913F030817190788F30E9468 -:10F79000D9F8803209F0B6CE8091420380FFB2C121 -:10F7A00040913C0250913D02440F551F50933D0241 -:10F7B00040933C0260913E0370913F0361157105D7 -:10F7C000F1F080E090E09A01280F391FFC01E25C23 -:10F7D000FD4FE081F999FECF1FBA32BD21BDE0BDDA -:10F7E0000FB6F894FA9AF99A0FBE01968617970702 -:10F7F00050F3460F571F50933D0240933C028091B7 -:10F800003802813081F0823009F04FCE8091C800FB -:10F8100085FFFCCFE092CE008091C80085FFFCCF31 -:10F82000A092CE0042CE8091C00085FFFCCFE09236 -:10F83000C6008091C00085FFFCCFA092C60035CEE7 -:10F8400080E10E947DF931CE0E94D9F880933F0378 -:10F850000E94D9F880933E0320913C0230913D02F2 -:10F8600037FD46C1809142038D7F80934203220F72 -:10F87000331F30933D0220933C020E94D9F8853417 -:10F8800009F430C1809142038E7F809342030E942D -:10F89000D9F8803209F009CE60913802613009F45C -:10F8A0006FC0623009F473C000913E0310913F03B2 -:10F8B0000115110509F440C080914203782F717041 -:10F8C000F82EF69481E0F82240913C0250913D02DE -:10F8D00020E030E013C0FF2009F060C0FA019491ED -:10F8E000613009F43BC0623009F441C0CA0101969D -:10F8F0002F5F3F4FAC0120173107D0F4772359F326 -:10F90000F999FECF52BD41BDF89A90B56130F9F03A -:10F91000623061F78091C80085FFFCCF9093CE00E4 -:10F92000CA0101962F5F3F4FAC012017310730F31A -:10F9300090933D0280933C02613009F4CAC062306A -:10F9400009F0B3CD8091C80085FFFCCF46CE8091F1 -:10F95000C00085FFFCCF9093C600C8CF8091C00047 -:10F9600085FDF9CF8091C00085FFF8CFF4CF80915D -:10F97000C80085FDD3CF8091C80085FFF8CFCECFDA -:10F980008091C00085FFFCCFE092C6008DCF8091B2 -:10F99000C80085FFFCCFE092CE0086CFCA01A0E070 -:10F9A000B0E080509040AF4FBF4FABBFFC0197918C -:10F9B000613061F0623009F099CF8091C80085FD17 -:10F9C000ADCF8091C80085FFF8CFA8CF8091C0004F -:10F9D00085FDC1CF8091C00085FFF8CFBCCF0E94CC -:10F9E000D9F8803209F08ECD80913802813011F142 -:10F9F000823009F05ACD8091C80085FFFCCFE0929B -:10FA0000CE008091C80085FFFCCFD092CE008091BF -:10FA1000C80085FFFCCFC092CE008091C80085FF52 -:10FA2000FCCFB092CE008091C80085FFFCCFA092A1 -:10FA3000CE003BCD8091C00085FFFCCFE092C60098 -:10FA40008091C00085FFFCCFD092C6008091C0009D -:10FA500085FFFCCFC092C6008091C00085FFFCCF1F -:10FA6000B092C6008091C00085FFFCCFA092C60076 -:10FA70001CCD0E94D9F8813209F017CD0E94D9F827 -:10FA8000813209F012CD279A2F98109240032091CD -:10FA90003802E1E491E00EC0223009F4A4C0909352 -:10FAA0004003E92FF0E0E050FE4FE0819F5FEE233E -:10FAB00009F4A0C0213081F78091C00085FFFCCF00 -:10FAC000E093C600ECCF80914203816080934203B3 -:10FAD00047CE8091C00085FDB7CD8091C00085FFE5 -:10FAE000F8CFB2CD80914203816080934203CFCEA4 -:10FAF00080914203826080934203B9CE87E90E94DD -:10FB00007DF9D3CC80913D028823880F880B892111 -:10FB1000809341038BBF80913C0290913D02880FFE -:10FB2000991F90933D0280933C0280913E0380FF99 -:10FB300009C080913E0390913F03019690933F034B -:10FB400080933E03F894F999FECF1127E0913C028F -:10FB5000F0913D02CEE3D2E080913E0390913F03CD -:10FB6000103091F40091570001700130D9F303E097 -:10FB700000935700E8950091570001700130D9F3C8 -:10FB800001E100935700E895099019900091570002 -:10FB900001700130D9F301E000935700E895139507 -:10FBA000103898F011270091570001700130D9F3F7 -:10FBB00005E000935700E89500915700017001306F -:10FBC000D9F301E100935700E8953296029709F0C6 -:10FBD000C7CF103011F00296E5CF112410CE8EE180 -:10FBE0000E947DF962CC8091C80085FFFCCFE09334 -:10FBF000CE0055CF7AE0B72E6DE0A62E5AE3952EB3 -:10FC000040E2842E3DE3732E90E3692E81E3582E6B -:10FC1000213009F442C0223009F45FC00E94D9F8B3 -:10FC2000982F20913802213089F1223009F44EC0FA -:10FC3000943709F46BC0923709F405C1973709F47A -:10FC40007BC0953799F0923609F4BDC09A3601F71A -:10FC5000E0913A02F0913B02099520913802D8CF09 -:10FC60008091C00085FFFCCF9093C6000E94D9F818 -:10FC7000982F80913802813099F38230B9F78091C2 -:10FC8000C80085FFFCCF9093CE00F0CF8091C000DC -:10FC900085FFFCCF9093C600CBCF8091C00085FF3D -:10FCA000FCCFB092C6008091C00085FFFCCFA0922F -:10FCB000C6008091C00085FFFCCF9092C600809165 -:10FCC000C00085FFFCCF8092C600A8CF8091C800FD -:10FCD00085FFFCCF9093CE00ABCF8091C80085FF0D -:10FCE000FCCFB092CE008091C80085FFFCCFA092DF -:10FCF000CE008091C80085FFFCCF9092CE0080910D -:10FD0000C80085FFFCCF8092CE0088CF1F9947C0E6 -:10FD10002F9A213051F0223009F07ACF8091C8001B -:10FD200085FFFCCF6092CE0073CF8091C00085FF2D -:10FD3000FCCF6092C6006CCF0E94D9F8982F8091BA -:10FD400038028130F1F0823009F4ABC00E9455F9DD -:10FD5000082F0E9455F9182F0E94D9F8982F8091EA -:10FD600038028130A9F0823009F4A2C00E9455F90E -:10FD7000D02ECC24F601E10FF11D808320913802B2 -:10FD800047CF8091C00085FFFCCF9093C600DECFA7 -:10FD90008091C00085FFFCCF9093C600E7CF2F98DD -:10FDA000213051F0223009F033CF8091C80085FF17 -:10FDB000FCCF5092CE002CCF8091C00085FFFCCFAD -:10FDC0005092C60025CF213041F1223081F080E8E9 -:10FDD00085BF109274001092750080E091E1FC01E3 -:10FDE000819180E091E13097D1F3CF01F8CF8091FC -:10FDF000C80085FFFCCF82E68093CE008091C800CA -:10FE000085FFFCCF85E78093CE008091C80085FFF9 -:10FE1000FCCF83E78093CE00DACF8091C00085FFCE -:10FE2000FCCF82E68093C6008091C00085FFFCCFA6 -:10FE300085E78093C6008091C00085FFFCCF83E7F3 -:10FE40008093C600C4CF0E94D9F8982F80913802C1 -:10FE50008130C9F08230D1F10E9455F9182F0E94EB -:10FE600055F9982F809138028130A1F0823039F114 -:10FE7000F12EEE24F701E90FF11D80810E9494F824 -:10FE800020913802C5CE8091C00085FFFCCF9093B1 -:10FE9000C600E2CF8091C00085FFFCCF7092C60003 -:10FEA000E7CF8091C80085FFFCCF9093CE004ECF66 -:10FEB0008091C80085FFFCCF9093CE0057CF8091F2 -:10FEC000C80085FFFCCF7092CE00D2CF8091C800D1 -:0EFED00085FFFCCF9093CE00BFCFF894FFCFFC -:10FEDE0041546D656761424F4F54202F204172642B -:10FEEE0075696E6F204D656761202D20284329208E -:10FEFE0041726475696E6F204C4C43202D20303951 -:08FF0E00303933300A0D008088 -:040000031000F000F9 -:00000001FF +:020000021000EC +:10F000000C9472F80C9492F80C9492F80C9492F878 +:10F010000C9492F80C9492F80C9492F80C9492F848 +:10F020000C9492F80C9492F80C9492F80C9492F838 +:10F030000C9492F80C9492F80C9492F80C9492F828 +:10F040000C9492F80C9492F80C9492F80C9492F818 +:10F050000C9492F80C9492F80C9492F80C9492F808 +:10F060000C9492F80C9492F80C9492F80C9492F8F8 +:10F070000C9492F80C9492F80C9492F80C9492F8E8 +:10F080000C9492F80C9492F80C9492F80C9492F8D8 +:10F090000C9492F80C9492F80C9492F80C9492F8C8 +:10F0A0000C9492F80C9492F80C9492F80C9492F8B8 +:10F0B0000C9492F80C9492F80C9492F80C9492F8A8 +:10F0C0000C9492F80C9492F80C9492F80C9492F898 +:10F0D0000C9492F80C9492F80C9492F80C9492F888 +:10F0E0000C9492F811241FBECFEFD1E2DEBFCDBF4A +:10F0F00012E0A0E0B2E0EEEDFEEF01E00BBF02C0D7 +:10F1000007900D92A833B107D9F71BBE13E0A8E30F +:10F11000B2E001C01D92A334B107E1F70E9412FAD8 +:10F120000C946DFF0C9400F8982F959595959595F6 +:10F130009595905D8F708A301CF1282F295A809107 +:10F140003802813019F0823071F008958091C0004A +:10F1500085FFFCCF9093C6008091C00085FFFCCF57 +:10F160002093C60008958091C80085FFFCCF90933E +:10F17000CE008091C80085FFFCCF2093CE0008957B +:10F18000282F205DDCCF982F80913802813019F034 +:10F19000823041F008958091C00085FFFCCF9093AC +:10F1A000C60008958091C80085FFFCCF9093CE00E3 +:10F1B0000895EF92FF920F931F9380913802813050 +:10F1C00069F1823031F080E01F910F91FF90EF9054 +:10F1D0000895EE24FF2487018091C80087FD17C0A1 +:10F1E0000894E11CF11C011D111D81E4E81682E464 +:10F1F000F8068FE0080780E0180770F3E0913A0204 +:10F20000F0913B0209958091C80087FFE9CF80917A +:10F21000CE001F910F91FF90EF900895EE24FF24F0 +:10F2200087018091C00087FD17C00894E11CF11C84 +:10F23000011D111D81E4E81682E4F8068FE008073D +:10F2400080E0180770F3E0913A02F0913B020995D3 +:10F250008091C00087FFE9CF8091C6001F910F9178 +:10F26000FF90EF9008950E94D9F8982F809138026E +:10F27000813049F0823091F091366CF490330CF08B +:10F280009053892F08958091C00085FFFCCF909303 +:10F29000C60091369CF39755892F08958091C80038 +:10F2A00085FFFCCF9093CE00E7CF1F930E9433F9E8 +:10F2B000182F0E9433F91295107F810F1F91089526 +:10F2C000982F20913802992339F0213031F02230E3 +:10F2D00061F091509923C9F708958091C00087FF8C +:10F2E000FCCF8091C6009150F5CF8091C80087FF78 +:10F2F000FCCF8091CE009150EDCF1F93182F0E942C +:10F30000D9F8803249F0809139028F5F80933902B9 +:10F31000853091F11F910895809138028130B9F0C4 +:10F320008230C1F78091C80085FFFCCF84E18093D3 +:10F33000CE008091C80085FFFCCF1093CE00809155 +:10F34000C80085FFFCCF80E18093CE00E3CF8091A1 +:10F35000C00085FFFCCF84E18093C6008091C0008F +:10F3600085FFFCCF1093C6008091C00085FFFCCFC5 +:10F3700080E18093C600CECFE0913A02F0913B024B +:10F3800009951F9108950E94D9F8803241F080912B +:10F3900039028F5F80933902853029F10895809179 +:10F3A0003802813089F08230C9F78091C80085FF2A +:10F3B000FCCF84E18093CE008091C80085FFFCCF14 +:10F3C00080E18093CE0008958091C00085FFFCCF3E +:10F3D00084E18093C6008091C00085FFFCCF80E16E +:10F3E0008093C6000895E0913A02F0913B0209959E +:10F3F000089540E951E08823A1F02F9A28EE33E0E8 +:10F40000FA013197F1F721503040D1F72F9828EECB +:10F4100033E0FA013197F1F721503040D1F78150B4 +:10F4200061F708952F923F924F925F926F927F9271 +:10F430008F929F92AF92BF92CF92DF92EF92FF9204 +:10F440000F931F93CF93DF93000081E080933802E6 +:10F4500080E18093C4001092C5001092C00086E045 +:10F460008093C20088E18093C1006898709A279ABF +:10F4700081E00E94F9F9E4E1EE2E7EE1D72E67E902 +:10F48000C62E53E0B52E40E1A42E9924939431E486 +:10F49000832E26E5722E92E5692E80E2582E09E42D +:10F4A000402E13E5312EB0E52B2E0E94D9F8803383 +:10F4B000C9F1813309F452C0803409F4C8C08134E1 +:10F4C00009F4EAC0823489F1853409F4CAC0803570 +:10F4D00049F1823539F1813529F1853509F4ECC0DE +:10F4E000863509F409C1843609F428C1843709F442 +:10F4F000ABC1853709F473C2863709F4D9C08132AC +:10F5000009F4B7C2809139028F5F80933902853048 +:10F5100061F6E0913A02F0913B0209950E94D9F818 +:10F52000803339F60E94C3F9C0CF2091380293E1AD +:10F5300005C0223061F09923A9F391502130C9F719 +:10F540008091C00087FFFCCF8091C600F4CF8091EE +:10F55000C80087FFFCCF8091CE00EDCF0E94D9F884 +:10F56000803281F6809138028130D1F1823009F009 +:10F570009CCF8091C80085FFFCCFE092CE008091A7 +:10F58000C80085FFFCCF8092CE008091C80085FF27 +:10F59000FCCF7092CE008091C80085FFFCCF6092B6 +:10F5A000CE008091C80085FFFCCF5092CE008091A4 +:10F5B000C80085FFFCCF4092CE008091C80085FF37 +:10F5C000FCCF3092CE008091C80085FFFCCF209206 +:10F5D000CE008091C80085FFFCCFA092CE0065CF01 +:10F5E0008091C00085FFFCCFE092C6008091C000F2 +:10F5F00085FFFCCF8092C6008091C00085FFFCCFC4 +:10F600007092C6008091C00085FFFCCF6092C6005A +:10F610008091C00085FFFCCF5092C6008091C00051 +:10F6200085FFFCCF4092C6008091C00085FFFCCFD3 +:10F630003092C6008091C00085FFFCCF2092C600AA +:10F640008091C00085FFFCCFA092C6002ECF0E9403 +:10F65000D9F8863808F466CF0E94D9F80E94C3F919 +:10F6600024CF2091380294E0213041F0223069F01B +:10F67000992309F457CF91502130C1F78091C000F0 +:10F6800087FFFCCF8091C600F3CF8091C80087FF31 +:10F69000FCCF8091CE00ECCF0E94D9F8803841F1A8 +:10F6A000813809F447C0823809F4CAC08839E1F0CA +:10F6B00080E00E947DF9F9CE0E94D9F880933C0247 +:10F6C0000E94D9F880933D020E94C3F9EECE0E94B9 +:10F6D000D9F80E94D9F8182F0E94D9F8112309F4FB +:10F6E0007EC2113009F40AC283E00E947DF9DDCEAA +:10F6F00082E00E947DF9D9CE0E94D9F8803339F397 +:10F700002091380292E0213039F0223061F09923C3 +:10F7100079F291502130C9F78091C00087FFFCCF6A +:10F720008091C600F4CF8091C80087FFFCCF809104 +:10F73000CE00EDCF81E00E947DF9B7CE0E94D9F8CE +:10F7400080933F030E94D9F880933E038091420347 +:10F750008E7F809342030E94D9F8853409F4B3C1A7 +:10F7600080913E0390913F03892B89F000E010E0E7 +:10F770000E94D9F8F801E25CFD4F80830F5F1F4FB4 +:10F7800080913E0390913F030817190788F30E9468 +:10F79000D9F8803209F0B6CE8091420380FFB2C121 +:10F7A00040913C0250913D02440F551F50933D0241 +:10F7B00040933C0260913E0370913F0361157105D7 +:10F7C000F1F080E090E09A01280F391FFC01E25C23 +:10F7D000FD4FE081F999FECF1FBA32BD21BDE0BDDA +:10F7E0000FB6F894FA9AF99A0FBE01968617970702 +:10F7F00050F3460F571F50933D0240933C028091B7 +:10F800003802813081F0823009F04FCE8091C800FB +:10F8100085FFFCCFE092CE008091C80085FFFCCF31 +:10F82000A092CE0042CE8091C00085FFFCCFE09236 +:10F83000C6008091C00085FFFCCFA092C60035CEE7 +:10F8400080E10E947DF931CE0E94D9F880933F0378 +:10F850000E94D9F880933E0320913C0230913D02F2 +:10F8600037FD46C1809142038D7F80934203220F72 +:10F87000331F30933D0220933C020E94D9F8853417 +:10F8800009F430C1809142038E7F809342030E942D +:10F89000D9F8803209F009CE60913802613009F45C +:10F8A0006FC0623009F473C000913E0310913F03B2 +:10F8B0000115110509F440C080914203782F717041 +:10F8C000F82EF69481E0F82240913C0250913D02DE +:10F8D00020E030E013C0FF2009F060C0FA019491ED +:10F8E000613009F43BC0623009F441C0CA0101969D +:10F8F0002F5F3F4FAC0120173107D0F4772359F326 +:10F90000F999FECF52BD41BDF89A90B56130F9F03A +:10F91000623061F78091C80085FFFCCF9093CE00E4 +:10F92000CA0101962F5F3F4FAC012017310730F31A +:10F9300090933D0280933C02613009F4CAC062306A +:10F9400009F0B3CD8091C80085FFFCCF46CE8091F1 +:10F95000C00085FFFCCF9093C600C8CF8091C00047 +:10F9600085FDF9CF8091C00085FFF8CFF4CF80915D +:10F97000C80085FDD3CF8091C80085FFF8CFCECFDA +:10F980008091C00085FFFCCFE092C6008DCF8091B2 +:10F99000C80085FFFCCFE092CE0086CFCA01A0E070 +:10F9A000B0E080509040AF4FBF4FABBFFC0197918C +:10F9B000613061F0623009F099CF8091C80085FD17 +:10F9C000ADCF8091C80085FFF8CFA8CF8091C0004F +:10F9D00085FDC1CF8091C00085FFF8CFBCCF0E94CC +:10F9E000D9F8803209F08ECD80913802813011F142 +:10F9F000823009F05ACD8091C80085FFFCCFE0929B +:10FA0000CE008091C80085FFFCCFD092CE008091BF +:10FA1000C80085FFFCCFC092CE008091C80085FF52 +:10FA2000FCCFB092CE008091C80085FFFCCFA092A1 +:10FA3000CE003BCD8091C00085FFFCCFE092C60098 +:10FA40008091C00085FFFCCFD092C6008091C0009D +:10FA500085FFFCCFC092C6008091C00085FFFCCF1F +:10FA6000B092C6008091C00085FFFCCFA092C60076 +:10FA70001CCD0E94D9F8813209F017CD0E94D9F827 +:10FA8000813209F012CD279A2F98109240032091CD +:10FA90003802E1E491E00EC0223009F4A4C0909352 +:10FAA0004003E92FF0E0E050FE4FE0819F5FEE233E +:10FAB00009F4A0C0213081F78091C00085FFFCCF00 +:10FAC000E093C600ECCF80914203816080934203B3 +:10FAD00047CE8091C00085FDB7CD8091C00085FFE5 +:10FAE000F8CFB2CD80914203816080934203CFCEA4 +:10FAF00080914203826080934203B9CE87E90E94DD +:10FB00007DF9D3CC80913D028823880F880B892111 +:10FB1000809341038BBF80913C0290913D02880FFE +:10FB2000991F90933D0280933C0280913E0380FF99 +:10FB300009C080913E0390913F03019690933F034B +:10FB400080933E03F894F999FECF1127E0913C028F +:10FB5000F0913D02CEE3D2E080913E0390913F03CD +:10FB6000103091F40091570001700130D9F303E097 +:10FB700000935700E8950091570001700130D9F3C8 +:10FB800001E100935700E895099019900091570002 +:10FB900001700130D9F301E000935700E895139507 +:10FBA000103898F011270091570001700130D9F3F7 +:10FBB00005E000935700E89500915700017001306F +:10FBC000D9F301E100935700E8953296029709F0C6 +:10FBD000C7CF103011F00296E5CF112410CE8EE180 +:10FBE0000E947DF962CC8091C80085FFFCCFE09334 +:10FBF000CE0055CF7AE0B72E6DE0A62E5AE3952EB3 +:10FC000040E2842E3DE3732E90E3692E81E3582E6B +:10FC1000213009F442C0223009F45FC00E94D9F8B3 +:10FC2000982F20913802213089F1223009F44EC0FA +:10FC3000943709F46BC0923709F405C1973709F47A +:10FC40007BC0953799F0923609F4BDC09A3601F71A +:10FC5000E0913A02F0913B02099520913802D8CF09 +:10FC60008091C00085FFFCCF9093C6000E94D9F818 +:10FC7000982F80913802813099F38230B9F78091C2 +:10FC8000C80085FFFCCF9093CE00F0CF8091C000DC +:10FC900085FFFCCF9093C600CBCF8091C00085FF3D +:10FCA000FCCFB092C6008091C00085FFFCCFA0922F +:10FCB000C6008091C00085FFFCCF9092C600809165 +:10FCC000C00085FFFCCF8092C600A8CF8091C800FD +:10FCD00085FFFCCF9093CE00ABCF8091C80085FF0D +:10FCE000FCCFB092CE008091C80085FFFCCFA092DF +:10FCF000CE008091C80085FFFCCF9092CE0080910D +:10FD0000C80085FFFCCF8092CE0088CF1F9947C0E6 +:10FD10002F9A213051F0223009F07ACF8091C8001B +:10FD200085FFFCCF6092CE0073CF8091C00085FF2D +:10FD3000FCCF6092C6006CCF0E94D9F8982F8091BA +:10FD400038028130F1F0823009F4ABC00E9455F9DD +:10FD5000082F0E9455F9182F0E94D9F8982F8091EA +:10FD600038028130A9F0823009F4A2C00E9455F90E +:10FD7000D02ECC24F601E10FF11D808320913802B2 +:10FD800047CF8091C00085FFFCCF9093C600DECFA7 +:10FD90008091C00085FFFCCF9093C600E7CF2F98DD +:10FDA000213051F0223009F033CF8091C80085FF17 +:10FDB000FCCF5092CE002CCF8091C00085FFFCCFAD +:10FDC0005092C60025CF213041F1223081F080E8E9 +:10FDD00085BF109274001092750080E091E1FC01E3 +:10FDE000819180E091E13097D1F3CF01F8CF8091FC +:10FDF000C80085FFFCCF82E68093CE008091C800CA +:10FE000085FFFCCF85E78093CE008091C80085FFF9 +:10FE1000FCCF83E78093CE00DACF8091C00085FFCE +:10FE2000FCCF82E68093C6008091C00085FFFCCFA6 +:10FE300085E78093C6008091C00085FFFCCF83E7F3 +:10FE40008093C600C4CF0E94D9F8982F80913802C1 +:10FE50008130C9F08230D1F10E9455F9182F0E94EB +:10FE600055F9982F809138028130A1F0823039F114 +:10FE7000F12EEE24F701E90FF11D80810E9494F824 +:10FE800020913802C5CE8091C00085FFFCCF9093B1 +:10FE9000C600E2CF8091C00085FFFCCF7092C60003 +:10FEA000E7CF8091C80085FFFCCF9093CE004ECF66 +:10FEB0008091C80085FFFCCF9093CE0057CF8091F2 +:10FEC000C80085FFFCCF7092CE00D2CF8091C800D1 +:0EFED00085FFFCCF9093CE00BFCFF894FFCFFC +:10FEDE0041546D656761424F4F54202F204172642B +:10FEEE0075696E6F204D656761202D20284329208E +:10FEFE0041726475696E6F204C4C43202D20303951 +:08FF0E00303933300A0D008088 +:040000031000F000F9 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex index 43a8b30e010..5a5eb8228cc 100644 --- a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex +++ b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex @@ -1,125 +1,125 @@ -:107800000C94343C0C94513C0C94513C0C94513CE1 -:107810000C94513C0C94513C0C94513C0C94513CB4 -:107820000C94513C0C94513C0C94513C0C94513CA4 -:107830000C94513C0C94513C0C94513C0C94513C94 -:107840000C94513C0C94513C0C94513C0C94513C84 -:107850000C94513C0C94513C0C94513C0C94513C74 -:107860000C94513C0C94513C11241FBECFEFD8E036 -:10787000DEBFCDBF11E0A0E0B1E0ECE9FFE702C060 -:1078800005900D92A230B107D9F712E0A2E0B1E065 -:1078900001C01D92AD30B107E1F70E942D3D0C945F -:1078A000CC3F0C94003C982F959595959595959582 -:1078B000905D8F708A307CF0282F295A8091C0000B -:1078C00085FFFCCF9093C6008091C00085FFFCCF60 -:1078D0002093C6000895282F205DF0CF982F809127 -:1078E000C00085FFFCCF9093C6000895EF92FF92F1 -:1078F0000F931F93EE24FF2487018091C00087FD22 -:1079000017C00894E11CF11C011D111D81E4E8164B -:1079100082E4F8068FE0080780E0180770F3E09132 -:107920000401F091050109958091C00087FFE9CF1E -:107930008091C6001F910F91FF90EF9008950E94D3 -:10794000763C982F8091C00085FFFCCF9093C600B5 -:1079500091362CF490330CF09053892F089597555D -:10796000892F08951F930E949F3C182F0E949F3CCF -:107970001295107F810F1F9108951F93182F882350 -:1079800021F00E94763C1150E1F71F9108951F935A -:10799000182F0E94763C803249F0809103018F5F5E -:1079A000809303018530C1F01F9108958091C0003C -:1079B00085FFFCCF84E18093C6008091C00085FFE5 -:1079C000FCCF1093C6008091C00085FFFCCF80E102 -:1079D0008093C6001F910895E0910401F091050184 -:1079E00009951F9108950E94763C803241F0809164 -:1079F00003018F5F80930301853081F008958091AA -:107A0000C00085FFFCCF84E18093C6008091C00058 -:107A100085FFFCCF80E18093C6000895E0910401CA -:107A2000F09105010995089540E951E08823A1F0FE -:107A30002D9A28EE33E0FA013197F1F721503040CA -:107A4000D1F72D9828EE33E0FA013197F1F7215064 -:107A50003040D1F7815061F708953F924F925F9285 -:107A60006F927F928F929F92AF92BF92CF92DF924E -:107A7000EF92FF920F931F93CF93DF93000080E16B -:107A80008093C4001092C50088E18093C10086E015 -:107A90008093C2005098589A259A81E00E94143D24 -:107AA00024E1F22E9EE1E92E85E9D82E0FE0C02ECA -:107AB00010E1B12EAA24A394B1E49B2EA6E58A2E50 -:107AC000F2E57F2EE0E26E2E79E4572E63E5462E36 -:107AD00050E5352E0E94763C8033B1F18133B9F107 -:107AE000803409F46FC0813409F476C0823409F41B -:107AF00085C0853409F488C0803531F1823521F1A3 -:107B0000813511F1853509F485C0863509F48DC0BC -:107B1000843609F496C0843709F403C1853709F423 -:107B200072C1863709F466C0809103018F5F80932C -:107B30000301853079F6E0910401F0910501099582 -:107B40000E94763C803351F60E94F33CC3CF0E94E2 -:107B5000763C803249F78091C00085FFFCCFF092DF -:107B6000C6008091C00085FFFCCF9092C600809136 -:107B7000C00085FFFCCF8092C6008091C00085FFC9 -:107B8000FCCF7092C6008091C00085FFFCCF609250 -:107B9000C6008091C00085FFFCCF5092C600809146 -:107BA000C00085FFFCCF4092C6008091C00085FFD9 -:107BB000FCCF3092C6008091C00085FFFCCFB09210 -:107BC000C60088CF0E94763C863808F4BDCF0E945C -:107BD000763C0E94F33C7ECF0E94763C803809F4CC -:107BE0009CC0813809F40BC1823809F43CC1883942 -:107BF00009F48FC080E00E94C73C6CCF84E10E94F2 -:107C0000BD3C0E94F33C66CF85E00E94BD3C0E94D3 -:107C1000F33C60CF0E94763C809306010E94763C44 -:107C2000809307010E94F33C55CF0E94763C80333D -:107C300009F41DC183E00E94BD3C80E00E94C73C66 -:107C400049CF0E94763C809309020E94763C809343 -:107C5000080280910C028E7F80930C020E94763C79 -:107C6000853409F415C18091080290910902892B8D -:107C700089F000E010E00E94763CF801E85FFE4FDA -:107C800080830F5F1F4F80910802909109020817AF -:107C9000190788F30E94763C803209F045CF809125 -:107CA0000C0280FF01C16091060170910701660F0F -:107CB000771F7093070160930601A0910802B091AD -:107CC00009021097C9F0E8E0F1E09B01AD014E0F09 -:107CD0005F1FF999FECF32BD21BD819180BDFA9A17 -:107CE000F99A2F5F3F4FE417F50799F76A0F7B1F4B -:107CF00070930701609306018091C00085FFFCCF5F -:107D0000F092C6008091C00085FFFCCFB092C60003 -:107D1000E1CE83E00E94C73CDDCE82E00E94C73CFA -:107D2000D9CE0E94763C809309020E94763C8093D3 -:107D300008028091060190910701880F991F909386 -:107D40000701809306010E94763C853409F4A6C0A1 -:107D500080910C028E7F80930C020E94763C8032D0 -:107D600009F0B8CE8091C00085FFFCCFF092C6002C -:107D7000609108027091090261157105B9F140E046 -:107D800050E080910C02A82FA170B82FB27011C0E2 -:107D9000BB2309F45CC0E0910601F0910701319624 -:107DA000F0930701E09306014F5F5F4F46175707B7 -:107DB000E8F4AA2369F3F999FECF209106013091E6 -:107DC000070132BD21BDF89A90B58091C00085FFB2 -:107DD000FCCF9093C6002F5F3F4F30930701209355 -:107DE00006014F5F5F4F4617570718F38091C00099 -:107DF00085FDE5CE8091C00085FFF8CFE0CE81E023 -:107E00000E94C73C67CE0E94763C803209F08CCE3F -:107E10008091C00085FFFCCFF092C6008091C00029 -:107E200085FFFCCFE092C6008091C00085FFFCCFAB -:107E3000D092C6008091C00085FFFCCFC092C600E2 -:107E40008091C00085FFFCCFB092C60043CEE09188 -:107E50000601F091070194918091C00085FFFCCF4D -:107E60009093C6009CCF80E10E94C73C33CE0E9415 -:107E7000763C0E94763C182F0E94763C112309F430 -:107E800083C0113009F484C08FE00E94C73C22CE29 -:107E900080910C02816080930C02E5CE80910C02EF -:107EA000816080930C0259CF809107018823880F4D -:107EB000880B8A2180930B02809106019091070123 -:107EC000880F991F90930701809306018091080203 -:107ED00080FF09C080910802909109020196909359 -:107EE000090280930802F894F999FECF1127E091D6 -:107EF0000601F0910701C8E0D1E08091080290915D -:107F00000902103091F40091570001700130D9F34B -:107F100003E000935700E89500915700017001308D -:107F2000D9F301E100935700E89509901990009169 -:107F3000570001700130D9F301E000935700E89534 -:107F40001395103498F011270091570001700130FB -:107F5000D9F305E000935700E895009157000170B0 -:107F60000130D9F301E100935700E895329602976A -:107F700009F0C7CF103011F00296E5CF112480919F -:107F8000C00085FFB9CEBCCE8EE10E94C73CA2CD19 -:0C7F900085E90E94C73C9ECDF894FFCF0D -:027F9C00800063 -:040000030000780081 -:00000001FF +:107800000C94343C0C94513C0C94513C0C94513CE1 +:107810000C94513C0C94513C0C94513C0C94513CB4 +:107820000C94513C0C94513C0C94513C0C94513CA4 +:107830000C94513C0C94513C0C94513C0C94513C94 +:107840000C94513C0C94513C0C94513C0C94513C84 +:107850000C94513C0C94513C0C94513C0C94513C74 +:107860000C94513C0C94513C11241FBECFEFD8E036 +:10787000DEBFCDBF11E0A0E0B1E0ECE9FFE702C060 +:1078800005900D92A230B107D9F712E0A2E0B1E065 +:1078900001C01D92AD30B107E1F70E942D3D0C945F +:1078A000CC3F0C94003C982F959595959595959582 +:1078B000905D8F708A307CF0282F295A8091C0000B +:1078C00085FFFCCF9093C6008091C00085FFFCCF60 +:1078D0002093C6000895282F205DF0CF982F809127 +:1078E000C00085FFFCCF9093C6000895EF92FF92F1 +:1078F0000F931F93EE24FF2487018091C00087FD22 +:1079000017C00894E11CF11C011D111D81E4E8164B +:1079100082E4F8068FE0080780E0180770F3E09132 +:107920000401F091050109958091C00087FFE9CF1E +:107930008091C6001F910F91FF90EF9008950E94D3 +:10794000763C982F8091C00085FFFCCF9093C600B5 +:1079500091362CF490330CF09053892F089597555D +:10796000892F08951F930E949F3C182F0E949F3CCF +:107970001295107F810F1F9108951F93182F882350 +:1079800021F00E94763C1150E1F71F9108951F935A +:10799000182F0E94763C803249F0809103018F5F5E +:1079A000809303018530C1F01F9108958091C0003C +:1079B00085FFFCCF84E18093C6008091C00085FFE5 +:1079C000FCCF1093C6008091C00085FFFCCF80E102 +:1079D0008093C6001F910895E0910401F091050184 +:1079E00009951F9108950E94763C803241F0809164 +:1079F00003018F5F80930301853081F008958091AA +:107A0000C00085FFFCCF84E18093C6008091C00058 +:107A100085FFFCCF80E18093C6000895E0910401CA +:107A2000F09105010995089540E951E08823A1F0FE +:107A30002D9A28EE33E0FA013197F1F721503040CA +:107A4000D1F72D9828EE33E0FA013197F1F7215064 +:107A50003040D1F7815061F708953F924F925F9285 +:107A60006F927F928F929F92AF92BF92CF92DF924E +:107A7000EF92FF920F931F93CF93DF93000080E16B +:107A80008093C4001092C50088E18093C10086E015 +:107A90008093C2005098589A259A81E00E94143D24 +:107AA00024E1F22E9EE1E92E85E9D82E0FE0C02ECA +:107AB00010E1B12EAA24A394B1E49B2EA6E58A2E50 +:107AC000F2E57F2EE0E26E2E79E4572E63E5462E36 +:107AD00050E5352E0E94763C8033B1F18133B9F107 +:107AE000803409F46FC0813409F476C0823409F41B +:107AF00085C0853409F488C0803531F1823521F1A3 +:107B0000813511F1853509F485C0863509F48DC0BC +:107B1000843609F496C0843709F403C1853709F423 +:107B200072C1863709F466C0809103018F5F80932C +:107B30000301853079F6E0910401F0910501099582 +:107B40000E94763C803351F60E94F33CC3CF0E94E2 +:107B5000763C803249F78091C00085FFFCCFF092DF +:107B6000C6008091C00085FFFCCF9092C600809136 +:107B7000C00085FFFCCF8092C6008091C00085FFC9 +:107B8000FCCF7092C6008091C00085FFFCCF609250 +:107B9000C6008091C00085FFFCCF5092C600809146 +:107BA000C00085FFFCCF4092C6008091C00085FFD9 +:107BB000FCCF3092C6008091C00085FFFCCFB09210 +:107BC000C60088CF0E94763C863808F4BDCF0E945C +:107BD000763C0E94F33C7ECF0E94763C803809F4CC +:107BE0009CC0813809F40BC1823809F43CC1883942 +:107BF00009F48FC080E00E94C73C6CCF84E10E94F2 +:107C0000BD3C0E94F33C66CF85E00E94BD3C0E94D3 +:107C1000F33C60CF0E94763C809306010E94763C44 +:107C2000809307010E94F33C55CF0E94763C80333D +:107C300009F41DC183E00E94BD3C80E00E94C73C66 +:107C400049CF0E94763C809309020E94763C809343 +:107C5000080280910C028E7F80930C020E94763C79 +:107C6000853409F415C18091080290910902892B8D +:107C700089F000E010E00E94763CF801E85FFE4FDA +:107C800080830F5F1F4F80910802909109020817AF +:107C9000190788F30E94763C803209F045CF809125 +:107CA0000C0280FF01C16091060170910701660F0F +:107CB000771F7093070160930601A0910802B091AD +:107CC00009021097C9F0E8E0F1E09B01AD014E0F09 +:107CD0005F1FF999FECF32BD21BD819180BDFA9A17 +:107CE000F99A2F5F3F4FE417F50799F76A0F7B1F4B +:107CF00070930701609306018091C00085FFFCCF5F +:107D0000F092C6008091C00085FFFCCFB092C60003 +:107D1000E1CE83E00E94C73CDDCE82E00E94C73CFA +:107D2000D9CE0E94763C809309020E94763C8093D3 +:107D300008028091060190910701880F991F909386 +:107D40000701809306010E94763C853409F4A6C0A1 +:107D500080910C028E7F80930C020E94763C8032D0 +:107D600009F0B8CE8091C00085FFFCCFF092C6002C +:107D7000609108027091090261157105B9F140E046 +:107D800050E080910C02A82FA170B82FB27011C0E2 +:107D9000BB2309F45CC0E0910601F0910701319624 +:107DA000F0930701E09306014F5F5F4F46175707B7 +:107DB000E8F4AA2369F3F999FECF209106013091E6 +:107DC000070132BD21BDF89A90B58091C00085FFB2 +:107DD000FCCF9093C6002F5F3F4F30930701209355 +:107DE00006014F5F5F4F4617570718F38091C00099 +:107DF00085FDE5CE8091C00085FFF8CFE0CE81E023 +:107E00000E94C73C67CE0E94763C803209F08CCE3F +:107E10008091C00085FFFCCFF092C6008091C00029 +:107E200085FFFCCFE092C6008091C00085FFFCCFAB +:107E3000D092C6008091C00085FFFCCFC092C600E2 +:107E40008091C00085FFFCCFB092C60043CEE09188 +:107E50000601F091070194918091C00085FFFCCF4D +:107E60009093C6009CCF80E10E94C73C33CE0E9415 +:107E7000763C0E94763C182F0E94763C112309F430 +:107E800083C0113009F484C08FE00E94C73C22CE29 +:107E900080910C02816080930C02E5CE80910C02EF +:107EA000816080930C0259CF809107018823880F4D +:107EB000880B8A2180930B02809106019091070123 +:107EC000880F991F90930701809306018091080203 +:107ED00080FF09C080910802909109020196909359 +:107EE000090280930802F894F999FECF1127E091D6 +:107EF0000601F0910701C8E0D1E08091080290915D +:107F00000902103091F40091570001700130D9F34B +:107F100003E000935700E89500915700017001308D +:107F2000D9F301E100935700E89509901990009169 +:107F3000570001700130D9F301E000935700E89534 +:107F40001395103498F011270091570001700130FB +:107F5000D9F305E000935700E895009157000170B0 +:107F60000130D9F301E100935700E895329602976A +:107F700009F0C7CF103011F00296E5CF112480919F +:107F8000C00085FFB9CEBCCE8EE10E94C73CA2CD19 +:0C7F900085E90E94C73C9ECDF894FFCF0D +:027F9C00800063 +:040000030000780081 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex index 9753e2e83f3..84134c248c6 100644 --- a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex +++ b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex @@ -1,124 +1,124 @@ -:107800000C94343C0C94513C0C94513C0C94513CE1 -:107810000C94513C0C94513C0C94513C0C94513CB4 -:107820000C94513C0C94513C0C94513C0C94513CA4 -:107830000C94513C0C94513C0C94513C0C94513C94 -:107840000C94513C0C94513C0C94513C0C94513C84 -:107850000C94513C0C94513C0C94513C0C94513C74 -:107860000C94513C0C94513C11241FBECFEFD8E036 -:10787000DEBFCDBF11E0A0E0B1E0EAE8FFE702C063 -:1078800005900D92A230B107D9F712E0A2E0B1E065 -:1078900001C01D92AD30B107E1F70E942D3D0C945F -:1078A000C33F0C94003C982F95959595959595958B -:1078B000905D8F708A307CF0282F295A8091C0000B -:1078C00085FFFCCF9093C6008091C00085FFFCCF60 -:1078D0002093C6000895282F205DF0CF982F809127 -:1078E000C00085FFFCCF9093C6000895EF92FF92F1 -:1078F0000F931F93EE24FF2487018091C00087FD22 -:1079000017C00894E11CF11C011D111D81E2E8164D -:1079100081EAF80687E0080780E0180770F3E09135 -:107920000401F091050109958091C00087FFE9CF1E -:107930008091C6001F910F91FF90EF9008950E94D3 -:10794000763C982F8091C00085FFFCCF9093C600B5 -:1079500091362CF490330CF09053892F089597555D -:10796000892F08951F930E949F3C182F0E949F3CCF -:107970001295107F810F1F9108951F93182F882350 -:1079800021F00E94763C1150E1F71F9108951F935A -:10799000182F0E94763C803249F0809103018F5F5E -:1079A000809303018530C1F01F9108958091C0003C -:1079B00085FFFCCF84E18093C6008091C00085FFE5 -:1079C000FCCF1093C6008091C00085FFFCCF80E102 -:1079D0008093C6001F910895E0910401F091050184 -:1079E00009951F9108950E94763C803241F0809164 -:1079F00003018F5F80930301853081F008958091AA -:107A0000C00085FFFCCF84E18093C6008091C00058 -:107A100085FFFCCF80E18093C6000895E0910401CA -:107A2000F09105010995089548EC50E08823A1F0F4 -:107A30002D9A28EE33E0FA013197F1F721503040CA -:107A4000D1F72D9828EE33E0FA013197F1F7215064 -:107A50003040D1F7815061F708953F924F925F9285 -:107A60006F927F928F929F92AF92BF92CF92DF924E -:107A7000EF92FF920F931F93CF93DF93000082E06A -:107A80008093C00080E18093C4001092C50088E11B -:107A90008093C10086E08093C2005098589A259A3E -:107AA00081E00E94143D24E1F22E9EE1E92E85E959 -:107AB000D82E0FE0C02E10E1B12EAA24A394B1E479 -:107AC0009B2EA6E58A2EF2E57F2EE0E26E2E79E46B -:107AD000572E63E5462E50E5352E0E94763C8033C6 -:107AE000B1F18133B9F1803409F46FC0813409F404 -:107AF00076C0823409F485C0853409F488C08035A5 -:107B000031F1823521F1813511F1853509F485C0D6 -:107B1000863509F48DC0843609F496C0843709F49B -:107B200003C1853709F472C1863709F466C08091B4 -:107B300003018F5F80930301853079F6E0910401A2 -:107B4000F091050109950E94763C803351F60E9420 -:107B5000F33CC3CF0E94763C803249F78091C0004D -:107B600085FFFCCFF092C6008091C00085FFFCCF5E -:107B70009092C6008091C00085FFFCCF8092C60025 -:107B80008091C00085FFFCCF7092C6008091C0003C -:107B900085FFFCCF6092C6008091C00085FFFCCFBE -:107BA0005092C6008091C00085FFFCCF4092C60075 -:107BB0008091C00085FFFCCF3092C6008091C0004C -:107BC00085FFFCCFB092C60088CF0E94763C8638F5 -:107BD00008F4BDCF0E94763C0E94F33C7ECF0E9409 -:107BE000763C803809F49CC0813809F40BC1823896 -:107BF00009F430C1883909F48FC080E00E94C73C85 -:107C00006CCF84E10E94BD3C0E94F33C66CF85E0CE -:107C10000E94BD3C0E94F33C60CF0E94763C809362 -:107C200006010E94763C809307010E94F33C55CFE9 -:107C30000E94763C803309F411C183E00E94BD3C70 -:107C400080E00E94C73C49CF0E94763C80930902A5 -:107C50000E94763C8093080280910C028E7F809374 -:107C60000C020E94763C853409F409C18091080217 -:107C700090910902892B89F000E010E00E94763C87 -:107C8000F801E85FFE4F80830F5F1F4F809108026D -:107C9000909109020817190788F30E94763C8032F8 -:107CA00009F045CF80910C0280FFF5C0609106017C -:107CB00070910701660F771F7093070160930601AB -:107CC000A0910802B09109021097C9F0E8E0F1E034 -:107CD0009B01AD014E0F5F1FF999FECF32BD21BD53 -:107CE000819180BDFA9AF99A2F5F3F4FE417F5070B -:107CF00099F76A0F7B1F70930701609306018091CB -:107D0000C00085FFFCCFF092C6008091C00085FFC7 -:107D1000FCCFB092C600E1CE83E00E94C73CDDCE2E -:107D200082E00E94C73CD9CE0E94763C8093090233 -:107D30000E94763C80930802809106019091070191 -:107D4000880F991F90930701809306010E94763C4B -:107D5000853409F49AC080910C028E7F80930C02C6 -:107D60000E94763C803209F0B8CE8091C00085FF39 -:107D7000FCCFF092C600A0910802B09109021097C2 -:107D8000C1F180910C02082F0170182F1695117007 -:107D9000E0910601F0910701AF014F5F5F4FBA011B -:107DA00020E030E00023B1F4112339F49491809164 -:107DB000C00085FFFCCF9093C6002F5F3F4FCB01E3 -:107DC0000196FA012A173B0780F4BC014F5F5F4F11 -:107DD000002351F3F999FECFF2BDE1BDF89A90B5B9 -:107DE0008091C00085FFFCCFE6CF709307016093C0 -:107DF00006018091C00085FDE5CE8091C00085FF21 -:107E0000F8CFE0CE81E00E94C73C67CE0E94763C6E -:107E1000803209F08CCE8091C00085FFFCCFF092BB -:107E2000C6008091C00085FFFCCFE092C600809123 -:107E3000C00085FFFCCFD092C6008091C00085FFB6 -:107E4000FCCFC092C6008091C00085FFFCCFB092ED -:107E5000C60043CE80E10E94C73C3FCE0E94763CE4 -:107E60000E94763C182F0E94763C112309F483C0AF -:107E7000113009F484C08FE00E94C73C2ECE80915F -:107E80000C02816080930C02F1CE80910C02816023 -:107E900080930C0265CF809107018823880F880B9F -:107EA0008A2180930B028091060190910701880F2F -:107EB000991F90930701809306018091080280FF2B -:107EC00009C08091080290910902019690930902DD -:107ED00080930802F894F999FECF1127E0910601EA -:107EE000F0910701C8E0D1E0809108029091090269 -:107EF000103091F40091570001700130D9F303E084 -:107F000000935700E8950091570001700130D9F3B4 -:107F100001E100935700E8950990199000915700EE -:107F200001700130D9F301E000935700E8951395F3 -:107F3000103498F011270091570001700130D9F3E7 -:107F400005E000935700E89500915700017001305B -:107F5000D9F301E100935700E8953296029709F0B2 -:107F6000C7CF103011F00296E5CF11248091C000E8 -:107F700085FFC5CEC8CE8EE10E94C73CAECD85E957 -:0A7F80000E94C73CAACDF894FFCF81 -:027F8A00800075 -:040000030000780081 -:00000001FF +:107800000C94343C0C94513C0C94513C0C94513CE1 +:107810000C94513C0C94513C0C94513C0C94513CB4 +:107820000C94513C0C94513C0C94513C0C94513CA4 +:107830000C94513C0C94513C0C94513C0C94513C94 +:107840000C94513C0C94513C0C94513C0C94513C84 +:107850000C94513C0C94513C0C94513C0C94513C74 +:107860000C94513C0C94513C11241FBECFEFD8E036 +:10787000DEBFCDBF11E0A0E0B1E0EAE8FFE702C063 +:1078800005900D92A230B107D9F712E0A2E0B1E065 +:1078900001C01D92AD30B107E1F70E942D3D0C945F +:1078A000C33F0C94003C982F95959595959595958B +:1078B000905D8F708A307CF0282F295A8091C0000B +:1078C00085FFFCCF9093C6008091C00085FFFCCF60 +:1078D0002093C6000895282F205DF0CF982F809127 +:1078E000C00085FFFCCF9093C6000895EF92FF92F1 +:1078F0000F931F93EE24FF2487018091C00087FD22 +:1079000017C00894E11CF11C011D111D81E2E8164D +:1079100081EAF80687E0080780E0180770F3E09135 +:107920000401F091050109958091C00087FFE9CF1E +:107930008091C6001F910F91FF90EF9008950E94D3 +:10794000763C982F8091C00085FFFCCF9093C600B5 +:1079500091362CF490330CF09053892F089597555D +:10796000892F08951F930E949F3C182F0E949F3CCF +:107970001295107F810F1F9108951F93182F882350 +:1079800021F00E94763C1150E1F71F9108951F935A +:10799000182F0E94763C803249F0809103018F5F5E +:1079A000809303018530C1F01F9108958091C0003C +:1079B00085FFFCCF84E18093C6008091C00085FFE5 +:1079C000FCCF1093C6008091C00085FFFCCF80E102 +:1079D0008093C6001F910895E0910401F091050184 +:1079E00009951F9108950E94763C803241F0809164 +:1079F00003018F5F80930301853081F008958091AA +:107A0000C00085FFFCCF84E18093C6008091C00058 +:107A100085FFFCCF80E18093C6000895E0910401CA +:107A2000F09105010995089548EC50E08823A1F0F4 +:107A30002D9A28EE33E0FA013197F1F721503040CA +:107A4000D1F72D9828EE33E0FA013197F1F7215064 +:107A50003040D1F7815061F708953F924F925F9285 +:107A60006F927F928F929F92AF92BF92CF92DF924E +:107A7000EF92FF920F931F93CF93DF93000082E06A +:107A80008093C00080E18093C4001092C50088E11B +:107A90008093C10086E08093C2005098589A259A3E +:107AA00081E00E94143D24E1F22E9EE1E92E85E959 +:107AB000D82E0FE0C02E10E1B12EAA24A394B1E479 +:107AC0009B2EA6E58A2EF2E57F2EE0E26E2E79E46B +:107AD000572E63E5462E50E5352E0E94763C8033C6 +:107AE000B1F18133B9F1803409F46FC0813409F404 +:107AF00076C0823409F485C0853409F488C08035A5 +:107B000031F1823521F1813511F1853509F485C0D6 +:107B1000863509F48DC0843609F496C0843709F49B +:107B200003C1853709F472C1863709F466C08091B4 +:107B300003018F5F80930301853079F6E0910401A2 +:107B4000F091050109950E94763C803351F60E9420 +:107B5000F33CC3CF0E94763C803249F78091C0004D +:107B600085FFFCCFF092C6008091C00085FFFCCF5E +:107B70009092C6008091C00085FFFCCF8092C60025 +:107B80008091C00085FFFCCF7092C6008091C0003C +:107B900085FFFCCF6092C6008091C00085FFFCCFBE +:107BA0005092C6008091C00085FFFCCF4092C60075 +:107BB0008091C00085FFFCCF3092C6008091C0004C +:107BC00085FFFCCFB092C60088CF0E94763C8638F5 +:107BD00008F4BDCF0E94763C0E94F33C7ECF0E9409 +:107BE000763C803809F49CC0813809F40BC1823896 +:107BF00009F430C1883909F48FC080E00E94C73C85 +:107C00006CCF84E10E94BD3C0E94F33C66CF85E0CE +:107C10000E94BD3C0E94F33C60CF0E94763C809362 +:107C200006010E94763C809307010E94F33C55CFE9 +:107C30000E94763C803309F411C183E00E94BD3C70 +:107C400080E00E94C73C49CF0E94763C80930902A5 +:107C50000E94763C8093080280910C028E7F809374 +:107C60000C020E94763C853409F409C18091080217 +:107C700090910902892B89F000E010E00E94763C87 +:107C8000F801E85FFE4F80830F5F1F4F809108026D +:107C9000909109020817190788F30E94763C8032F8 +:107CA00009F045CF80910C0280FFF5C0609106017C +:107CB00070910701660F771F7093070160930601AB +:107CC000A0910802B09109021097C9F0E8E0F1E034 +:107CD0009B01AD014E0F5F1FF999FECF32BD21BD53 +:107CE000819180BDFA9AF99A2F5F3F4FE417F5070B +:107CF00099F76A0F7B1F70930701609306018091CB +:107D0000C00085FFFCCFF092C6008091C00085FFC7 +:107D1000FCCFB092C600E1CE83E00E94C73CDDCE2E +:107D200082E00E94C73CD9CE0E94763C8093090233 +:107D30000E94763C80930802809106019091070191 +:107D4000880F991F90930701809306010E94763C4B +:107D5000853409F49AC080910C028E7F80930C02C6 +:107D60000E94763C803209F0B8CE8091C00085FF39 +:107D7000FCCFF092C600A0910802B09109021097C2 +:107D8000C1F180910C02082F0170182F1695117007 +:107D9000E0910601F0910701AF014F5F5F4FBA011B +:107DA00020E030E00023B1F4112339F49491809164 +:107DB000C00085FFFCCF9093C6002F5F3F4FCB01E3 +:107DC0000196FA012A173B0780F4BC014F5F5F4F11 +:107DD000002351F3F999FECFF2BDE1BDF89A90B5B9 +:107DE0008091C00085FFFCCFE6CF709307016093C0 +:107DF00006018091C00085FDE5CE8091C00085FF21 +:107E0000F8CFE0CE81E00E94C73C67CE0E94763C6E +:107E1000803209F08CCE8091C00085FFFCCFF092BB +:107E2000C6008091C00085FFFCCFE092C600809123 +:107E3000C00085FFFCCFD092C6008091C00085FFB6 +:107E4000FCCFC092C6008091C00085FFFCCFB092ED +:107E5000C60043CE80E10E94C73C3FCE0E94763CE4 +:107E60000E94763C182F0E94763C112309F483C0AF +:107E7000113009F484C08FE00E94C73C2ECE80915F +:107E80000C02816080930C02F1CE80910C02816023 +:107E900080930C0265CF809107018823880F880B9F +:107EA0008A2180930B028091060190910701880F2F +:107EB000991F90930701809306018091080280FF2B +:107EC00009C08091080290910902019690930902DD +:107ED00080930802F894F999FECF1127E0910601EA +:107EE000F0910701C8E0D1E0809108029091090269 +:107EF000103091F40091570001700130D9F303E084 +:107F000000935700E8950091570001700130D9F3B4 +:107F100001E100935700E8950990199000915700EE +:107F200001700130D9F301E000935700E8951395F3 +:107F3000103498F011270091570001700130D9F3E7 +:107F400005E000935700E89500915700017001305B +:107F5000D9F301E100935700E8953296029709F0B2 +:107F6000C7CF103011F00296E5CF11248091C000E8 +:107F700085FFC5CEC8CE8EE10E94C73CAECD85E957 +:0A7F80000E94C73CAACDF894FFCF81 +:027F8A00800075 +:040000030000780081 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex index feac9d259d2..d0185b41262 100644 --- a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex +++ b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex @@ -1,126 +1,126 @@ -:103800000C94341C0C94511C0C94511C0C94511CA1 -:103810000C94511C0C94511C0C94511C0C94511C74 -:103820000C94511C0C94511C0C94511C0C94511C64 -:103830000C94511C0C94511C0C94511C0C94511C54 -:103840000C94511C0C94511C0C94511C0C94511C44 -:103850000C94511C0C94511C0C94511C0C94511C34 -:103860000C94511C0C94511C11241FBECFEFD4E0BA -:10387000DEBFCDBF11E0A0E0B1E0E4EAFFE302C0AB -:1038800005900D92A230B107D9F712E0A2E0B1E0A5 -:1038900001C01D92AD30B107E1F70E94361D0C94B6 -:1038A000D01F0C94001C982F9595959595959595FE -:1038B000905D8F708A307CF0282F295A8091C0004B -:1038C00085FFFCCF9093C6008091C00085FFFCCFA0 -:1038D0002093C6000895282F205DF0CF982F809167 -:1038E000C00085FFFCCF9093C6000895EF92FF9231 -:1038F0000F931F93EE24FF2487018091C00087FD62 -:1039000017C00894E11CF11C011D111D81E4E8168B -:1039100082E4F8068FE0080780E0180770F3E09172 -:103920000401F091050109958091C00087FFE9CF5E -:103930008091C6001F910F91FF90EF9008950E9413 -:10394000761C982F8091C00085FFFCCF9093C60015 -:1039500091362CF490330CF09053892F089597559D -:10396000892F08951F930E949F1C182F0E949F1C4F -:103970001295107F810F1F910895882351F0982F81 -:1039800091508091C00087FFFCCF8091C6009923A1 -:10399000B9F708951F93182F0E94761C803249F0C2 -:1039A000809103018F5F809303018530C1F01F91E7 -:1039B00008958091C00085FFFCCF84E18093C6000C -:1039C0008091C00085FFFCCF1093C6008091C0009D -:1039D00085FFFCCF80E18093C6001F910895E091A0 -:1039E0000401F091050109951F9108950E94761C2C -:1039F000803241F0809103018F5F80930301853015 -:103A000081F008958091C00085FFFCCF84E1809310 -:103A1000C6008091C00085FFFCCF80E18093C60086 -:103A20000895E0910401F09105010995089510921F -:103A30000A028823D1F090E040E951E02D9A28EE67 -:103A400033E0FA013197F1F721503040D1F72D984A -:103A500028EE33E0FA013197F1F721503040D1F7E9 -:103A60009F5F981758F380930A0208953F924F92F0 -:103A70005F926F927F928F929F92AF92BF92CF92FE -:103A8000DF92EF92FF920F931F93CF93DF9300008B -:103A900083E38093C4001092C50088E18093C10045 -:103AA00086E08093C2005098589A259A81E00E943F -:103AB000171D44E1F42E3EE1E32E24E9D22E96E0D8 -:103AC000C92E80E1B82EAA24A39401E4902E16E515 -:103AD000812EB2E57B2EA0E26A2EF9E45F2EE3E5AB -:103AE0004E2E70E5372E0E94761C8033B1F1813363 -:103AF00009F441C0803409F479C0813409F48CC0E0 -:103B0000823471F1853409F47BC0803531F182351E -:103B100021F1813511F1853509F48DC0863509F41F -:103B20009DC0843609F4AEC0843709F41BC18537C3 -:103B300009F485C1863709F47AC0809103018F5F4B -:103B400080930301853079F6E0910401F09105013D -:103B500009950E94761C803351F60E94F61CC3CF53 -:103B600093E18091C00087FFFCCF8091C60099232C -:103B7000A1F39150F6CF0E94761C8032F1F680912D -:103B8000C00085FFFCCFF092C6008091C00085FF89 -:103B9000FCCF9092C6008091C00085FFFCCF809240 -:103BA000C6008091C00085FFFCCF7092C600809156 -:103BB000C00085FFFCCF6092C6008091C00085FFE9 -:103BC000FCCF5092C6008091C00085FFFCCF409290 -:103BD000C6008091C00085FFFCCF3092C600809166 -:103BE000C00085FFFCCFB092C6007DCF0E94761C3E -:103BF000863808F4B2CF0E94761C0E94F61C73CF60 -:103C000094E08091C00087FFFCCF8091C60099238B -:103C100009F4A3CF9150F5CF0E94761C8038D1F0E3 -:103C2000813861F1823809F499C0883979F080E0EF -:103C30000E94CA1C58CF0E94761C809306010E94E5 -:103C4000761C809307010E94F61C4DCF83E00E94F2 -:103C5000CA1C49CF82E00E94CA1C45CF0E94761C34 -:103C6000803309F486C192E08091C00087FFFCCFC9 -:103C70008091C6009923D9F29150F6CF81E00E943D -:103C8000CA1C31CF0E94761C809309020E94761CC8 -:103C90008093080280910C028E7F80930C020E9418 -:103CA000761C853429F480910C02816080930C028B -:103CB0008091080290910902892B89F000E010E0C0 -:103CC0000E94761CF801E85FFE4F80830F5F1F4F54 -:103CD00080910802909109020817190788F30E9441 -:103CE000761C803209F029CF80910C0280FFD1C070 -:103CF0004091060150910701440F551F5093070151 -:103D000040930601A0910802B09109021097C9F0F2 -:103D1000E8E0F1E09A01BD016E0F7F1FF999FECF37 -:103D200032BD21BD819180BDFA9AF99A2F5F3F4F34 -:103D3000E617F70799F74A0F5B1F50930701409367 -:103D400006018091C00085FFFCCFF092C6008091F3 -:103D5000C00085FFFCCFB092C600C5CE80E10E94B6 -:103D6000CA1CC1CE0E94761C809309020E94761C58 -:103D7000809308028091060190910701880F991F96 -:103D800090930701809306010E94761C853409F404 -:103D90007AC080910C028E7F80930C020E94761C68 -:103DA000803209F0A0CE8091C00085FFFCCFF09258 -:103DB000C600A0910802B09109021097B9F1809154 -:103DC0000C02182F1170082F0270E0910601F0917B -:103DD00007019F012F5F3F4FB90140E050E01123E1 -:103DE000B1F4002339F494918091C00085FFFCCF99 -:103DF0009093C6004F5F5F4FCB010196F9014A17C0 -:103E00005B0780F4BC012F5F3F4F112351F3F999F9 -:103E1000FECFF2BDE1BDF89A90B58091C00085FF5C -:103E2000FCCFE6CF70930701609306018091C0003C -:103E300085FDD9CE8091C00085FFF8CFD4CE0E94F9 -:103E4000761C803209F079CE8091C00085FFFCCFCE -:103E5000F092C6008091C00085FFFCCFE092C600C2 -:103E60008091C00085FFFCCFD092C6008091C00039 -:103E700085FFFCCFC092C6008091C00085FFFCCFBB -:103E8000B092C60030CE80910C02816080930C020B -:103E900085CF809107018823880F880B8A21809322 -:103EA0000B028091060190910701880F991F909352 -:103EB0000701809306018091080280FF09C080916C -:103EC00008029091090201969093090280930802DA -:103ED000F894F999FECF1127E0910601F0910701BE -:103EE000C8E0D1E08091080290910902103091F46D -:103EF0000091570001700130D9F303E0009357009F -:103F0000E8950091570001700130D9F301E1009369 -:103F10005700E89509901990009157000170013001 -:103F2000D9F301E000935700E8951395103498F009 -:103F300011270091570001700130D9F305E000937B -:103F40005700E8950091570001700130D9F301E165 -:103F500000935700E8953296029709F0C7CF1030CA -:103F600011F00296E5CF11248091C00085FFE9CEC3 -:103F7000ECCE0E94761C0E94761C182F0E94761CA4 -:103F8000112351F0113021F086E00E94CA1CABCD04 -:103F900084E90E94CA1CA7CD8EE10E94CA1CA3CD51 -:043FA000F894FFCFC3 -:023FA40080009B -:0400000300003800C1 -:00000001FF +:103800000C94341C0C94511C0C94511C0C94511CA1 +:103810000C94511C0C94511C0C94511C0C94511C74 +:103820000C94511C0C94511C0C94511C0C94511C64 +:103830000C94511C0C94511C0C94511C0C94511C54 +:103840000C94511C0C94511C0C94511C0C94511C44 +:103850000C94511C0C94511C0C94511C0C94511C34 +:103860000C94511C0C94511C11241FBECFEFD4E0BA +:10387000DEBFCDBF11E0A0E0B1E0E4EAFFE302C0AB +:1038800005900D92A230B107D9F712E0A2E0B1E0A5 +:1038900001C01D92AD30B107E1F70E94361D0C94B6 +:1038A000D01F0C94001C982F9595959595959595FE +:1038B000905D8F708A307CF0282F295A8091C0004B +:1038C00085FFFCCF9093C6008091C00085FFFCCFA0 +:1038D0002093C6000895282F205DF0CF982F809167 +:1038E000C00085FFFCCF9093C6000895EF92FF9231 +:1038F0000F931F93EE24FF2487018091C00087FD62 +:1039000017C00894E11CF11C011D111D81E4E8168B +:1039100082E4F8068FE0080780E0180770F3E09172 +:103920000401F091050109958091C00087FFE9CF5E +:103930008091C6001F910F91FF90EF9008950E9413 +:10394000761C982F8091C00085FFFCCF9093C60015 +:1039500091362CF490330CF09053892F089597559D +:10396000892F08951F930E949F1C182F0E949F1C4F +:103970001295107F810F1F910895882351F0982F81 +:1039800091508091C00087FFFCCF8091C6009923A1 +:10399000B9F708951F93182F0E94761C803249F0C2 +:1039A000809103018F5F809303018530C1F01F91E7 +:1039B00008958091C00085FFFCCF84E18093C6000C +:1039C0008091C00085FFFCCF1093C6008091C0009D +:1039D00085FFFCCF80E18093C6001F910895E091A0 +:1039E0000401F091050109951F9108950E94761C2C +:1039F000803241F0809103018F5F80930301853015 +:103A000081F008958091C00085FFFCCF84E1809310 +:103A1000C6008091C00085FFFCCF80E18093C60086 +:103A20000895E0910401F09105010995089510921F +:103A30000A028823D1F090E040E951E02D9A28EE67 +:103A400033E0FA013197F1F721503040D1F72D984A +:103A500028EE33E0FA013197F1F721503040D1F7E9 +:103A60009F5F981758F380930A0208953F924F92F0 +:103A70005F926F927F928F929F92AF92BF92CF92FE +:103A8000DF92EF92FF920F931F93CF93DF9300008B +:103A900083E38093C4001092C50088E18093C10045 +:103AA00086E08093C2005098589A259A81E00E943F +:103AB000171D44E1F42E3EE1E32E24E9D22E96E0D8 +:103AC000C92E80E1B82EAA24A39401E4902E16E515 +:103AD000812EB2E57B2EA0E26A2EF9E45F2EE3E5AB +:103AE0004E2E70E5372E0E94761C8033B1F1813363 +:103AF00009F441C0803409F479C0813409F48CC0E0 +:103B0000823471F1853409F47BC0803531F182351E +:103B100021F1813511F1853509F48DC0863509F41F +:103B20009DC0843609F4AEC0843709F41BC18537C3 +:103B300009F485C1863709F47AC0809103018F5F4B +:103B400080930301853079F6E0910401F09105013D +:103B500009950E94761C803351F60E94F61CC3CF53 +:103B600093E18091C00087FFFCCF8091C60099232C +:103B7000A1F39150F6CF0E94761C8032F1F680912D +:103B8000C00085FFFCCFF092C6008091C00085FF89 +:103B9000FCCF9092C6008091C00085FFFCCF809240 +:103BA000C6008091C00085FFFCCF7092C600809156 +:103BB000C00085FFFCCF6092C6008091C00085FFE9 +:103BC000FCCF5092C6008091C00085FFFCCF409290 +:103BD000C6008091C00085FFFCCF3092C600809166 +:103BE000C00085FFFCCFB092C6007DCF0E94761C3E +:103BF000863808F4B2CF0E94761C0E94F61C73CF60 +:103C000094E08091C00087FFFCCF8091C60099238B +:103C100009F4A3CF9150F5CF0E94761C8038D1F0E3 +:103C2000813861F1823809F499C0883979F080E0EF +:103C30000E94CA1C58CF0E94761C809306010E94E5 +:103C4000761C809307010E94F61C4DCF83E00E94F2 +:103C5000CA1C49CF82E00E94CA1C45CF0E94761C34 +:103C6000803309F486C192E08091C00087FFFCCFC9 +:103C70008091C6009923D9F29150F6CF81E00E943D +:103C8000CA1C31CF0E94761C809309020E94761CC8 +:103C90008093080280910C028E7F80930C020E9418 +:103CA000761C853429F480910C02816080930C028B +:103CB0008091080290910902892B89F000E010E0C0 +:103CC0000E94761CF801E85FFE4F80830F5F1F4F54 +:103CD00080910802909109020817190788F30E9441 +:103CE000761C803209F029CF80910C0280FFD1C070 +:103CF0004091060150910701440F551F5093070151 +:103D000040930601A0910802B09109021097C9F0F2 +:103D1000E8E0F1E09A01BD016E0F7F1FF999FECF37 +:103D200032BD21BD819180BDFA9AF99A2F5F3F4F34 +:103D3000E617F70799F74A0F5B1F50930701409367 +:103D400006018091C00085FFFCCFF092C6008091F3 +:103D5000C00085FFFCCFB092C600C5CE80E10E94B6 +:103D6000CA1CC1CE0E94761C809309020E94761C58 +:103D7000809308028091060190910701880F991F96 +:103D800090930701809306010E94761C853409F404 +:103D90007AC080910C028E7F80930C020E94761C68 +:103DA000803209F0A0CE8091C00085FFFCCFF09258 +:103DB000C600A0910802B09109021097B9F1809154 +:103DC0000C02182F1170082F0270E0910601F0917B +:103DD00007019F012F5F3F4FB90140E050E01123E1 +:103DE000B1F4002339F494918091C00085FFFCCF99 +:103DF0009093C6004F5F5F4FCB010196F9014A17C0 +:103E00005B0780F4BC012F5F3F4F112351F3F999F9 +:103E1000FECFF2BDE1BDF89A90B58091C00085FF5C +:103E2000FCCFE6CF70930701609306018091C0003C +:103E300085FDD9CE8091C00085FFF8CFD4CE0E94F9 +:103E4000761C803209F079CE8091C00085FFFCCFCE +:103E5000F092C6008091C00085FFFCCFE092C600C2 +:103E60008091C00085FFFCCFD092C6008091C00039 +:103E700085FFFCCFC092C6008091C00085FFFCCFBB +:103E8000B092C60030CE80910C02816080930C020B +:103E900085CF809107018823880F880B8A21809322 +:103EA0000B028091060190910701880F991F909352 +:103EB0000701809306018091080280FF09C080916C +:103EC00008029091090201969093090280930802DA +:103ED000F894F999FECF1127E0910601F0910701BE +:103EE000C8E0D1E08091080290910902103091F46D +:103EF0000091570001700130D9F303E0009357009F +:103F0000E8950091570001700130D9F301E1009369 +:103F10005700E89509901990009157000170013001 +:103F2000D9F301E000935700E8951395103498F009 +:103F300011270091570001700130D9F305E000937B +:103F40005700E8950091570001700130D9F301E165 +:103F500000935700E8953296029709F0C7CF1030CA +:103F600011F00296E5CF11248091C00085FFE9CEC3 +:103F7000ECCE0E94761C0E94761C182F0E94761CA4 +:103F8000112351F0113021F086E00E94CA1CABCD04 +:103F900084E90E94CA1CA7CD8EE10E94CA1CA3CD51 +:043FA000F894FFCFC3 +:023FA40080009B +:0400000300003800C1 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_ng.hex b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_ng.hex index 387091e7dcc..f63ba16feb3 100644 --- a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_ng.hex +++ b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_ng.hex @@ -1,110 +1,110 @@ -:103800000C94341C0C94511C0C94511C0C94511CA1 -:103810000C94511C0C94511C0C94511C0C94511C74 -:103820000C94511C0C94511C0C94511C0C94511C64 -:103830000C94511C0C94511C0C94511C0C94511C54 -:103840000C94511C0C94511C0C94511C0C94511C44 -:103850000C94511C0C94511C0C94511C0C94511C34 -:103860000C94511C0C94511C11241FBECFEFD4E0BA -:10387000DEBFCDBF11E0A0E0B1E0E4EAFEE302C0AC -:1038800005900D92A230B107D9F712E0A2E0B1E0A5 -:1038900001C01D92AD30B107E1F70E94ED1C0C9400 -:1038A000511F0C94001C482F10920A0280E08417CC -:1038B000E0F4582F2D9A28EE33E080E991E001974B -:1038C000F1F721503040C9F72D9828EE33E080E918 -:1038D00091E00197F1F721503040C9F7852F8F5FB4 -:1038E000582F841738F380930A020895EF92FF92BD -:1038F0000F931F93EE24FF2487018091C00087FD62 -:1039000017C00894E11CF11C011D111D81E0E8168F -:1039100082E1F8068AE7080780E0180770F3E09173 -:103920000201F091030109958091C00087FFE9CF62 -:103930008091C600992787FD90951F910F91FF9068 -:10394000EF900895982F8091C00085FFFCCF909351 -:10395000C60008950E94761C803271F080910401A7 -:103960008F5F80930401853009F00895E091020192 -:10397000F09103010995089584E10E94A21C80E161 -:103980000E94A21C0895CF93C82F0E94761C8032FB -:1039900041F0809104018F5F80930401853081F4B0 -:1039A0000AC084E10E94A21C8C2F0E94A21C80E10C -:1039B0000E94A21C05C0E0910201F091030109954B -:1039C000CF910895CF93C82FC150CF3F21F00E94CF -:1039D000761CC150E0F7CF910895CFEFD4E0DEBF61 -:1039E000CDBF000083E38093C4001092C50088E13E -:1039F0008093C10086E08093C2005098589A259A1F -:103A000083E00E94531C0E94761C8033B1F1813305 -:103A1000B9F1803409F455C0813409F45BC08234B3 -:103A200009F46DC0853409F470C0803531F18235F8 -:103A300021F1813511F1853509F46BC0863509F422 -:103A400073C0843609F47AC0843709F4CEC0853750 -:103A500009F429C1863709F44AC0809104018F5FB7 -:103A600080930401853079F6E0910201F091030121 -:103A700009950E94761C803351F60E94AA1CC3CF80 -:103A80000E94761CC82F803241F784E10E94A21C5C -:103A900081E40E94A21C86E50E94A21C82E50E948D -:103AA000A21C8C2F0E94A21C89E40E94A21C83E508 -:103AB0000E94A21C80E50E94A21C80E10E94A21C20 -:103AC000A2CF0E94761C8638C0F20E94761C0E940B -:103AD000AA1C99CF0E94761C803809F486C18138CF -:103AE00009F487C1823809F488C1883921F080E05F -:103AF0000E94C31C88CF83E00E94C31C84CF84E152 -:103B00000E94E21C0E94AA1C7ECF85E00E94E21C5B -:103B1000F9CF0E94761C809306010E94761C809348 -:103B200007010E94AA1C6FCF0E94761C803309F403 -:103B3000CAC083E00E94E21C80E0DACF0E94761CBB -:103B4000809309020E94761C8093080280910C02E7 -:103B50008E7F80930C020E94761C853409F4C4C0C9 -:103B600000E010E0809108029091090218161906F1 -:103B700070F4C8E0D1E00E94761C89930F5F1F4F5C -:103B8000809108029091090208171907A0F30E947A -:103B9000761C803209F061CF80910C0280FFAEC0AC -:103BA000E0910601F0910701EE0FFF1F00E010E029 -:103BB00020910802309109021216130680F4A8E041 -:103BC000B1E0F999FECFF2BDE1BD8D9180BDFA9AC9 -:103BD000F99A31960F5F1F4F0217130790F3F09376 -:103BE0000701E093060184E166CF0E94761C809372 -:103BF00009020E94761C8093080280910601909130 -:103C00000701880F991F90930701809306010E9476 -:103C1000761C853409F46EC080910C028E7F8093EF -:103C20000C020E94761C803209F0EDCE84E10E94E5 -:103C3000A21C00E010E02091080230910902121647 -:103C4000130608F03ACFE0910601F0910701809148 -:103C50000C0280FF1FC0F999FECFF2BDE1BDF89ABA -:103C600080B50E94A21CE0910601F09107013196F7 -:103C7000F0930701E09306012091080230910902B8 -:103C80000F5F1F4F0217130708F017CF80910C0228 -:103C900080FDE1CF869580FFB4C03196F093070197 -:103CA000E0930601EDCF0E94761C803209F0D5CE5C -:103CB00084E10E94A21C8EE10E94A21C84E90E9461 -:103CC000A21C86E0F8CE0E94761C0E94761CC82FAB -:103CD0000E94761CCC2309F47CC0C13009F47DC05D -:103CE00086E00E94C31C8FCE80910C02816080937D -:103CF0000C0236CF80910C02816091CF8091070138 -:103D000087FD6FC010920B02809106019091070110 -:103D1000880F991F909307018093060180910802F4 -:103D200080FF09C08091080290910902019690934A -:103D3000090280930802F894F999FECF1127E091C7 -:103D40000601F0910701C8E0D1E08091080290914E -:103D50000902103091F40091570001700130D9F33D -:103D600003E000935700E89500915700017001307F -:103D7000D9F301E100935700E8950990199000915B -:103D8000570001700130D9F301E000935700E89526 -:103D90001395103498F011270091570001700130ED -:103DA000D9F305E000935700E895009157000170A2 -:103DB0000130D9F301E100935700E895329602975C -:103DC00009F0C7CF103011F00296E5CF112484E13D -:103DD00072CE8EE10E94C31C16CE84E90E94C31CE1 -:103DE00012CE81E080930B028FCF82E00E94C31C31 -:103DF0000ACE81E00E94C31C06CE80E10E94C31C53 -:103E000002CE84910E94A21C2091080230910902E6 -:103E1000E0910601F091070140CFCF930E94761CFC -:103E2000C82F0E94A21CC13614F0C75503C0C0336E -:103E30000CF0C0538C2F992787FD9095CF91089552 -:103E40000F931F930E940D1F082F112707FD109538 -:103E500002951295107F1027007F10270E940D1FDA -:103E6000800F992787FD90951F910F910895CF930B -:103E7000C82F85958595859585958A3034F0895A22 -:103E8000CF70CA3034F0C95A05C0805DCF70CA30D7 -:103E9000D4F7C05D0E94A21C8C2F0E94A21CCF915F -:043EA0000895FFCFB3 -:023EA40080009C -:0400000300003800C1 -:00000001FF +:103800000C94341C0C94511C0C94511C0C94511CA1 +:103810000C94511C0C94511C0C94511C0C94511C74 +:103820000C94511C0C94511C0C94511C0C94511C64 +:103830000C94511C0C94511C0C94511C0C94511C54 +:103840000C94511C0C94511C0C94511C0C94511C44 +:103850000C94511C0C94511C0C94511C0C94511C34 +:103860000C94511C0C94511C11241FBECFEFD4E0BA +:10387000DEBFCDBF11E0A0E0B1E0E4EAFEE302C0AC +:1038800005900D92A230B107D9F712E0A2E0B1E0A5 +:1038900001C01D92AD30B107E1F70E94ED1C0C9400 +:1038A000511F0C94001C482F10920A0280E08417CC +:1038B000E0F4582F2D9A28EE33E080E991E001974B +:1038C000F1F721503040C9F72D9828EE33E080E918 +:1038D00091E00197F1F721503040C9F7852F8F5FB4 +:1038E000582F841738F380930A020895EF92FF92BD +:1038F0000F931F93EE24FF2487018091C00087FD62 +:1039000017C00894E11CF11C011D111D81E0E8168F +:1039100082E1F8068AE7080780E0180770F3E09173 +:103920000201F091030109958091C00087FFE9CF62 +:103930008091C600992787FD90951F910F91FF9068 +:10394000EF900895982F8091C00085FFFCCF909351 +:10395000C60008950E94761C803271F080910401A7 +:103960008F5F80930401853009F00895E091020192 +:10397000F09103010995089584E10E94A21C80E161 +:103980000E94A21C0895CF93C82F0E94761C8032FB +:1039900041F0809104018F5F80930401853081F4B0 +:1039A0000AC084E10E94A21C8C2F0E94A21C80E10C +:1039B0000E94A21C05C0E0910201F091030109954B +:1039C000CF910895CF93C82FC150CF3F21F00E94CF +:1039D000761CC150E0F7CF910895CFEFD4E0DEBF61 +:1039E000CDBF000083E38093C4001092C50088E13E +:1039F0008093C10086E08093C2005098589A259A1F +:103A000083E00E94531C0E94761C8033B1F1813305 +:103A1000B9F1803409F455C0813409F45BC08234B3 +:103A200009F46DC0853409F470C0803531F18235F8 +:103A300021F1813511F1853509F46BC0863509F422 +:103A400073C0843609F47AC0843709F4CEC0853750 +:103A500009F429C1863709F44AC0809104018F5FB7 +:103A600080930401853079F6E0910201F091030121 +:103A700009950E94761C803351F60E94AA1CC3CF80 +:103A80000E94761CC82F803241F784E10E94A21C5C +:103A900081E40E94A21C86E50E94A21C82E50E948D +:103AA000A21C8C2F0E94A21C89E40E94A21C83E508 +:103AB0000E94A21C80E50E94A21C80E10E94A21C20 +:103AC000A2CF0E94761C8638C0F20E94761C0E940B +:103AD000AA1C99CF0E94761C803809F486C18138CF +:103AE00009F487C1823809F488C1883921F080E05F +:103AF0000E94C31C88CF83E00E94C31C84CF84E152 +:103B00000E94E21C0E94AA1C7ECF85E00E94E21C5B +:103B1000F9CF0E94761C809306010E94761C809348 +:103B200007010E94AA1C6FCF0E94761C803309F403 +:103B3000CAC083E00E94E21C80E0DACF0E94761CBB +:103B4000809309020E94761C8093080280910C02E7 +:103B50008E7F80930C020E94761C853409F4C4C0C9 +:103B600000E010E0809108029091090218161906F1 +:103B700070F4C8E0D1E00E94761C89930F5F1F4F5C +:103B8000809108029091090208171907A0F30E947A +:103B9000761C803209F061CF80910C0280FFAEC0AC +:103BA000E0910601F0910701EE0FFF1F00E010E029 +:103BB00020910802309109021216130680F4A8E041 +:103BC000B1E0F999FECFF2BDE1BD8D9180BDFA9AC9 +:103BD000F99A31960F5F1F4F0217130790F3F09376 +:103BE0000701E093060184E166CF0E94761C809372 +:103BF00009020E94761C8093080280910601909130 +:103C00000701880F991F90930701809306010E9476 +:103C1000761C853409F46EC080910C028E7F8093EF +:103C20000C020E94761C803209F0EDCE84E10E94E5 +:103C3000A21C00E010E02091080230910902121647 +:103C4000130608F03ACFE0910601F0910701809148 +:103C50000C0280FF1FC0F999FECFF2BDE1BDF89ABA +:103C600080B50E94A21CE0910601F09107013196F7 +:103C7000F0930701E09306012091080230910902B8 +:103C80000F5F1F4F0217130708F017CF80910C0228 +:103C900080FDE1CF869580FFB4C03196F093070197 +:103CA000E0930601EDCF0E94761C803209F0D5CE5C +:103CB00084E10E94A21C8EE10E94A21C84E90E9461 +:103CC000A21C86E0F8CE0E94761C0E94761CC82FAB +:103CD0000E94761CCC2309F47CC0C13009F47DC05D +:103CE00086E00E94C31C8FCE80910C02816080937D +:103CF0000C0236CF80910C02816091CF8091070138 +:103D000087FD6FC010920B02809106019091070110 +:103D1000880F991F909307018093060180910802F4 +:103D200080FF09C08091080290910902019690934A +:103D3000090280930802F894F999FECF1127E091C7 +:103D40000601F0910701C8E0D1E08091080290914E +:103D50000902103091F40091570001700130D9F33D +:103D600003E000935700E89500915700017001307F +:103D7000D9F301E100935700E8950990199000915B +:103D8000570001700130D9F301E000935700E89526 +:103D90001395103498F011270091570001700130ED +:103DA000D9F305E000935700E895009157000170A2 +:103DB0000130D9F301E100935700E895329602975C +:103DC00009F0C7CF103011F00296E5CF112484E13D +:103DD00072CE8EE10E94C31C16CE84E90E94C31CE1 +:103DE00012CE81E080930B028FCF82E00E94C31C31 +:103DF0000ACE81E00E94C31C06CE80E10E94C31C53 +:103E000002CE84910E94A21C2091080230910902E6 +:103E1000E0910601F091070140CFCF930E94761CFC +:103E2000C82F0E94A21CC13614F0C75503C0C0336E +:103E30000CF0C0538C2F992787FD9095CF91089552 +:103E40000F931F930E940D1F082F112707FD109538 +:103E500002951295107F1027007F10270E940D1FDA +:103E6000800F992787FD90951F910F910895CF930B +:103E7000C82F85958595859585958A3034F0895A22 +:103E8000CF70CA3034F0C95A05C0805DCF70CA30D7 +:103E9000D4F7C05D0E94A21C8C2F0E94A21CCF915F +:043EA0000895FFCFB3 +:023EA40080009C +:0400000300003800C1 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex index 994e4789991..d26492568b6 100644 --- a/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex +++ b/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex @@ -1,126 +1,126 @@ -:103800000C94341C0C94511C0C94511C0C94511CA1 -:103810000C94511C0C94511C0C94511C0C94511C74 -:103820000C94511C0C94511C0C94511C0C94511C64 -:103830000C94511C0C94511C0C94511C0C94511C54 -:103840000C94511C0C94511C0C94511C0C94511C44 -:103850000C94511C0C94511C0C94511C0C94511C34 -:103860000C94511C0C94511C11241FBECFEFD4E0BA -:10387000DEBFCDBF11E0A0E0B1E0EEEAFFE302C0A1 -:1038800005900D92A230B107D9F712E0A2E0B1E0A5 -:1038900001C01D92AD30B107E1F70E94331D0C94B9 -:1038A000D51F0C94001C982F9595959595959595F9 -:1038B000905D8F708A307CF0282F295A8091C0004B -:1038C00085FFFCCF9093C6008091C00085FFFCCFA0 -:1038D0002093C6000895282F205DF0CF982F809167 -:1038E000C00085FFFCCF9093C6000895EF92FF9231 -:1038F0000F931F93EE24FF2487018091C00087FD62 -:1039000017C00894E11CF11C011D111D81E2E8168D -:1039100081EAF80687E0080780E0180770F3E09175 -:103920000401F091050109958091C00087FFE9CF5E -:103930008091C6001F910F91FF90EF9008950E9413 -:10394000761C982F8091C00085FFFCCF9093C60015 -:1039500091362CF490330CF09053892F089597559D -:10396000892F08951F930E949F1C182F0E949F1C4F -:103970001295107F810F1F9108951F93182F882390 -:1039800021F00E94761C1150E1F71F9108951F93BA -:10399000182F0E94761C803249F0809103018F5FBE -:1039A000809303018530C1F01F9108958091C0007C -:1039B00085FFFCCF84E18093C6008091C00085FF25 -:1039C000FCCF1093C6008091C00085FFFCCF80E142 -:1039D0008093C6001F910895E0910401F0910501C4 -:1039E00009951F9108950E94761C803241F08091C4 -:1039F00003018F5F80930301853081F008958091EA -:103A0000C00085FFFCCF84E18093C6008091C00098 -:103A100085FFFCCF80E18093C6000895E09104010A -:103A2000F09105010995089510920A028823D1F0BA -:103A300090E048EC50E02D9A28EE33E0FA013197FF -:103A4000F1F721503040D1F72D9828EE33E0FA01FC -:103A50003197F1F721503040D1F79F5F981758F315 -:103A600080930A0208953F924F925F926F927F92E5 -:103A70008F929F92AF92BF92CF92DF92EF92FF927E -:103A80000F931F93CF93DF9394B714BE8091600080 -:103A90008861809360001092600091FF0CC289E100 -:103AA0008093C4001092C50088E18093C10086E035 -:103AB0008093C2005098589A259A81E00E94141D64 -:103AC00044E1F42E3EE1E32E24E9D22E96E0C92E05 -:103AD00080E1B82EAA24A39401E4902E16E5812E4D -:103AE000B2E57B2EA0E26A2EF9E45F2EE3E54E2ECE -:103AF00070E5372E0E94761C8033B9F18133C1F115 -:103B0000803409F470C0813409F477C0823409F438 -:103B100086C0853409F489C0803539F1823529F1B0 -:103B2000813509F4AFC1853509F485C0863509F4BE -:103B30008DC0843609F435C1843709F4C1C0853796 -:103B400009F490C0863709F466C0809103018F5F45 -:103B500080930301853071F6E0910401F091050135 -:103B600009950E94761C803349F60E94F31CC2CF4F -:103B70000E94761C803249F78091C00085FFFCCFFF -:103B8000F092C6008091C00085FFFCCF9092C600E5 -:103B90008091C00085FFFCCF8092C6008091C0005C -:103BA00085FFFCCF7092C6008091C00085FFFCCFDE -:103BB0006092C6008091C00085FFFCCF5092C60085 -:103BC0008091C00085FFFCCF4092C6008091C0006C -:103BD00085FFFCCF3092C6008091C00085FFFCCFEE -:103BE000B092C60087CF0E94761C863808F4BDCFFD -:103BF0000E94761C0E94F31C7DCF0E94761C8038A8 -:103C000009F45AC0813809F453C0823809F440C11C -:103C1000883909F449C080E00E94C71C6BCF84E159 -:103C20000E94BD1C0E94F31C65CF85E00E94BD1C54 -:103C30000E94F31C5FCF0E94761C809306010E94B5 -:103C4000761C809307010E94F31C54CF0E94761CBF -:103C5000803309F421C183E00E94BD1C80E00E94F2 -:103C6000C71C48CF0E94761C803209F06ECF80912D -:103C7000C00085FFFCCFF092C6008091C00085FF98 -:103C8000FCCFE092C6008091C00085FFFCCFD092AF -:103C9000C6008091C00085FFFCCFC092C600809115 -:103CA000C00085FFFCCF9CCF83E00E94C71C22CFC1 -:103CB00081E00E94C71C1ECF82E00E94C71C1ACF61 -:103CC0000E94761C809309020E94761C8093080251 -:103CD0008091060190910701880F991F9093070129 -:103CE000809306010E94761C853409F4C5C080913A -:103CF0000C028E7F80930C020E94761C803209F0A9 -:103D0000F9CE8091C00085FFFCCFF092C600609193 -:103D10000802709109026115710591F140E050E0CF -:103D200080910C02A82FA170B82FB27010C0BB23D5 -:103D300061F1E0910601F09107013196F0930701DE -:103D4000E09306014F5F5F4F46175707C8F4AA2359 -:103D500071F3F999FECF209106013091070132BD30 -:103D600021BDF89A90B58091C00085FFFCCF90935B -:103D7000C6002F5F3F4F3093070120930601E2CF2B -:103D80008091C00085FFFCCF2BCFE0910601F09120 -:103D9000070194918091C00085FFFCCF9093C600ED -:103DA000CCCF0E94761C809309020E94761C8093DF -:103DB000080280910C028E7F80930C020E94761C78 -:103DC000853429F480910C02816080930C028091EB -:103DD000080290910902892B89F000E010E00E940E -:103DE000761CF801E85FFE4F80830F5F1F4F8091C4 -:103DF0000802909109020817190788F30E94761C9F -:103E0000803209F0A2CE80910C0280FF62C0409106 -:103E1000060150910701440F551F5093070140932D -:103E20000601609108027091090261157105C9F0DF -:103E3000E8E0F1E09A01DB01AE0FBF1FF999FECF78 -:103E400032BD21BD819180BDFA9AF99A2F5F3F4F13 -:103E5000EA17FB0799F7460F571F50930701409346 -:103E600006018091C00085FFFCCFF092C6008091D2 -:103E7000C00085FFFCCFB4CE80910C02816080939E -:103E80000C023ACF0E94F31C88E080936000FFCFC1 -:103E900080E10E94C71C2ECE0E94761C0E94761CD8 -:103EA000182F0E94761C112381F0113051F086E00A -:103EB0000E94C71C1FCEE0910401F09105010995F5 -:103EC000EECD84E90E94C71C15CE8EE10E94C71C6E -:103ED00011CE809107018823880F880B8A21809357 -:103EE0000B028091060190910701880F991F909312 -:103EF0000701809306018091080280FF09C080912C -:103F00000802909109020196909309028093080299 -:103F1000F894F999FECF1127E0910601F09107017D -:103F2000C8E0D1E08091080290910902103091F42C -:103F30000091570001700130D9F303E0009357005E -:103F4000E8950091570001700130D9F301E1009329 -:103F50005700E895099019900091570001700130C1 -:103F6000D9F301E000935700E8951395103498F0C9 -:103F700011270091570001700130D9F305E000933B -:103F80005700E8950091570001700130D9F301E125 -:103F900000935700E8953296029709F0C7CF10308A -:0E3FA00011F00296E5CF11245CCFF894FFCF0C -:023FAE00800091 -:0400000300003800C1 -:00000001FF +:103800000C94341C0C94511C0C94511C0C94511CA1 +:103810000C94511C0C94511C0C94511C0C94511C74 +:103820000C94511C0C94511C0C94511C0C94511C64 +:103830000C94511C0C94511C0C94511C0C94511C54 +:103840000C94511C0C94511C0C94511C0C94511C44 +:103850000C94511C0C94511C0C94511C0C94511C34 +:103860000C94511C0C94511C11241FBECFEFD4E0BA +:10387000DEBFCDBF11E0A0E0B1E0EEEAFFE302C0A1 +:1038800005900D92A230B107D9F712E0A2E0B1E0A5 +:1038900001C01D92AD30B107E1F70E94331D0C94B9 +:1038A000D51F0C94001C982F9595959595959595F9 +:1038B000905D8F708A307CF0282F295A8091C0004B +:1038C00085FFFCCF9093C6008091C00085FFFCCFA0 +:1038D0002093C6000895282F205DF0CF982F809167 +:1038E000C00085FFFCCF9093C6000895EF92FF9231 +:1038F0000F931F93EE24FF2487018091C00087FD62 +:1039000017C00894E11CF11C011D111D81E2E8168D +:1039100081EAF80687E0080780E0180770F3E09175 +:103920000401F091050109958091C00087FFE9CF5E +:103930008091C6001F910F91FF90EF9008950E9413 +:10394000761C982F8091C00085FFFCCF9093C60015 +:1039500091362CF490330CF09053892F089597559D +:10396000892F08951F930E949F1C182F0E949F1C4F +:103970001295107F810F1F9108951F93182F882390 +:1039800021F00E94761C1150E1F71F9108951F93BA +:10399000182F0E94761C803249F0809103018F5FBE +:1039A000809303018530C1F01F9108958091C0007C +:1039B00085FFFCCF84E18093C6008091C00085FF25 +:1039C000FCCF1093C6008091C00085FFFCCF80E142 +:1039D0008093C6001F910895E0910401F0910501C4 +:1039E00009951F9108950E94761C803241F08091C4 +:1039F00003018F5F80930301853081F008958091EA +:103A0000C00085FFFCCF84E18093C6008091C00098 +:103A100085FFFCCF80E18093C6000895E09104010A +:103A2000F09105010995089510920A028823D1F0BA +:103A300090E048EC50E02D9A28EE33E0FA013197FF +:103A4000F1F721503040D1F72D9828EE33E0FA01FC +:103A50003197F1F721503040D1F79F5F981758F315 +:103A600080930A0208953F924F925F926F927F92E5 +:103A70008F929F92AF92BF92CF92DF92EF92FF927E +:103A80000F931F93CF93DF9394B714BE8091600080 +:103A90008861809360001092600091FF0CC289E100 +:103AA0008093C4001092C50088E18093C10086E035 +:103AB0008093C2005098589A259A81E00E94141D64 +:103AC00044E1F42E3EE1E32E24E9D22E96E0C92E05 +:103AD00080E1B82EAA24A39401E4902E16E5812E4D +:103AE000B2E57B2EA0E26A2EF9E45F2EE3E54E2ECE +:103AF00070E5372E0E94761C8033B9F18133C1F115 +:103B0000803409F470C0813409F477C0823409F438 +:103B100086C0853409F489C0803539F1823529F1B0 +:103B2000813509F4AFC1853509F485C0863509F4BE +:103B30008DC0843609F435C1843709F4C1C0853796 +:103B400009F490C0863709F466C0809103018F5F45 +:103B500080930301853071F6E0910401F091050135 +:103B600009950E94761C803349F60E94F31CC2CF4F +:103B70000E94761C803249F78091C00085FFFCCFFF +:103B8000F092C6008091C00085FFFCCF9092C600E5 +:103B90008091C00085FFFCCF8092C6008091C0005C +:103BA00085FFFCCF7092C6008091C00085FFFCCFDE +:103BB0006092C6008091C00085FFFCCF5092C60085 +:103BC0008091C00085FFFCCF4092C6008091C0006C +:103BD00085FFFCCF3092C6008091C00085FFFCCFEE +:103BE000B092C60087CF0E94761C863808F4BDCFFD +:103BF0000E94761C0E94F31C7DCF0E94761C8038A8 +:103C000009F45AC0813809F453C0823809F440C11C +:103C1000883909F449C080E00E94C71C6BCF84E159 +:103C20000E94BD1C0E94F31C65CF85E00E94BD1C54 +:103C30000E94F31C5FCF0E94761C809306010E94B5 +:103C4000761C809307010E94F31C54CF0E94761CBF +:103C5000803309F421C183E00E94BD1C80E00E94F2 +:103C6000C71C48CF0E94761C803209F06ECF80912D +:103C7000C00085FFFCCFF092C6008091C00085FF98 +:103C8000FCCFE092C6008091C00085FFFCCFD092AF +:103C9000C6008091C00085FFFCCFC092C600809115 +:103CA000C00085FFFCCF9CCF83E00E94C71C22CFC1 +:103CB00081E00E94C71C1ECF82E00E94C71C1ACF61 +:103CC0000E94761C809309020E94761C8093080251 +:103CD0008091060190910701880F991F9093070129 +:103CE000809306010E94761C853409F4C5C080913A +:103CF0000C028E7F80930C020E94761C803209F0A9 +:103D0000F9CE8091C00085FFFCCFF092C600609193 +:103D10000802709109026115710591F140E050E0CF +:103D200080910C02A82FA170B82FB27010C0BB23D5 +:103D300061F1E0910601F09107013196F0930701DE +:103D4000E09306014F5F5F4F46175707C8F4AA2359 +:103D500071F3F999FECF209106013091070132BD30 +:103D600021BDF89A90B58091C00085FFFCCF90935B +:103D7000C6002F5F3F4F3093070120930601E2CF2B +:103D80008091C00085FFFCCF2BCFE0910601F09120 +:103D9000070194918091C00085FFFCCF9093C600ED +:103DA000CCCF0E94761C809309020E94761C8093DF +:103DB000080280910C028E7F80930C020E94761C78 +:103DC000853429F480910C02816080930C028091EB +:103DD000080290910902892B89F000E010E00E940E +:103DE000761CF801E85FFE4F80830F5F1F4F8091C4 +:103DF0000802909109020817190788F30E94761C9F +:103E0000803209F0A2CE80910C0280FF62C0409106 +:103E1000060150910701440F551F5093070140932D +:103E20000601609108027091090261157105C9F0DF +:103E3000E8E0F1E09A01DB01AE0FBF1FF999FECF78 +:103E400032BD21BD819180BDFA9AF99A2F5F3F4F13 +:103E5000EA17FB0799F7460F571F50930701409346 +:103E600006018091C00085FFFCCFF092C6008091D2 +:103E7000C00085FFFCCFB4CE80910C02816080939E +:103E80000C023ACF0E94F31C88E080936000FFCFC1 +:103E900080E10E94C71C2ECE0E94761C0E94761CD8 +:103EA000182F0E94761C112381F0113051F086E00A +:103EB0000E94C71C1FCEE0910401F09105010995F5 +:103EC000EECD84E90E94C71C15CE8EE10E94C71C6E +:103ED00011CE809107018823880F880B8A21809357 +:103EE0000B028091060190910701880F991F909312 +:103EF0000701809306018091080280FF09C080912C +:103F00000802909109020196909309028093080299 +:103F1000F894F999FECF1127E0910601F09107017D +:103F2000C8E0D1E08091080290910902103091F42C +:103F30000091570001700130D9F303E0009357005E +:103F4000E8950091570001700130D9F301E1009329 +:103F50005700E895099019900091570001700130C1 +:103F6000D9F301E000935700E8951395103498F0C9 +:103F700011270091570001700130D9F305E000933B +:103F80005700E8950091570001700130D9F301E125 +:103F900000935700E8953296029709F0C7CF10308A +:0E3FA00011F00296E5CF11245CCFF894FFCF0C +:023FAE00800091 +:0400000300003800C1 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex b/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex index 6190d48b590..320fa4238a7 100644 --- a/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex +++ b/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex @@ -1,66 +1,66 @@ -:101C000012C02BC02AC029C028C027C026C025C0AA -:101C100024C023C022C021C020C01FC01EC01DC0C0 -:101C20001CC01BC01AC011241FBECFE5D4E0DEBF0C -:101C3000CDBF10E0A0E6B0E0E8EEFFE102C0059005 -:101C40000D92A236B107D9F711E0A2E6B0E001C0CB -:101C50001D92AA36B107E1F74FC0D2CFEF92FF92A3 -:101C60000F931F93EE24FF24870113C00894E11CF7 -:101C7000F11C011D111D81E0E81682E1F8068AE7DA -:101C8000080780E0180728F0E0916200F0916300F7 -:101C900009955F9BEBCF8CB1992787FD90951F919C -:101CA0000F91FF90EF9008955D9BFECF8CB9089542 -:101CB000D5DF803221F484E1F7DF80E1F5DF08959C -:101CC0001F93182FCBDF803231F484E1EDDF812FB9 -:101CD000EBDF80E1E9DF1F9108951F93CF93DF933E -:101CE000182FC0E0D0E002C0B9DF2196C117E0F3A1 -:101CF000DF91CF911F910895CFE5D4E0DEBFCDBF36 -:101D0000000010BC83E389B988E18AB986E880BD08 -:101D1000BD9A1092680130E2E0E0F0E02FE088B375 -:101D2000832788BBCF010197F1F7215027FFF7CF19 -:101D300020E12093680192DF803381F1813399F4AF -:101D40008DDF8032C1F784E1AFDF81E4ADDF86E56E -:101D5000ABDF82E5A9DF80E2A7DF89E4A5DF83E5C9 -:101D6000A3DF80E5C7C0803429F478DF8638B0F07F -:101D700075DF14C0813471F471DF803811F482E0B2 -:101D80001DC1813811F481E019C1823809F015C1F3 -:101D900082E114C1823421F484E19FDF89DFCBCF5B -:101DA000853411F485E0F9CF8035C1F38135B1F385 -:101DB0008235A1F3853539F451DF809364004EDF1D -:101DC00080936500EBCF863519F484E086DFF5C09B -:101DD000843609F093C042DF809367013FDF809330 -:101DE0006601809169018E7F8093690137DF8534B8 -:101DF00029F480916901816080936901C0E0D0E09D -:101E000006E610E005C02ADFF80181938F012196D4 -:101E10008091660190916701C817D907A0F31EDF72 -:101E2000803209F088CF8091690180FF1FC020E0D7 -:101E300030E0E6E6F0E012C0A0916400B0916500E9 -:101E40008191082EC5D08091640090916500019623 -:101E500090936500809364002F5F3F4F80916601EF -:101E6000909167012817390738F343C0F894E19936 -:101E7000FECF1127E0916400F0916500EE0FFF1F87 -:101E8000C6E6D0E0809166019091670180FF01C0B5 -:101E90000196103051F422D003E000935700E895EA -:101EA0001DD001E100935700E8950990199016D0D4 -:101EB00001E000935700E8951395103258F0112770 -:101EC0000DD005E000935700E89508D001E100939C -:101ED0005700E8953296029739F0DBCF0091570012 -:101EE00001700130D9F30895103011F00296E7CF58 -:101EF000112484E1D9DE80E1D7DE1DCF843709F0DB -:101F00004BC0ACDE80936701A9DE80936601A6DE3C -:101F100090916901853421F49160909369010DC01D -:101F20009E7F909369018091640090916500880F75 -:101F3000991F909365008093640090DE803209F0D1 -:101F4000FACE84E1B1DEC0E0D0E01EC0809169012C -:101F500080FF07C0A0916400B091650031D0802D52 -:101F600008C081FD07C0E0916400F0916500E49134 -:101F70008E2F9ADE80916400909165000196909377 -:101F800065008093640021968091660190916701BD -:101F9000C817D907D8F2AFCF853761F45FDE80323A -:101FA00009F0C9CE84E180DE8EE17EDE83E97CDE4D -:101FB00087E0A0CF863709F0BECE80E081DEBBCEC1 -:101FC000E199FECFBFBBAEBBE09A11960DB208956A -:101FD000E199FECFBFBBAEBB0DBA11960FB6F89418 -:081FE000E29AE19A0FBE089598 -:021FE800800077 -:0400000300001C00DD -:00000001FF +:101C000012C02BC02AC029C028C027C026C025C0AA +:101C100024C023C022C021C020C01FC01EC01DC0C0 +:101C20001CC01BC01AC011241FBECFE5D4E0DEBF0C +:101C3000CDBF10E0A0E6B0E0E8EEFFE102C0059005 +:101C40000D92A236B107D9F711E0A2E6B0E001C0CB +:101C50001D92AA36B107E1F74FC0D2CFEF92FF92A3 +:101C60000F931F93EE24FF24870113C00894E11CF7 +:101C7000F11C011D111D81E0E81682E1F8068AE7DA +:101C8000080780E0180728F0E0916200F0916300F7 +:101C900009955F9BEBCF8CB1992787FD90951F919C +:101CA0000F91FF90EF9008955D9BFECF8CB9089542 +:101CB000D5DF803221F484E1F7DF80E1F5DF08959C +:101CC0001F93182FCBDF803231F484E1EDDF812FB9 +:101CD000EBDF80E1E9DF1F9108951F93CF93DF933E +:101CE000182FC0E0D0E002C0B9DF2196C117E0F3A1 +:101CF000DF91CF911F910895CFE5D4E0DEBFCDBF36 +:101D0000000010BC83E389B988E18AB986E880BD08 +:101D1000BD9A1092680130E2E0E0F0E02FE088B375 +:101D2000832788BBCF010197F1F7215027FFF7CF19 +:101D300020E12093680192DF803381F1813399F4AF +:101D40008DDF8032C1F784E1AFDF81E4ADDF86E56E +:101D5000ABDF82E5A9DF80E2A7DF89E4A5DF83E5C9 +:101D6000A3DF80E5C7C0803429F478DF8638B0F07F +:101D700075DF14C0813471F471DF803811F482E0B2 +:101D80001DC1813811F481E019C1823809F015C1F3 +:101D900082E114C1823421F484E19FDF89DFCBCF5B +:101DA000853411F485E0F9CF8035C1F38135B1F385 +:101DB0008235A1F3853539F451DF809364004EDF1D +:101DC00080936500EBCF863519F484E086DFF5C09B +:101DD000843609F093C042DF809367013FDF809330 +:101DE0006601809169018E7F8093690137DF8534B8 +:101DF00029F480916901816080936901C0E0D0E09D +:101E000006E610E005C02ADFF80181938F012196D4 +:101E10008091660190916701C817D907A0F31EDF72 +:101E2000803209F088CF8091690180FF1FC020E0D7 +:101E300030E0E6E6F0E012C0A0916400B0916500E9 +:101E40008191082EC5D08091640090916500019623 +:101E500090936500809364002F5F3F4F80916601EF +:101E6000909167012817390738F343C0F894E19936 +:101E7000FECF1127E0916400F0916500EE0FFF1F87 +:101E8000C6E6D0E0809166019091670180FF01C0B5 +:101E90000196103051F422D003E000935700E895EA +:101EA0001DD001E100935700E8950990199016D0D4 +:101EB00001E000935700E8951395103258F0112770 +:101EC0000DD005E000935700E89508D001E100939C +:101ED0005700E8953296029739F0DBCF0091570012 +:101EE00001700130D9F30895103011F00296E7CF58 +:101EF000112484E1D9DE80E1D7DE1DCF843709F0DB +:101F00004BC0ACDE80936701A9DE80936601A6DE3C +:101F100090916901853421F49160909369010DC01D +:101F20009E7F909369018091640090916500880F75 +:101F3000991F909365008093640090DE803209F0D1 +:101F4000FACE84E1B1DEC0E0D0E01EC0809169012C +:101F500080FF07C0A0916400B091650031D0802D52 +:101F600008C081FD07C0E0916400F0916500E49134 +:101F70008E2F9ADE80916400909165000196909377 +:101F800065008093640021968091660190916701BD +:101F9000C817D907D8F2AFCF853761F45FDE80323A +:101FA00009F0C9CE84E180DE8EE17EDE83E97CDE4D +:101FB00087E0A0CF863709F0BECE80E081DEBBCEC1 +:101FC000E199FECFBFBBAEBBE09A11960DB208956A +:101FD000E199FECFBFBBAEBB0DBA11960FB6F89418 +:081FE000E29AE19A0FBE089598 +:021FE800800077 +:0400000300001C00DD +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT.hex b/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT.hex index 9182267e5a6..140c1779633 100644 --- a/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT.hex +++ b/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT.hex @@ -1,62 +1,62 @@ -:101C000012C02CC02BC02AC029C028C027C026C0A3 -:101C100025C024C023C022C021C020C01FC01EC0B8 -:101C20001DC01CC01BC011241FBECFE5D4E0DEBF09 -:101C3000CDBF10E0A0E6B0E0E6EAFFE102C005900B -:101C40000D92A236B107D9F711E0A2E6B0E001C0CB -:101C50001D92AA36B107E1F72BD0A3C1D1CF5D9B6E -:101C6000FECF8CB908955F9BFECF8CB108950F9382 -:101C70001F93082F10E002C0F6DF1F5F1017E0F37C -:101C80001F910F9108951F93182FEDDF803231F4CB -:101C900084E1E5DF812FE3DF80E1E1DF1F9108953B -:101CA000E2DF803221F484E1DADF80E1D8DF0895D9 -:101CB0000F931F93CF93DF93000010BC83E389B988 -:101CC00088E18AB986E880BDBD9A1092680120E05B -:101CD00030E240E050E007C088B3832788BBCA01E8 -:101CE0000197F1F72F5F2031B8F320936801BBDF34 -:101CF000803381F1813399F4B6DF8032C1F784E11A -:101D0000AEDF81E4ACDF86E5AADF82E5A8DF80E212 -:101D1000A6DF89E4A4DF83E5A2DF80E523C1803468 -:101D200029F4A1DF8638B0F09EDF14C0813471F44D -:101D30009ADF803811F482E01DC1813811F481E00E -:101D400019C1823809F015C182E114C1823421F42D -:101D500084E18DDFA5DFCBCF853411F485E0F9CFA9 -:101D60008035C1F38135B1F38235A1F3853539F47E -:101D70007ADF8093640077DF80936500EBCF863550 -:101D800019F484E074DFF5C0843609F090C06BDF8D -:101D90008093670168DF80936601809169018E7F7F -:101DA0008093690160DF853429F480916901816045 -:101DB0008093690100E010E007C055DFF801EA599F -:101DC000FF4F80830F5F1F4F8091660190916701E5 -:101DD0000817190790F347DF803209F088CF809108 -:101DE000690180FF1FC000E010E014C0F801EA594B -:101DF000FF4F80916400909165006081C5D0809113 -:101E00006400909165000196909365008093640052 -:101E10000F5F1F4F809166019091670108171907A6 -:101E200028F343C0F894E199FECF1127E0916400B4 -:101E3000F0916500EE0FFF1FC6E6D0E080916601CD -:101E40009091670180FF01C00196103051F422D0BB -:101E500003E000935700E8951DD001E1009357007F -:101E6000E8950990199016D001E000935700E89585 -:101E70001395103258F011270DD005E0009357004C -:101E8000E89508D001E100935700E8953296029753 -:101E900039F0DBCF0091570001700130D9F308957C -:101EA000103011F00296E7CF112484E15BC0843733 -:101EB00009F04BC0D8DE80936701D5DE80936601C0 -:101EC000D2DE90916901853421F49160909369018B -:101ED0000DC09E7F90936901809164009091650090 -:101EE000880F991F9093650080936400BCDE803258 -:101EF00009F0FDCE84E1B3DE00E010E01EC0809169 -:101F0000690180FF06C0809164009091650034D023 -:101F100008C081FD07C0E0916400F0916500E49184 -:101F20008E2F9DDE809164009091650001969093C4 -:101F30006500809364000F5F1F4F80916601909150 -:101F4000670108171907D8F20EC0853779F48BDEC0 -:101F5000803209F0CCCE84E182DE8EE180DE83E93E -:101F60007EDE87E07CDE80E17ADEC1CE863709F056 -:101F7000BECE80E088DEBBCEE199FECF9FBB8EBB9C -:101F8000E09A99278DB30895262FE199FECF9FBB44 -:101F90008EBB2DBB0FB6F894E29AE19A0FBE019664 -:061FA0000895F894FFCF44 -:021FA6008000B9 -:0400000300001C00DD -:00000001FF +:101C000012C02CC02BC02AC029C028C027C026C0A3 +:101C100025C024C023C022C021C020C01FC01EC0B8 +:101C20001DC01CC01BC011241FBECFE5D4E0DEBF09 +:101C3000CDBF10E0A0E6B0E0E6EAFFE102C005900B +:101C40000D92A236B107D9F711E0A2E6B0E001C0CB +:101C50001D92AA36B107E1F72BD0A3C1D1CF5D9B6E +:101C6000FECF8CB908955F9BFECF8CB108950F9382 +:101C70001F93082F10E002C0F6DF1F5F1017E0F37C +:101C80001F910F9108951F93182FEDDF803231F4CB +:101C900084E1E5DF812FE3DF80E1E1DF1F9108953B +:101CA000E2DF803221F484E1DADF80E1D8DF0895D9 +:101CB0000F931F93CF93DF93000010BC83E389B988 +:101CC00088E18AB986E880BDBD9A1092680120E05B +:101CD00030E240E050E007C088B3832788BBCA01E8 +:101CE0000197F1F72F5F2031B8F320936801BBDF34 +:101CF000803381F1813399F4B6DF8032C1F784E11A +:101D0000AEDF81E4ACDF86E5AADF82E5A8DF80E212 +:101D1000A6DF89E4A4DF83E5A2DF80E523C1803468 +:101D200029F4A1DF8638B0F09EDF14C0813471F44D +:101D30009ADF803811F482E01DC1813811F481E00E +:101D400019C1823809F015C182E114C1823421F42D +:101D500084E18DDFA5DFCBCF853411F485E0F9CFA9 +:101D60008035C1F38135B1F38235A1F3853539F47E +:101D70007ADF8093640077DF80936500EBCF863550 +:101D800019F484E074DFF5C0843609F090C06BDF8D +:101D90008093670168DF80936601809169018E7F7F +:101DA0008093690160DF853429F480916901816045 +:101DB0008093690100E010E007C055DFF801EA599F +:101DC000FF4F80830F5F1F4F8091660190916701E5 +:101DD0000817190790F347DF803209F088CF809108 +:101DE000690180FF1FC000E010E014C0F801EA594B +:101DF000FF4F80916400909165006081C5D0809113 +:101E00006400909165000196909365008093640052 +:101E10000F5F1F4F809166019091670108171907A6 +:101E200028F343C0F894E199FECF1127E0916400B4 +:101E3000F0916500EE0FFF1FC6E6D0E080916601CD +:101E40009091670180FF01C00196103051F422D0BB +:101E500003E000935700E8951DD001E1009357007F +:101E6000E8950990199016D001E000935700E89585 +:101E70001395103258F011270DD005E0009357004C +:101E8000E89508D001E100935700E8953296029753 +:101E900039F0DBCF0091570001700130D9F308957C +:101EA000103011F00296E7CF112484E15BC0843733 +:101EB00009F04BC0D8DE80936701D5DE80936601C0 +:101EC000D2DE90916901853421F49160909369018B +:101ED0000DC09E7F90936901809164009091650090 +:101EE000880F991F9093650080936400BCDE803258 +:101EF00009F0FDCE84E1B3DE00E010E01EC0809169 +:101F0000690180FF06C0809164009091650034D023 +:101F100008C081FD07C0E0916400F0916500E49184 +:101F20008E2F9DDE809164009091650001969093C4 +:101F30006500809364000F5F1F4F80916601909150 +:101F4000670108171907D8F20EC0853779F48BDEC0 +:101F5000803209F0CCCE84E182DE8EE180DE83E93E +:101F60007EDE87E07CDE80E17ADEC1CE863709F056 +:101F7000BECE80E088DEBBCEE199FECF9FBB8EBB9C +:101F8000E09A99278DB30895262FE199FECF9FBB44 +:101F90008EBB2DBB0FB6F894E29AE19A0FBE019664 +:061FA0000895F894FFCF44 +:021FA6008000B9 +:0400000300001C00DD +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/bt/ATmegaBOOT_168_atmega328_bt.hex b/hardware/arduino/avr/bootloaders/bt/ATmegaBOOT_168_atmega328_bt.hex index a50c7c38e87..f64b258a6ed 100644 --- a/hardware/arduino/avr/bootloaders/bt/ATmegaBOOT_168_atmega328_bt.hex +++ b/hardware/arduino/avr/bootloaders/bt/ATmegaBOOT_168_atmega328_bt.hex @@ -1,162 +1,162 @@ -:107000000C9434380C9451380C9451380C945138F9 -:107010000C9451380C9451380C9451380C945138CC -:107020000C9451380C9451380C9451380C945138BC -:107030000C9451380C9451380C9451380C945138AC -:107040000C9451380C9451380C9451380C9451389C -:107050000C9451380C9451380C9451380C9451388C -:107060000C9451380C94513811241FBECFEFD8E046 -:10707000DEBFCDBF11E0A0E0B1E0E4EEF9E702C071 -:1070800005900D92A230B107D9F712E0A2E0B1E06D -:1070900001C01D92AC30B107E1F70E942D390C946C -:1070A000F03C0C940038282F992787FD9095807F1D -:1070B00090709595879595958795959587959595D4 -:1070C00087958A30C4F0382F395A822F8F708A30D2 -:1070D0007CF0982F995A8091C00085FFFCCF3093A7 -:1070E000C6008091C00085FFFCCF9093C600089534 -:1070F000982F905DF0CF382F305DE7CF982F80919B -:10710000C00085FFFCCF9093C6000895EF92FF92D8 -:107110000F931F93EE24FF2487018091C00087FD09 -:1071200017C00894E11CF11C011D111D81E0E81637 -:1071300082E1F8068AE7080780E0180770F3E0911B -:107140000301F091040109958091C00087FFE9CF08 -:107150008091C6001F910F91FF90EF9008951F93AB -:107160000E948638182F8091C00085FFFCCF1093B5 -:10717000C6000E948638982F8091C00085FFFCCF02 -:107180009093C600113664F01755913674F490331D -:107190000CF090531295107F892F810F1F91089545 -:1071A00010339CF31053913694F397551295107F3A -:1071B000892F810F1F910895282F882351F090E087 -:1071C0008091C00087FFFCCF8091C6009F5F92171F -:1071D000B8F308951F93182F0E948638803211F05B -:1071E0001F9108958091C00085FFFCCF84E18093BA -:1071F000C6008091C00085FFFCCF1093C60080912F -:10720000C00085FFFCCF80E18093C6001F910895E8 -:107210000E948638803209F008958091C00085FF71 -:10722000FCCF84E18093C6008091C00085FFFCCF35 -:1072300080E18093C6000895882359F010920902D6 -:1072400090E02D9A2D989F5F9817D8F3909309029C -:1072500008951092090283E0F3CF3F924F925F921C -:107260006F927F928F929F92AF92BF92CF92DF9256 -:10727000EF92FF920F931F93CF93DF9300005698E6 -:107280005E9A1092C50088E08093C40088E18093E4 -:10729000C10086E08093C200259A579A5F9A21E048 -:1072A00040E050E0CA010197F1F72F5F2131D1F79B -:1072B00080E1809309025F9883E00E941C398091ED -:1072C000C00085FFFCCF83E58093C6008091C0009D -:1072D00085FFFCCF85E48093C6008091C00085FFC8 -:1072E000FCCF84E58093C6008091C00085FFFCCF71 -:1072F00080E28093C6008091C00085FFFCCF82E4CD -:107300008093C6008091C00085FFFCCF84E5809308 -:10731000C6008091C00085FFFCCF80E28093C6004C -:107320008091C00085FFFCCF80E58093C6008091EE -:10733000C00085FFFCCF81E48093C6008091C0002F -:1073400085FFFCCF87E48093C6008091C00085FF55 -:10735000FCCF85E48093C6008091C00085FFFCCF00 -:107360008DE48093C6008091C00085FFFCCF8FE440 -:107370008093C6008091C00085FFFCCF84E4809399 -:10738000C6008091C00085FFFCCF85E48093C600D5 -:107390008091C00085FFFCCF80E28093C600809181 -:1073A000C00085FFFCCF83E38093C6008091C000BE -:1073B00085FFFCCF80E28093C6008091C00085FFEE -:1073C000FCCF82E38093C6008091C00085FFFCCF94 -:1073D00080E38093C6008091C00085FFFCCF80E3EE -:1073E0008093C6008091C00085FFFCCF80E380932E -:1073F000C6008091C00085FFFCCF80E28093C6006C -:107400008091C00085FFFCCF81E38093C60080910E -:10741000C00085FFFCCF8DE08093C6008091C00046 -:1074200085FFFCCF83E58093C6008091C00085FF77 -:10743000FCCF85E48093C6008091C00085FFFCCF1F -:1074400084E58093C6008091C00085FFFCCF80E278 -:107450008093C6008091C00085FFFCCF82E48093BA -:10746000C6008091C00085FFFCCF84E58093C600F4 -:107470008091C00085FFFCCF80E28093C6008091A0 -:10748000C00085FFFCCF82E58093C6008091C000DC -:1074900085FFFCCF8FE48093C6008091C00085FFFC -:1074A000FCCF8CE48093C6008091C00085FFFCCFA8 -:1074B00085E48093C6008091C00085FFFCCF80E208 -:1074C0008093C6008091C00085FFFCCF80E380934D -:1074D000C6008091C00085FFFCCF80E28093C6008B -:1074E0008091C00085FFFCCF86E68093C600809126 -:1074F000C00085FFFCCF80E28093C6008091C00071 -:1075000085FFFCCF87E38093C6008091C00085FF94 -:10751000FCCF84E68093C6008091C00085FFFCCF3D -:1075200080E38093C6008091C00085FFFCCF80E39C -:107530008093C6008091C00085FFFCCF8DE08093D2 -:10754000C60034E1F32E2EE1E22E95E9D92E8FE02C -:10755000C82E00E1B02EAA24A39411E4912EB6E522 -:107560008B2EA2E57A2EF0E26F2EE9E45E2E73E513 -:10757000472E60E5362E0E948638803359F18133DC -:10758000C9F1803409F472C0813409F486C08234B0 -:1075900021F1853409F474C08035E1F08135D1F0F2 -:1075A0008235C1F0853509F497C0863509F486C067 -:1075B000843609F4A0C0843709F40BC1853709F477 -:1075C00075C18637C1F680E00E94EA380E9486388D -:1075D0008033A9F60E940839CECF90E08091C00098 -:1075E00087FFFCCF8091C6009F5F9431B9F70E945E -:1075F0000839C1CF0E948638803209F0BCCF809113 -:10760000C00085FFFCCFF092C6008091C00085FFCE -:10761000FCCF9092C6008091C00085FFFCCF809285 -:10762000C6008091C00085FFFCCF7092C60080919B -:10763000C00085FFFCCF6092C6008091C00085FF2E -:10764000FCCF5092C6008091C00085FFFCCF4092D5 -:10765000C6008091C00085FFFCCF3092C6008091AB -:10766000C00085FFFCCFB092C60085CF0E9486384F -:10767000863808F4AFCF0E9486380E9408397BCF45 -:1076800090E08091C00087FFFCCF8091C6009F5F93 -:107690009530B9F70E9408396ECF0E94863880383D -:1076A00031F1813809F48DC0823809F48EC08839EF -:1076B00009F089CF83E00E94EA385DCF90E08091A5 -:1076C000C00087FFFCCF8091C6009F5F9430B9F760 -:1076D00080E00E94EA387ACF0E94863880930501C4 -:1076E0000E948638809306010E94083944CF82E0C8 -:1076F0000E94EA3840CF0E948638809308020E9498 -:1077000086388093070280910B028E7F80930B0254 -:107710000E948638853429F480910B028160809321 -:107720000B028091070290910802892B89F000E0FA -:1077300010E00E948638F801E95FFE4F80830F5FFA -:107740001F4F80910702909108020817190788F3CC -:107750000E948638803209F00ECF80910B0280FFA4 -:10776000CFC0A0910702B09108021097E9F0609194 -:10777000050170910601E7E0F1E09B01AD014E0FBC -:107780005F1FF999FECF32BD21BD819180BDFA9A6C -:10779000F99A2F5F3F4FE417F50799F76A0F7B1FA0 -:1077A00070930601609305018091C00085FFFCCFB6 -:1077B000F092C6008091C00085FFFCCFB092C60059 -:1077C000DACE81E00E94EA38D6CE8FE00E94EA3815 -:1077D000D2CE0E948638809308020E948638809319 -:1077E00007020E948638853409F484C080910B0218 -:1077F0008E7F80930B028091050190910601880F86 -:10780000991F90930601809305010E94863880326B -:1078100009F0B1CE8091C00085FFFCCFF092C60088 -:10782000A0910702B09108021097B9F180910B0264 -:10783000182F1170082F0270E0910501F0910601D8 -:107840009F012F5F3F4FB90140E050E01123B1F499 -:10785000002339F494918091C00085FFFCCF909370 -:10786000C6004F5F5F4FCB010196F9014A175B07D6 -:1078700080F4BC012F5F3F4F112351F3F999FECFE4 -:10788000F2BDE1BDF89A90B58091C00085FFFCCFB4 -:10789000E6CF70930601609305018091C00085FDDD -:1078A000E2CE8091C00085FFF8CFDDCE0E94863801 -:1078B000803209F060CE8091C00085FFFCCFF0924D -:1078C000C6008091C00085FFFCCFE092C600809189 -:1078D000C00085FFFCCFD092C6008091C00085FF1C -:1078E000FCCFC092C6008091C00085FFFCCFB09253 -:1078F000C60041CE80910B02816080930B0285CF40 -:10790000809106018823880F880B8A2180930A02C0 -:107910008091050190910601880F991F90930601AF -:10792000809305018091070280FF09C080910702C2 -:107930009091080201969093080280930702F894B0 -:10794000F999FECF1127E0910501F0910601C7E0FA -:10795000D1E08091070290910802103091F40091DB -:10796000570001700130D9F303E000935700E89508 -:107970000091570001700130D9F301E100935700E5 -:10798000E895099019900091570001700130D9F3E2 -:1079900001E000935700E8951395103498F01127F3 -:1079A0000091570001700130D9F305E000935700B2 -:1079B000E8950091570001700130D9F301E100937F -:1079C0005700E8953296029709F0C7CF103011F0B2 -:1079D0000296E5CF11248091C00085FFE5CEE8CE68 -:0479E000F894FFCF49 -:0279E400800021 -:040000030000700089 -:00000001FF +:107000000C9434380C9451380C9451380C945138F9 +:107010000C9451380C9451380C9451380C945138CC +:107020000C9451380C9451380C9451380C945138BC +:107030000C9451380C9451380C9451380C945138AC +:107040000C9451380C9451380C9451380C9451389C +:107050000C9451380C9451380C9451380C9451388C +:107060000C9451380C94513811241FBECFEFD8E046 +:10707000DEBFCDBF11E0A0E0B1E0E4EEF9E702C071 +:1070800005900D92A230B107D9F712E0A2E0B1E06D +:1070900001C01D92AC30B107E1F70E942D390C946C +:1070A000F03C0C940038282F992787FD9095807F1D +:1070B00090709595879595958795959587959595D4 +:1070C00087958A30C4F0382F395A822F8F708A30D2 +:1070D0007CF0982F995A8091C00085FFFCCF3093A7 +:1070E000C6008091C00085FFFCCF9093C600089534 +:1070F000982F905DF0CF382F305DE7CF982F80919B +:10710000C00085FFFCCF9093C6000895EF92FF92D8 +:107110000F931F93EE24FF2487018091C00087FD09 +:1071200017C00894E11CF11C011D111D81E0E81637 +:1071300082E1F8068AE7080780E0180770F3E0911B +:107140000301F091040109958091C00087FFE9CF08 +:107150008091C6001F910F91FF90EF9008951F93AB +:107160000E948638182F8091C00085FFFCCF1093B5 +:10717000C6000E948638982F8091C00085FFFCCF02 +:107180009093C600113664F01755913674F490331D +:107190000CF090531295107F892F810F1F91089545 +:1071A00010339CF31053913694F397551295107F3A +:1071B000892F810F1F910895282F882351F090E087 +:1071C0008091C00087FFFCCF8091C6009F5F92171F +:1071D000B8F308951F93182F0E948638803211F05B +:1071E0001F9108958091C00085FFFCCF84E18093BA +:1071F000C6008091C00085FFFCCF1093C60080912F +:10720000C00085FFFCCF80E18093C6001F910895E8 +:107210000E948638803209F008958091C00085FF71 +:10722000FCCF84E18093C6008091C00085FFFCCF35 +:1072300080E18093C6000895882359F010920902D6 +:1072400090E02D9A2D989F5F9817D8F3909309029C +:1072500008951092090283E0F3CF3F924F925F921C +:107260006F927F928F929F92AF92BF92CF92DF9256 +:10727000EF92FF920F931F93CF93DF9300005698E6 +:107280005E9A1092C50088E08093C40088E18093E4 +:10729000C10086E08093C200259A579A5F9A21E048 +:1072A00040E050E0CA010197F1F72F5F2131D1F79B +:1072B00080E1809309025F9883E00E941C398091ED +:1072C000C00085FFFCCF83E58093C6008091C0009D +:1072D00085FFFCCF85E48093C6008091C00085FFC8 +:1072E000FCCF84E58093C6008091C00085FFFCCF71 +:1072F00080E28093C6008091C00085FFFCCF82E4CD +:107300008093C6008091C00085FFFCCF84E5809308 +:10731000C6008091C00085FFFCCF80E28093C6004C +:107320008091C00085FFFCCF80E58093C6008091EE +:10733000C00085FFFCCF81E48093C6008091C0002F +:1073400085FFFCCF87E48093C6008091C00085FF55 +:10735000FCCF85E48093C6008091C00085FFFCCF00 +:107360008DE48093C6008091C00085FFFCCF8FE440 +:107370008093C6008091C00085FFFCCF84E4809399 +:10738000C6008091C00085FFFCCF85E48093C600D5 +:107390008091C00085FFFCCF80E28093C600809181 +:1073A000C00085FFFCCF83E38093C6008091C000BE +:1073B00085FFFCCF80E28093C6008091C00085FFEE +:1073C000FCCF82E38093C6008091C00085FFFCCF94 +:1073D00080E38093C6008091C00085FFFCCF80E3EE +:1073E0008093C6008091C00085FFFCCF80E380932E +:1073F000C6008091C00085FFFCCF80E28093C6006C +:107400008091C00085FFFCCF81E38093C60080910E +:10741000C00085FFFCCF8DE08093C6008091C00046 +:1074200085FFFCCF83E58093C6008091C00085FF77 +:10743000FCCF85E48093C6008091C00085FFFCCF1F +:1074400084E58093C6008091C00085FFFCCF80E278 +:107450008093C6008091C00085FFFCCF82E48093BA +:10746000C6008091C00085FFFCCF84E58093C600F4 +:107470008091C00085FFFCCF80E28093C6008091A0 +:10748000C00085FFFCCF82E58093C6008091C000DC +:1074900085FFFCCF8FE48093C6008091C00085FFFC +:1074A000FCCF8CE48093C6008091C00085FFFCCFA8 +:1074B00085E48093C6008091C00085FFFCCF80E208 +:1074C0008093C6008091C00085FFFCCF80E380934D +:1074D000C6008091C00085FFFCCF80E28093C6008B +:1074E0008091C00085FFFCCF86E68093C600809126 +:1074F000C00085FFFCCF80E28093C6008091C00071 +:1075000085FFFCCF87E38093C6008091C00085FF94 +:10751000FCCF84E68093C6008091C00085FFFCCF3D +:1075200080E38093C6008091C00085FFFCCF80E39C +:107530008093C6008091C00085FFFCCF8DE08093D2 +:10754000C60034E1F32E2EE1E22E95E9D92E8FE02C +:10755000C82E00E1B02EAA24A39411E4912EB6E522 +:107560008B2EA2E57A2EF0E26F2EE9E45E2E73E513 +:10757000472E60E5362E0E948638803359F18133DC +:10758000C9F1803409F472C0813409F486C08234B0 +:1075900021F1853409F474C08035E1F08135D1F0F2 +:1075A0008235C1F0853509F497C0863509F486C067 +:1075B000843609F4A0C0843709F40BC1853709F477 +:1075C00075C18637C1F680E00E94EA380E9486388D +:1075D0008033A9F60E940839CECF90E08091C00098 +:1075E00087FFFCCF8091C6009F5F9431B9F70E945E +:1075F0000839C1CF0E948638803209F0BCCF809113 +:10760000C00085FFFCCFF092C6008091C00085FFCE +:10761000FCCF9092C6008091C00085FFFCCF809285 +:10762000C6008091C00085FFFCCF7092C60080919B +:10763000C00085FFFCCF6092C6008091C00085FF2E +:10764000FCCF5092C6008091C00085FFFCCF4092D5 +:10765000C6008091C00085FFFCCF3092C6008091AB +:10766000C00085FFFCCFB092C60085CF0E9486384F +:10767000863808F4AFCF0E9486380E9408397BCF45 +:1076800090E08091C00087FFFCCF8091C6009F5F93 +:107690009530B9F70E9408396ECF0E94863880383D +:1076A00031F1813809F48DC0823809F48EC08839EF +:1076B00009F089CF83E00E94EA385DCF90E08091A5 +:1076C000C00087FFFCCF8091C6009F5F9430B9F760 +:1076D00080E00E94EA387ACF0E94863880930501C4 +:1076E0000E948638809306010E94083944CF82E0C8 +:1076F0000E94EA3840CF0E948638809308020E9498 +:1077000086388093070280910B028E7F80930B0254 +:107710000E948638853429F480910B028160809321 +:107720000B028091070290910802892B89F000E0FA +:1077300010E00E948638F801E95FFE4F80830F5FFA +:107740001F4F80910702909108020817190788F3CC +:107750000E948638803209F00ECF80910B0280FFA4 +:10776000CFC0A0910702B09108021097E9F0609194 +:10777000050170910601E7E0F1E09B01AD014E0FBC +:107780005F1FF999FECF32BD21BD819180BDFA9A6C +:10779000F99A2F5F3F4FE417F50799F76A0F7B1FA0 +:1077A00070930601609305018091C00085FFFCCFB6 +:1077B000F092C6008091C00085FFFCCFB092C60059 +:1077C000DACE81E00E94EA38D6CE8FE00E94EA3815 +:1077D000D2CE0E948638809308020E948638809319 +:1077E00007020E948638853409F484C080910B0218 +:1077F0008E7F80930B028091050190910601880F86 +:10780000991F90930601809305010E94863880326B +:1078100009F0B1CE8091C00085FFFCCFF092C60088 +:10782000A0910702B09108021097B9F180910B0264 +:10783000182F1170082F0270E0910501F0910601D8 +:107840009F012F5F3F4FB90140E050E01123B1F499 +:10785000002339F494918091C00085FFFCCF909370 +:10786000C6004F5F5F4FCB010196F9014A175B07D6 +:1078700080F4BC012F5F3F4F112351F3F999FECFE4 +:10788000F2BDE1BDF89A90B58091C00085FFFCCFB4 +:10789000E6CF70930601609305018091C00085FDDD +:1078A000E2CE8091C00085FFF8CFDDCE0E94863801 +:1078B000803209F060CE8091C00085FFFCCFF0924D +:1078C000C6008091C00085FFFCCFE092C600809189 +:1078D000C00085FFFCCFD092C6008091C00085FF1C +:1078E000FCCFC092C6008091C00085FFFCCFB09253 +:1078F000C60041CE80910B02816080930B0285CF40 +:10790000809106018823880F880B8A2180930A02C0 +:107910008091050190910601880F991F90930601AF +:10792000809305018091070280FF09C080910702C2 +:107930009091080201969093080280930702F894B0 +:10794000F999FECF1127E0910501F0910601C7E0FA +:10795000D1E08091070290910802103091F40091DB +:10796000570001700130D9F303E000935700E89508 +:107970000091570001700130D9F301E100935700E5 +:10798000E895099019900091570001700130D9F3E2 +:1079900001E000935700E8951395103498F01127F3 +:1079A0000091570001700130D9F305E000935700B2 +:1079B000E8950091570001700130D9F301E100937F +:1079C0005700E8953296029709F0C7CF103011F0B2 +:1079D0000296E5CF11248091C00085FFE5CEE8CE68 +:0479E000F894FFCF49 +:0279E400800021 +:040000030000700089 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Control.hex b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Control.hex index bc13bbb44aa..ec7355b73fa 100644 --- a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Control.hex +++ b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Control.hex @@ -1,258 +1,258 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000FCC400005AC0000048 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C000005DC000004CC000004AC00000FD -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 -:1070C000FFE702C005900D92AC3AB107D9F711E085 -:1070D000ACEAB1E001C01D92A53CB107E1F74FD386 -:1070E00030C78ECFF89410926F001092810081E02B -:1070F00085BF15BE47985D9A289A0C9400000895A4 -:107100001F920F920FB60F9211242F938F939F937C -:10711000EF93FF9310928500109284008091AC0150 -:107120009091AD01009741F001979093AD0180934C -:10713000AC01892B09F45D9A8091AE019091AF0169 -:10714000009741F001979093AF018093AE01892B96 -:1071500009F4289A8091B2019091B301019690931D -:10716000B3018093B201E0E0F0E0859194918F5FEC -:107170009F4F49F08091B0019091B1010196909399 -:10718000B1018093B001FF91EF919F918F912F9169 -:107190000F900FBE0F901F90189584E08093E90028 -:1071A0000DC08091E8008B778093E80003C08EB318 -:1071B000882351F08091E80082FFF9CF8091E800A8 -:1071C00085FFEFCF8091F1000895982F83E08093A1 -:1071D000E9008091E80085FD0DC08091E8008E7780 -:1071E0008093E80003C08EB3882369F08091E800A3 -:1071F00080FFF9CF9093F1005D9884E690E0909342 -:10720000AD018093AC0108954F925F926F927F928F -:107210008F929F92AF92BF92CF92DF92EF92FF92A6 -:107220000F931F93CF93DF9384E08093E9008091C5 -:10723000E80082FF57C2289884E690E09093AF015F -:107240008093AE01AADF182F853481F48CE49DE190 -:107250009093B1018093B00107B600FCFDCFF9997E -:10726000FECF81E180935700E89503C0843519F47F -:1072700094DF8DE00DC28C34E1F38035D1F3843797 -:1072800021F484E4A2DF80E003C2813611F489E5B1 -:10729000FFC18134B1F481DF182F7FDF90E0880FC8 -:1072A000991FAA2797FDA095BA2F312F330F20E001 -:1072B000442737FD4095542F822B932BA42BB52BBD -:1072C000B8C1803711F483E5E3C1833549F4C0E0E8 -:1072D000D1E089917ADF21E0C730D207D1F7D9C157 -:1072E000863521F481E371DF80E3D2C1833731F445 -:1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD -:10730000E0E0F0E093E085E090935700E89507B661 -:1073100000FCFDCF80935700E89507B600FCFDCF39 -:10732000E058FF4FA0E7E030FA0771F7A2CF8237AD -:1073300039F4E1E0F0E089E0809357008491A8C13E -:10734000863439F4E0E0F0E089E0809357008491DE -:107350009FC18E3439F4E3E0F0E089E08093570078 -:10736000849196C1813539F4E2E0F0E089E08093C0 -:10737000570084918DC1823631F489E526DF80E0A3 -:1073800024DF80E885C1823419F0873609F0E5C032 -:107390001092B1011092B00100DF082FFEDEF82E2E -:1073A000FCDE682E8554823008F071C1902F80E099 -:1073B000CF2DD0E0C82BD92B10926F00173609F0D3 -:1073C0004BC081E180935700E895DD24CC24C39421 -:1073D0003FC0E090B501F090B6010091B701109167 -:1073E000B801B6E46B16D9F4ED2DF0E0EE29FF29D3 -:1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 -:10740000B0E0E80EF91E0A1F1B1FE092B501F092D2 -:10741000B6010093B7011093B801DC2418C0D8015D -:10742000C701B695A7959795879575D5CEDE82E06D -:1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA -:10744000B501F092B6010093B7011093B8012197EE -:10745000209709F0BECF7DC08090B5019090B60115 -:10746000A090B701B090B80196E4691609F05DC02C -:1074700083E0F40180935700E89507B600FCFDCF48 -:1074800054C0F6E46F1661F5772031F1E090B50154 -:10749000F090B6010091B7011091B8017EDED82EB0 -:1074A000CC24852D90E08C299D29F7010C01409278 -:1074B0005700E895112482E090E0A0E0B0E0E80EEB -:1074C000F91E0A1F1B1FE092B501F092B60100934E -:1074D000B7011093B80102C060DE582E742423C097 -:1074E000E090B501F090B6010091B7011091B8019C -:1074F00016950795F794E79450DE682FC70113D5CA -:107500008091B5019091B601A091B701B091B801F9 -:107510000296A11DB11D8093B5019093B601A09371 -:10752000B701B093B801219704C0552477244424AF -:107530004394209709F0A5CF96E4691641F485E0BD -:10754000F40180935700E89507B600FCFDCF8DE06D -:107550003CDE82E080936F009CC0833471F4009124 -:10756000B5011091B60119DE90E021E0F8010C019F -:1075700020935700E89511247CCE833619F5E090CE -:10758000B501F090B6010091B7011091B80105DE88 -:10759000F701E16090E021E00C0120935700E895AD -:1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E -:1075B0001B1FE092B501F092B6010093B701109342 -:1075C000B80157CE8D3661F4E091B501F091B60166 -:1075D00085E080935700E89507B600FCFDCF49CEC3 -:1075E000823551F4E091B501F091B6010591149105 -:1075F000812FEBDD802F4CC0843421F5E090B50164 -:10760000F090B6010091B7011091B8011695079559 -:10761000F794E794C2DD682FC70185D48091B50146 -:107620009091B601A091B701B091B8010296A11D49 -:10763000B11D8093B5019093B601A093B701B093AB -:10764000B80117CE843609F5E090B501F090B60187 -:107650000091B7011091B801D801C701B695A7955F -:107660009795879558D4B1DD82E090E0A0E0B0E036 -:10767000E80EF91E0A1F1B1FE092B501F092B60139 -:107680000093B7011093B80104C08B3111F08FE360 -:107690009CDD83E08093E9009091E8008091E80010 -:1076A0008E778093E80095FF04C010C08EB38823C6 -:1076B000C9F08091E80080FFF9CF8091E8008E77D3 -:1076C0008093E80003C08EB3882361F08091E800C6 -:1076D00080FFF9CF84E08093E9008091E8008B7708 -:1076E0008093E800DF91CF911F910F91FF90EF9071 -:1076F000DF90CF90BF90AF909F908F907F906F90D2 -:107700005F904F9008959091BD01892F8F778132BE -:1077100049F58091BE018032A1F0813219F5913A8C -:1077200009F58091E800877F8093E8008CE091E084 -:1077300067E070E027D28091E8008B778093E800C3 -:107740000895913279F48091E800877F8093E80072 -:107750008CE091E067E070E079D28091E8008E776C -:107760008093E800089582E061EC42E0D1D083E0AC -:1077700061E842E1CDD084E060E842E1C9C01F93F6 -:10778000209100081092000844B714BE88E10FB69B -:10779000F89480936000109260000FBE80E8E0E0F3 -:1077A000F0E00FB6F89480936100E09361000FBEA3 -:1077B00031E035BF92E095BF3F9A209A559A809369 -:1077C00061001092610047985D9A289A1092890092 -:1077D0008AEF8093880090936F0083E0809381000C -:1077E000859194918F5F9F4F11F03093B401942F46 -:1077F00041FF19C0809109012817A9F08093000862 -:10780000789480911301882339F08091B20190918E -:10781000B3018F5E9240C8F310920008F89481E0A3 -:10782000809313010CC090FF04C08091B4018823A1 -:1078300051F493FF09C080910901281729F0809124 -:10784000B401882309F04EDCD4D078941092B101B1 -:107850001092B0011EEF20C0D7DC4BD38091B00155 -:107860009091B10181549F4110F0109213018091C9 -:10787000B9019091BA0101969093BA018093B90130 -:10788000292F97FF03C0512F591B252F220F28178F -:1078900010F4479801C0479A809113018823E1F6BC -:1078A0008091E00081608093E0001CDC80E090E04B -:1078B0001F910895FA01923049F0933061F09130B0 -:1078C000F9F484E191E022E130E01EC086E291E02B -:1078D0002EE330E019C0882329F484E691E024E007 -:1078E00030E012C0813029F488E691E028E230E0EF -:1078F0000BC0823029F482E991E028E130E004C035 -:1079000080E090E020E030E091838083C901089519 -:107910008093E9008091EB0081608093EB001092EE -:10792000ED006093EC004093ED008091EE00881F25 -:107930008827881F08958091BD0188238CF403C097 -:107940008EB38823B1F08091E80082FFF9CF809157 -:10795000E8008B778093E80008958EB3882349F080 -:107960008091E80080FFF9CF8091E8008E778093C6 -:10797000E8000895EF92FF920F931F9345D04CD0EB -:1079800008ED10E0F80180818F7780838081806826 -:10799000808380818F7D808319BC1EBA1092BB01C9 -:1079A00080EEE82EF12CF70180818B7F8083F80137 -:1079B00080818160808380E060E042E0A9DFE1EEC9 -:1079C000F0E080818E7F8083E2EEF0E08081816054 -:1079D0008083808188608083F70180818E7F8083AF -:1079E000F8018081806180831F910F91FF90EF905B -:1079F0000895E7EDF0E08081816080838AE482BFB2 -:107A000081E08093BC01B6CFE8EDF0E080818E7F0D -:107A100080831092E20008951092DA001092E10043 -:107A200008951F920F920FB60F9211242F933F9338 -:107A30004F935F936F937F938F939F93AF93BF9376 -:107A4000EF93FF938091DA0080FF1BC08091D800F4 -:107A500080FF17C08091DA008E7F8093DA008091DA -:107A6000D90080FF0BC080E189BD82E189BD09B4E6 -:107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 -:107A800037D28091E10080FF17C08091E20080FF33 -:107A900013C08091E2008E7F8093E2008091E2002B -:107AA00080618093E2008091D80080628093D8004A -:107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 -:107AC0008091E20084FF28C080E189BD82E189BD08 -:107AD00009B400FEFDCF8091D8008F7D8093D8003F -:107AE0008091E1008F7E8093E1008091E2008F7EA3 -:107AF0008093E2008091E20081608093E2008091B7 -:107B0000BB01882331F48091E30087FD02C081E04E -:107B100001C084E08EBBECD18091E10083FF21C0E5 -:107B20008091E20083FF1DC08091E100877F8093F8 -:107B3000E10082E08EBB1092BB018091E1008E7F5C -:107B40008093E1008091E2008E7F8093E20080913B -:107B5000E20080618093E20080E060E042E0D8DEF5 -:107B6000C7D1FF91EF91BF91AF919F918F917F917D -:107B70006F915F914F913F912F910F900FBE0F909A -:107B80001F9018959C014091C3015091C401461764 -:107B9000570718F4F90190E044C06115710511F020 -:107BA000AB01F8CF8091E8008E778093E80040E049 -:107BB00050E0F0CF8EB3882309F444C0853009F437 -:107BC00043C08091E80083FF02C081E00895809166 -:107BD000E80082FD31C08091E80080FF22C08091E2 -:107BE000F3009091F200782F60E0292F30E0262BEF -:107BF000372B07C081918093F100415050402F5F97 -:107C00003F4F4115510519F02830310598F390E0A8 -:107C10002830310509F491E08091E8008E77809357 -:107C2000E8004115510531F6992321F605C08EB3C0 -:107C3000882341F0853041F08091E80082FFF7CF42 -:107C400080E0089582E0089583E008959C01611525 -:107C5000710529F48091E8008B778093E800F901A1 -:107C600026C08EB3882391F1853091F18091E80090 -:107C700083FF02C081E008958091E80082FFF1CF88 -:107C800006C08091F10081936150704059F02091BD -:107C9000F3008091F200322F20E090E0822B932BB2 -:107CA000892B79F78091E8008B778093E800611544 -:107CB0007105B9F605C08EB3882341F0853041F0D7 -:107CC0008091E80080FFF7CF80E0089582E008957A -:107CD00083E008950F931F93DF93CF9300D0CDB728 -:107CE000DEB7EDEBF1E08091F100819381E0E53CBE -:107CF000F807C9F708DD8091E80083FFE4C08091B0 -:107D0000BD019091BE01953009F46DC0963040F4EC -:107D1000913081F1913070F0933009F0D4C02AC0D5 -:107D2000983009F4A3C0993009F4B2C0963009F034 -:107D3000CAC07CC0803809F4C6C0823809F0C3C00C -:107D40008091C10187708093E9008091EB001092CF -:107D5000E9002091E800277F2093E80090E025E0EB -:107D6000969587952A95E1F781708093F10010929E -:107D7000F10087C0882319F0823009F0A4C08F7108 -:107D8000823009F0A0C08091BF01882331F5209195 -:107D9000C101277009F497C02093E9008091EB009E -:107DA00080FF1BC0933021F48091EB00806213C0F0 -:107DB0008091EB0080618093EB0081E090E002C055 -:107DC000880F991F2A95E2F78093EA001092EA0043 -:107DD0008091EB0088608093EB001092E900809125 -:107DE000E800877F51C0882309F06DC01091BF0162 -:107DF0001F770FB7F8948091E800877F8093E800A1 -:107E00009ADD8091E80080FFFCCF8091E3008078CC -:107E1000812B8093E30080688093E300112311F4A9 -:107E200082E001C083E08EBB0FBF4DC0805882301E -:107E300008F049C08091BF019091C0016091C101DB -:107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 -:107E50008091E800877F8093E80089819A8192DE93 -:107E60008091E8008B778093E8002DC0803859F529 -:107E70008091E800877F8093E8008091BB01809328 -:107E8000F1008091E8008E778093E80054DD1BC0FC -:107E90008823C9F49091BF019230A8F48091E80042 -:107EA000877F8093E8009093BB0145DD8091BB0103 -:107EB000882331F48091E30087FD02C081E001C096 -:107EC00084E08EBB50DC8091E80083FF0AC0809183 -:107ED000EB0080628093EB008091E800877F8093C5 -:107EE000E8000F900F90CF91DF911F910F910895AF -:107EF00008951F938EB3882361F01091E9001092CA -:107F0000E9008091E80083FF01C0E4DE1770109360 -:107F1000E9001F910895F999FECF92BD81BDF89AAD -:107F2000992780B50895262FF999FECF1FBA92BDE3 -:107F300081BD20BD0FB6F894FA9AF99A0FBE01964A -:067F40000895F894FFCF44 -:107F46004341544552494E41007700080000000065 -:107F56000000080112011001020000084123390047 -:107F660001000201000109023E00020100803209FF -:107F7600040000010202010005240010010424028D -:107F8600040524060001070582030800FF09040111 -:107F960000020A000000070504021000010705831D -:107FA6000210000104030904280352006F00620056 -:107FB6006F00740020004D006F0074006F007200A7 -:107FC600200042006F006100720064002000200063 -:107FD60000001803410072006400750069006E001D -:0C7FE6006F0020004C004C004300000025 -:040000030000700089 -:00000001FF +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000FCC400005AC0000048 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C000005DC000004CC000004AC00000FD +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 +:1070C000FFE702C005900D92AC3AB107D9F711E085 +:1070D000ACEAB1E001C01D92A53CB107E1F74FD386 +:1070E00030C78ECFF89410926F001092810081E02B +:1070F00085BF15BE47985D9A289A0C9400000895A4 +:107100001F920F920FB60F9211242F938F939F937C +:10711000EF93FF9310928500109284008091AC0150 +:107120009091AD01009741F001979093AD0180934C +:10713000AC01892B09F45D9A8091AE019091AF0169 +:10714000009741F001979093AF018093AE01892B96 +:1071500009F4289A8091B2019091B301019690931D +:10716000B3018093B201E0E0F0E0859194918F5FEC +:107170009F4F49F08091B0019091B1010196909399 +:10718000B1018093B001FF91EF919F918F912F9169 +:107190000F900FBE0F901F90189584E08093E90028 +:1071A0000DC08091E8008B778093E80003C08EB318 +:1071B000882351F08091E80082FFF9CF8091E800A8 +:1071C00085FFEFCF8091F1000895982F83E08093A1 +:1071D000E9008091E80085FD0DC08091E8008E7780 +:1071E0008093E80003C08EB3882369F08091E800A3 +:1071F00080FFF9CF9093F1005D9884E690E0909342 +:10720000AD018093AC0108954F925F926F927F928F +:107210008F929F92AF92BF92CF92DF92EF92FF92A6 +:107220000F931F93CF93DF9384E08093E9008091C5 +:10723000E80082FF57C2289884E690E09093AF015F +:107240008093AE01AADF182F853481F48CE49DE190 +:107250009093B1018093B00107B600FCFDCFF9997E +:10726000FECF81E180935700E89503C0843519F47F +:1072700094DF8DE00DC28C34E1F38035D1F3843797 +:1072800021F484E4A2DF80E003C2813611F489E5B1 +:10729000FFC18134B1F481DF182F7FDF90E0880FC8 +:1072A000991FAA2797FDA095BA2F312F330F20E001 +:1072B000442737FD4095542F822B932BA42BB52BBD +:1072C000B8C1803711F483E5E3C1833549F4C0E0E8 +:1072D000D1E089917ADF21E0C730D207D1F7D9C157 +:1072E000863521F481E371DF80E3D2C1833731F445 +:1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD +:10730000E0E0F0E093E085E090935700E89507B661 +:1073100000FCFDCF80935700E89507B600FCFDCF39 +:10732000E058FF4FA0E7E030FA0771F7A2CF8237AD +:1073300039F4E1E0F0E089E0809357008491A8C13E +:10734000863439F4E0E0F0E089E0809357008491DE +:107350009FC18E3439F4E3E0F0E089E08093570078 +:10736000849196C1813539F4E2E0F0E089E08093C0 +:10737000570084918DC1823631F489E526DF80E0A3 +:1073800024DF80E885C1823419F0873609F0E5C032 +:107390001092B1011092B00100DF082FFEDEF82E2E +:1073A000FCDE682E8554823008F071C1902F80E099 +:1073B000CF2DD0E0C82BD92B10926F00173609F0D3 +:1073C0004BC081E180935700E895DD24CC24C39421 +:1073D0003FC0E090B501F090B6010091B701109167 +:1073E000B801B6E46B16D9F4ED2DF0E0EE29FF29D3 +:1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 +:10740000B0E0E80EF91E0A1F1B1FE092B501F092D2 +:10741000B6010093B7011093B801DC2418C0D8015D +:10742000C701B695A7959795879575D5CEDE82E06D +:1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA +:10744000B501F092B6010093B7011093B8012197EE +:10745000209709F0BECF7DC08090B5019090B60115 +:10746000A090B701B090B80196E4691609F05DC02C +:1074700083E0F40180935700E89507B600FCFDCF48 +:1074800054C0F6E46F1661F5772031F1E090B50154 +:10749000F090B6010091B7011091B8017EDED82EB0 +:1074A000CC24852D90E08C299D29F7010C01409278 +:1074B0005700E895112482E090E0A0E0B0E0E80EEB +:1074C000F91E0A1F1B1FE092B501F092B60100934E +:1074D000B7011093B80102C060DE582E742423C097 +:1074E000E090B501F090B6010091B7011091B8019C +:1074F00016950795F794E79450DE682FC70113D5CA +:107500008091B5019091B601A091B701B091B801F9 +:107510000296A11DB11D8093B5019093B601A09371 +:10752000B701B093B801219704C0552477244424AF +:107530004394209709F0A5CF96E4691641F485E0BD +:10754000F40180935700E89507B600FCFDCF8DE06D +:107550003CDE82E080936F009CC0833471F4009124 +:10756000B5011091B60119DE90E021E0F8010C019F +:1075700020935700E89511247CCE833619F5E090CE +:10758000B501F090B6010091B7011091B80105DE88 +:10759000F701E16090E021E00C0120935700E895AD +:1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E +:1075B0001B1FE092B501F092B6010093B701109342 +:1075C000B80157CE8D3661F4E091B501F091B60166 +:1075D00085E080935700E89507B600FCFDCF49CEC3 +:1075E000823551F4E091B501F091B6010591149105 +:1075F000812FEBDD802F4CC0843421F5E090B50164 +:10760000F090B6010091B7011091B8011695079559 +:10761000F794E794C2DD682FC70185D48091B50146 +:107620009091B601A091B701B091B8010296A11D49 +:10763000B11D8093B5019093B601A093B701B093AB +:10764000B80117CE843609F5E090B501F090B60187 +:107650000091B7011091B801D801C701B695A7955F +:107660009795879558D4B1DD82E090E0A0E0B0E036 +:10767000E80EF91E0A1F1B1FE092B501F092B60139 +:107680000093B7011093B80104C08B3111F08FE360 +:107690009CDD83E08093E9009091E8008091E80010 +:1076A0008E778093E80095FF04C010C08EB38823C6 +:1076B000C9F08091E80080FFF9CF8091E8008E77D3 +:1076C0008093E80003C08EB3882361F08091E800C6 +:1076D00080FFF9CF84E08093E9008091E8008B7708 +:1076E0008093E800DF91CF911F910F91FF90EF9071 +:1076F000DF90CF90BF90AF909F908F907F906F90D2 +:107700005F904F9008959091BD01892F8F778132BE +:1077100049F58091BE018032A1F0813219F5913A8C +:1077200009F58091E800877F8093E8008CE091E084 +:1077300067E070E027D28091E8008B778093E800C3 +:107740000895913279F48091E800877F8093E80072 +:107750008CE091E067E070E079D28091E8008E776C +:107760008093E800089582E061EC42E0D1D083E0AC +:1077700061E842E1CDD084E060E842E1C9C01F93F6 +:10778000209100081092000844B714BE88E10FB69B +:10779000F89480936000109260000FBE80E8E0E0F3 +:1077A000F0E00FB6F89480936100E09361000FBEA3 +:1077B00031E035BF92E095BF3F9A209A559A809369 +:1077C00061001092610047985D9A289A1092890092 +:1077D0008AEF8093880090936F0083E0809381000C +:1077E000859194918F5F9F4F11F03093B401942F46 +:1077F00041FF19C0809109012817A9F08093000862 +:10780000789480911301882339F08091B20190918E +:10781000B3018F5E9240C8F310920008F89481E0A3 +:10782000809313010CC090FF04C08091B4018823A1 +:1078300051F493FF09C080910901281729F0809124 +:10784000B401882309F04EDCD4D078941092B101B1 +:107850001092B0011EEF20C0D7DC4BD38091B00155 +:107860009091B10181549F4110F0109213018091C9 +:10787000B9019091BA0101969093BA018093B90130 +:10788000292F97FF03C0512F591B252F220F28178F +:1078900010F4479801C0479A809113018823E1F6BC +:1078A0008091E00081608093E0001CDC80E090E04B +:1078B0001F910895FA01923049F0933061F09130B0 +:1078C000F9F484E191E022E130E01EC086E291E02B +:1078D0002EE330E019C0882329F484E691E024E007 +:1078E00030E012C0813029F488E691E028E230E0EF +:1078F0000BC0823029F482E991E028E130E004C035 +:1079000080E090E020E030E091838083C901089519 +:107910008093E9008091EB0081608093EB001092EE +:10792000ED006093EC004093ED008091EE00881F25 +:107930008827881F08958091BD0188238CF403C097 +:107940008EB38823B1F08091E80082FFF9CF809157 +:10795000E8008B778093E80008958EB3882349F080 +:107960008091E80080FFF9CF8091E8008E778093C6 +:10797000E8000895EF92FF920F931F9345D04CD0EB +:1079800008ED10E0F80180818F7780838081806826 +:10799000808380818F7D808319BC1EBA1092BB01C9 +:1079A00080EEE82EF12CF70180818B7F8083F80137 +:1079B00080818160808380E060E042E0A9DFE1EEC9 +:1079C000F0E080818E7F8083E2EEF0E08081816054 +:1079D0008083808188608083F70180818E7F8083AF +:1079E000F8018081806180831F910F91FF90EF905B +:1079F0000895E7EDF0E08081816080838AE482BFB2 +:107A000081E08093BC01B6CFE8EDF0E080818E7F0D +:107A100080831092E20008951092DA001092E10043 +:107A200008951F920F920FB60F9211242F933F9338 +:107A30004F935F936F937F938F939F93AF93BF9376 +:107A4000EF93FF938091DA0080FF1BC08091D800F4 +:107A500080FF17C08091DA008E7F8093DA008091DA +:107A6000D90080FF0BC080E189BD82E189BD09B4E6 +:107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 +:107A800037D28091E10080FF17C08091E20080FF33 +:107A900013C08091E2008E7F8093E2008091E2002B +:107AA00080618093E2008091D80080628093D8004A +:107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 +:107AC0008091E20084FF28C080E189BD82E189BD08 +:107AD00009B400FEFDCF8091D8008F7D8093D8003F +:107AE0008091E1008F7E8093E1008091E2008F7EA3 +:107AF0008093E2008091E20081608093E2008091B7 +:107B0000BB01882331F48091E30087FD02C081E04E +:107B100001C084E08EBBECD18091E10083FF21C0E5 +:107B20008091E20083FF1DC08091E100877F8093F8 +:107B3000E10082E08EBB1092BB018091E1008E7F5C +:107B40008093E1008091E2008E7F8093E20080913B +:107B5000E20080618093E20080E060E042E0D8DEF5 +:107B6000C7D1FF91EF91BF91AF919F918F917F917D +:107B70006F915F914F913F912F910F900FBE0F909A +:107B80001F9018959C014091C3015091C401461764 +:107B9000570718F4F90190E044C06115710511F020 +:107BA000AB01F8CF8091E8008E778093E80040E049 +:107BB00050E0F0CF8EB3882309F444C0853009F437 +:107BC00043C08091E80083FF02C081E00895809166 +:107BD000E80082FD31C08091E80080FF22C08091E2 +:107BE000F3009091F200782F60E0292F30E0262BEF +:107BF000372B07C081918093F100415050402F5F97 +:107C00003F4F4115510519F02830310598F390E0A8 +:107C10002830310509F491E08091E8008E77809357 +:107C2000E8004115510531F6992321F605C08EB3C0 +:107C3000882341F0853041F08091E80082FFF7CF42 +:107C400080E0089582E0089583E008959C01611525 +:107C5000710529F48091E8008B778093E800F901A1 +:107C600026C08EB3882391F1853091F18091E80090 +:107C700083FF02C081E008958091E80082FFF1CF88 +:107C800006C08091F10081936150704059F02091BD +:107C9000F3008091F200322F20E090E0822B932BB2 +:107CA000892B79F78091E8008B778093E800611544 +:107CB0007105B9F605C08EB3882341F0853041F0D7 +:107CC0008091E80080FFF7CF80E0089582E008957A +:107CD00083E008950F931F93DF93CF9300D0CDB728 +:107CE000DEB7EDEBF1E08091F100819381E0E53CBE +:107CF000F807C9F708DD8091E80083FFE4C08091B0 +:107D0000BD019091BE01953009F46DC0963040F4EC +:107D1000913081F1913070F0933009F0D4C02AC0D5 +:107D2000983009F4A3C0993009F4B2C0963009F034 +:107D3000CAC07CC0803809F4C6C0823809F0C3C00C +:107D40008091C10187708093E9008091EB001092CF +:107D5000E9002091E800277F2093E80090E025E0EB +:107D6000969587952A95E1F781708093F10010929E +:107D7000F10087C0882319F0823009F0A4C08F7108 +:107D8000823009F0A0C08091BF01882331F5209195 +:107D9000C101277009F497C02093E9008091EB009E +:107DA00080FF1BC0933021F48091EB00806213C0F0 +:107DB0008091EB0080618093EB0081E090E002C055 +:107DC000880F991F2A95E2F78093EA001092EA0043 +:107DD0008091EB0088608093EB001092E900809125 +:107DE000E800877F51C0882309F06DC01091BF0162 +:107DF0001F770FB7F8948091E800877F8093E800A1 +:107E00009ADD8091E80080FFFCCF8091E3008078CC +:107E1000812B8093E30080688093E300112311F4A9 +:107E200082E001C083E08EBB0FBF4DC0805882301E +:107E300008F049C08091BF019091C0016091C101DB +:107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 +:107E50008091E800877F8093E80089819A8192DE93 +:107E60008091E8008B778093E8002DC0803859F529 +:107E70008091E800877F8093E8008091BB01809328 +:107E8000F1008091E8008E778093E80054DD1BC0FC +:107E90008823C9F49091BF019230A8F48091E80042 +:107EA000877F8093E8009093BB0145DD8091BB0103 +:107EB000882331F48091E30087FD02C081E001C096 +:107EC00084E08EBB50DC8091E80083FF0AC0809183 +:107ED000EB0080628093EB008091E800877F8093C5 +:107EE000E8000F900F90CF91DF911F910F910895AF +:107EF00008951F938EB3882361F01091E9001092CA +:107F0000E9008091E80083FF01C0E4DE1770109360 +:107F1000E9001F910895F999FECF92BD81BDF89AAD +:107F2000992780B50895262FF999FECF1FBA92BDE3 +:107F300081BD20BD0FB6F894FA9AF99A0FBE01964A +:067F40000895F894FFCF44 +:107F46004341544552494E41007700080000000065 +:107F56000000080112011001020000084123390047 +:107F660001000201000109023E00020100803209FF +:107F7600040000010202010005240010010424028D +:107F8600040524060001070582030800FF09040111 +:107F960000020A000000070504021000010705831D +:107FA6000210000104030904280352006F00620056 +:107FB6006F00740020004D006F0074006F007200A7 +:107FC600200042006F006100720064002000200063 +:107FD60000001803410072006400750069006E001D +:0C7FE6006F0020004C004C004300000025 +:040000030000700089 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Motor.hex b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Motor.hex index b5560ba4006..2e6d2214733 100644 --- a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Motor.hex +++ b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Motor.hex @@ -1,258 +1,258 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000FCC400005AC0000048 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C000005DC000004CC000004AC00000FD -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 -:1070C000FFE702C005900D92AC3AB107D9F711E085 -:1070D000ACEAB1E001C01D92A53CB107E1F74FD386 -:1070E00030C78ECFF89410926F001092810081E02B -:1070F00085BF15BE47985D9A289A0C9400000895A4 -:107100001F920F920FB60F9211242F938F939F937C -:10711000EF93FF9310928500109284008091AC0150 -:107120009091AD01009741F001979093AD0180934C -:10713000AC01892B09F45D9A8091AE019091AF0169 -:10714000009741F001979093AF018093AE01892B96 -:1071500009F4289A8091B2019091B301019690931D -:10716000B3018093B201E0E0F0E0859194918F5FEC -:107170009F4F49F08091B0019091B1010196909399 -:10718000B1018093B001FF91EF919F918F912F9169 -:107190000F900FBE0F901F90189584E08093E90028 -:1071A0000DC08091E8008B778093E80003C08EB318 -:1071B000882351F08091E80082FFF9CF8091E800A8 -:1071C00085FFEFCF8091F1000895982F83E08093A1 -:1071D000E9008091E80085FD0DC08091E8008E7780 -:1071E0008093E80003C08EB3882369F08091E800A3 -:1071F00080FFF9CF9093F1005D9884E690E0909342 -:10720000AD018093AC0108954F925F926F927F928F -:107210008F929F92AF92BF92CF92DF92EF92FF92A6 -:107220000F931F93CF93DF9384E08093E9008091C5 -:10723000E80082FF57C2289884E690E09093AF015F -:107240008093AE01AADF182F853481F48CE49DE190 -:107250009093B1018093B00107B600FCFDCFF9997E -:10726000FECF81E180935700E89503C0843519F47F -:1072700094DF8DE00DC28C34E1F38035D1F3843797 -:1072800021F484E4A2DF80E003C2813611F489E5B1 -:10729000FFC18134B1F481DF182F7FDF90E0880FC8 -:1072A000991FAA2797FDA095BA2F312F330F20E001 -:1072B000442737FD4095542F822B932BA42BB52BBD -:1072C000B8C1803711F483E5E3C1833549F4C0E0E8 -:1072D000D1E089917ADF21E0C730D207D1F7D9C157 -:1072E000863521F481E371DF80E3D2C1833731F445 -:1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD -:10730000E0E0F0E093E085E090935700E89507B661 -:1073100000FCFDCF80935700E89507B600FCFDCF39 -:10732000E058FF4FA0E7E030FA0771F7A2CF8237AD -:1073300039F4E1E0F0E089E0809357008491A8C13E -:10734000863439F4E0E0F0E089E0809357008491DE -:107350009FC18E3439F4E3E0F0E089E08093570078 -:10736000849196C1813539F4E2E0F0E089E08093C0 -:10737000570084918DC1823631F489E526DF80E0A3 -:1073800024DF80E885C1823419F0873609F0E5C032 -:107390001092B1011092B00100DF082FFEDEF82E2E -:1073A000FCDE682E8554823008F071C1902F80E099 -:1073B000CF2DD0E0C82BD92B10926F00173609F0D3 -:1073C0004BC081E180935700E895DD24CC24C39421 -:1073D0003FC0E090B501F090B6010091B701109167 -:1073E000B801B6E46B16D9F4ED2DF0E0EE29FF29D3 -:1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 -:10740000B0E0E80EF91E0A1F1B1FE092B501F092D2 -:10741000B6010093B7011093B801DC2418C0D8015D -:10742000C701B695A7959795879575D5CEDE82E06D -:1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA -:10744000B501F092B6010093B7011093B8012197EE -:10745000209709F0BECF7DC08090B5019090B60115 -:10746000A090B701B090B80196E4691609F05DC02C -:1074700083E0F40180935700E89507B600FCFDCF48 -:1074800054C0F6E46F1661F5772031F1E090B50154 -:10749000F090B6010091B7011091B8017EDED82EB0 -:1074A000CC24852D90E08C299D29F7010C01409278 -:1074B0005700E895112482E090E0A0E0B0E0E80EEB -:1074C000F91E0A1F1B1FE092B501F092B60100934E -:1074D000B7011093B80102C060DE582E742423C097 -:1074E000E090B501F090B6010091B7011091B8019C -:1074F00016950795F794E79450DE682FC70113D5CA -:107500008091B5019091B601A091B701B091B801F9 -:107510000296A11DB11D8093B5019093B601A09371 -:10752000B701B093B801219704C0552477244424AF -:107530004394209709F0A5CF96E4691641F485E0BD -:10754000F40180935700E89507B600FCFDCF8DE06D -:107550003CDE82E080936F009CC0833471F4009124 -:10756000B5011091B60119DE90E021E0F8010C019F -:1075700020935700E89511247CCE833619F5E090CE -:10758000B501F090B6010091B7011091B80105DE88 -:10759000F701E16090E021E00C0120935700E895AD -:1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E -:1075B0001B1FE092B501F092B6010093B701109342 -:1075C000B80157CE8D3661F4E091B501F091B60166 -:1075D00085E080935700E89507B600FCFDCF49CEC3 -:1075E000823551F4E091B501F091B6010591149105 -:1075F000812FEBDD802F4CC0843421F5E090B50164 -:10760000F090B6010091B7011091B8011695079559 -:10761000F794E794C2DD682FC70185D48091B50146 -:107620009091B601A091B701B091B8010296A11D49 -:10763000B11D8093B5019093B601A093B701B093AB -:10764000B80117CE843609F5E090B501F090B60187 -:107650000091B7011091B801D801C701B695A7955F -:107660009795879558D4B1DD82E090E0A0E0B0E036 -:10767000E80EF91E0A1F1B1FE092B501F092B60139 -:107680000093B7011093B80104C08B3111F08FE360 -:107690009CDD83E08093E9009091E8008091E80010 -:1076A0008E778093E80095FF04C010C08EB38823C6 -:1076B000C9F08091E80080FFF9CF8091E8008E77D3 -:1076C0008093E80003C08EB3882361F08091E800C6 -:1076D00080FFF9CF84E08093E9008091E8008B7708 -:1076E0008093E800DF91CF911F910F91FF90EF9071 -:1076F000DF90CF90BF90AF909F908F907F906F90D2 -:107700005F904F9008959091BD01892F8F778132BE -:1077100049F58091BE018032A1F0813219F5913A8C -:1077200009F58091E800877F8093E8008CE091E084 -:1077300067E070E027D28091E8008B778093E800C3 -:107740000895913279F48091E800877F8093E80072 -:107750008CE091E067E070E079D28091E8008E776C -:107760008093E800089582E061EC42E0D1D083E0AC -:1077700061E842E1CDD084E060E842E1C9C01F93F6 -:10778000209100081092000844B714BE88E10FB69B -:10779000F89480936000109260000FBE80E8E0E0F3 -:1077A000F0E00FB6F89480936100E09361000FBEA3 -:1077B00031E035BF92E095BF3F9A209A559A809369 -:1077C00061001092610047985D9A289A1092890092 -:1077D0008AEF8093880090936F0083E0809381000C -:1077E000859194918F5F9F4F11F03093B401942F46 -:1077F00041FF19C0809109012817A9F08093000862 -:10780000789480911301882339F08091B20190918E -:10781000B3018F5E9240C8F310920008F89481E0A3 -:10782000809313010CC090FF04C08091B4018823A1 -:1078300051F493FF09C080910901281729F0809124 -:10784000B401882309F04EDCD4D078941092B101B1 -:107850001092B0011EEF20C0D7DC4BD38091B00155 -:107860009091B10181549F4110F0109213018091C9 -:10787000B9019091BA0101969093BA018093B90130 -:10788000292F97FF03C0512F591B252F220F28178F -:1078900010F4479801C0479A809113018823E1F6BC -:1078A0008091E00081608093E0001CDC80E090E04B -:1078B0001F910895FA01923049F0933061F09130B0 -:1078C000F9F484E191E022E130E01EC086E291E02B -:1078D0002EE330E019C0882329F484E691E024E007 -:1078E00030E012C0813029F488E691E028E230E0EF -:1078F0000BC0823029F482E991E028E130E004C035 -:1079000080E090E020E030E091838083C901089519 -:107910008093E9008091EB0081608093EB001092EE -:10792000ED006093EC004093ED008091EE00881F25 -:107930008827881F08958091BD0188238CF403C097 -:107940008EB38823B1F08091E80082FFF9CF809157 -:10795000E8008B778093E80008958EB3882349F080 -:107960008091E80080FFF9CF8091E8008E778093C6 -:10797000E8000895EF92FF920F931F9345D04CD0EB -:1079800008ED10E0F80180818F7780838081806826 -:10799000808380818F7D808319BC1EBA1092BB01C9 -:1079A00080EEE82EF12CF70180818B7F8083F80137 -:1079B00080818160808380E060E042E0A9DFE1EEC9 -:1079C000F0E080818E7F8083E2EEF0E08081816054 -:1079D0008083808188608083F70180818E7F8083AF -:1079E000F8018081806180831F910F91FF90EF905B -:1079F0000895E7EDF0E08081816080838AE482BFB2 -:107A000081E08093BC01B6CFE8EDF0E080818E7F0D -:107A100080831092E20008951092DA001092E10043 -:107A200008951F920F920FB60F9211242F933F9338 -:107A30004F935F936F937F938F939F93AF93BF9376 -:107A4000EF93FF938091DA0080FF1BC08091D800F4 -:107A500080FF17C08091DA008E7F8093DA008091DA -:107A6000D90080FF0BC080E189BD82E189BD09B4E6 -:107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 -:107A800037D28091E10080FF17C08091E20080FF33 -:107A900013C08091E2008E7F8093E2008091E2002B -:107AA00080618093E2008091D80080628093D8004A -:107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 -:107AC0008091E20084FF28C080E189BD82E189BD08 -:107AD00009B400FEFDCF8091D8008F7D8093D8003F -:107AE0008091E1008F7E8093E1008091E2008F7EA3 -:107AF0008093E2008091E20081608093E2008091B7 -:107B0000BB01882331F48091E30087FD02C081E04E -:107B100001C084E08EBBECD18091E10083FF21C0E5 -:107B20008091E20083FF1DC08091E100877F8093F8 -:107B3000E10082E08EBB1092BB018091E1008E7F5C -:107B40008093E1008091E2008E7F8093E20080913B -:107B5000E20080618093E20080E060E042E0D8DEF5 -:107B6000C7D1FF91EF91BF91AF919F918F917F917D -:107B70006F915F914F913F912F910F900FBE0F909A -:107B80001F9018959C014091C3015091C401461764 -:107B9000570718F4F90190E044C06115710511F020 -:107BA000AB01F8CF8091E8008E778093E80040E049 -:107BB00050E0F0CF8EB3882309F444C0853009F437 -:107BC00043C08091E80083FF02C081E00895809166 -:107BD000E80082FD31C08091E80080FF22C08091E2 -:107BE000F3009091F200782F60E0292F30E0262BEF -:107BF000372B07C081918093F100415050402F5F97 -:107C00003F4F4115510519F02830310598F390E0A8 -:107C10002830310509F491E08091E8008E77809357 -:107C2000E8004115510531F6992321F605C08EB3C0 -:107C3000882341F0853041F08091E80082FFF7CF42 -:107C400080E0089582E0089583E008959C01611525 -:107C5000710529F48091E8008B778093E800F901A1 -:107C600026C08EB3882391F1853091F18091E80090 -:107C700083FF02C081E008958091E80082FFF1CF88 -:107C800006C08091F10081936150704059F02091BD -:107C9000F3008091F200322F20E090E0822B932BB2 -:107CA000892B79F78091E8008B778093E800611544 -:107CB0007105B9F605C08EB3882341F0853041F0D7 -:107CC0008091E80080FFF7CF80E0089582E008957A -:107CD00083E008950F931F93DF93CF9300D0CDB728 -:107CE000DEB7EDEBF1E08091F100819381E0E53CBE -:107CF000F807C9F708DD8091E80083FFE4C08091B0 -:107D0000BD019091BE01953009F46DC0963040F4EC -:107D1000913081F1913070F0933009F0D4C02AC0D5 -:107D2000983009F4A3C0993009F4B2C0963009F034 -:107D3000CAC07CC0803809F4C6C0823809F0C3C00C -:107D40008091C10187708093E9008091EB001092CF -:107D5000E9002091E800277F2093E80090E025E0EB -:107D6000969587952A95E1F781708093F10010929E -:107D7000F10087C0882319F0823009F0A4C08F7108 -:107D8000823009F0A0C08091BF01882331F5209195 -:107D9000C101277009F497C02093E9008091EB009E -:107DA00080FF1BC0933021F48091EB00806213C0F0 -:107DB0008091EB0080618093EB0081E090E002C055 -:107DC000880F991F2A95E2F78093EA001092EA0043 -:107DD0008091EB0088608093EB001092E900809125 -:107DE000E800877F51C0882309F06DC01091BF0162 -:107DF0001F770FB7F8948091E800877F8093E800A1 -:107E00009ADD8091E80080FFFCCF8091E3008078CC -:107E1000812B8093E30080688093E300112311F4A9 -:107E200082E001C083E08EBB0FBF4DC0805882301E -:107E300008F049C08091BF019091C0016091C101DB -:107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 -:107E50008091E800877F8093E80089819A8192DE93 -:107E60008091E8008B778093E8002DC0803859F529 -:107E70008091E800877F8093E8008091BB01809328 -:107E8000F1008091E8008E778093E80054DD1BC0FC -:107E90008823C9F49091BF019230A8F48091E80042 -:107EA000877F8093E8009093BB0145DD8091BB0103 -:107EB000882331F48091E30087FD02C081E001C096 -:107EC00084E08EBB50DC8091E80083FF0AC0809183 -:107ED000EB0080628093EB008091E800877F8093C5 -:107EE000E8000F900F90CF91DF911F910F910895AF -:107EF00008951F938EB3882361F01091E9001092CA -:107F0000E9008091E80083FF01C0E4DE1770109360 -:107F1000E9001F910895F999FECF92BD81BDF89AAD -:107F2000992780B50895262FF999FECF1FBA92BDE3 -:107F300081BD20BD0FB6F894FA9AF99A0FBE01964A -:067F40000895F894FFCF44 -:107F46004341544552494E41007700080000000065 -:107F56000000080112011001020000084123380048 -:107F660001000201000109023E00020100803209FF -:107F7600040000010202010005240010010424028D -:107F8600040524060001070582030800FF09040111 -:107F960000020A000000070504021000010705831D -:107FA6000210000104030904280352006F00620056 -:107FB6006F007400200043006F006E0074007200B2 -:107FC6006F006C00200042006F00610072006400C8 -:107FD60000001803410072006400750069006E001D -:0C7FE6006F0020004C004C004300000025 -:040000030000700089 -:00000001FF +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000FCC400005AC0000048 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C000005DC000004CC000004AC00000FD +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 +:1070C000FFE702C005900D92AC3AB107D9F711E085 +:1070D000ACEAB1E001C01D92A53CB107E1F74FD386 +:1070E00030C78ECFF89410926F001092810081E02B +:1070F00085BF15BE47985D9A289A0C9400000895A4 +:107100001F920F920FB60F9211242F938F939F937C +:10711000EF93FF9310928500109284008091AC0150 +:107120009091AD01009741F001979093AD0180934C +:10713000AC01892B09F45D9A8091AE019091AF0169 +:10714000009741F001979093AF018093AE01892B96 +:1071500009F4289A8091B2019091B301019690931D +:10716000B3018093B201E0E0F0E0859194918F5FEC +:107170009F4F49F08091B0019091B1010196909399 +:10718000B1018093B001FF91EF919F918F912F9169 +:107190000F900FBE0F901F90189584E08093E90028 +:1071A0000DC08091E8008B778093E80003C08EB318 +:1071B000882351F08091E80082FFF9CF8091E800A8 +:1071C00085FFEFCF8091F1000895982F83E08093A1 +:1071D000E9008091E80085FD0DC08091E8008E7780 +:1071E0008093E80003C08EB3882369F08091E800A3 +:1071F00080FFF9CF9093F1005D9884E690E0909342 +:10720000AD018093AC0108954F925F926F927F928F +:107210008F929F92AF92BF92CF92DF92EF92FF92A6 +:107220000F931F93CF93DF9384E08093E9008091C5 +:10723000E80082FF57C2289884E690E09093AF015F +:107240008093AE01AADF182F853481F48CE49DE190 +:107250009093B1018093B00107B600FCFDCFF9997E +:10726000FECF81E180935700E89503C0843519F47F +:1072700094DF8DE00DC28C34E1F38035D1F3843797 +:1072800021F484E4A2DF80E003C2813611F489E5B1 +:10729000FFC18134B1F481DF182F7FDF90E0880FC8 +:1072A000991FAA2797FDA095BA2F312F330F20E001 +:1072B000442737FD4095542F822B932BA42BB52BBD +:1072C000B8C1803711F483E5E3C1833549F4C0E0E8 +:1072D000D1E089917ADF21E0C730D207D1F7D9C157 +:1072E000863521F481E371DF80E3D2C1833731F445 +:1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD +:10730000E0E0F0E093E085E090935700E89507B661 +:1073100000FCFDCF80935700E89507B600FCFDCF39 +:10732000E058FF4FA0E7E030FA0771F7A2CF8237AD +:1073300039F4E1E0F0E089E0809357008491A8C13E +:10734000863439F4E0E0F0E089E0809357008491DE +:107350009FC18E3439F4E3E0F0E089E08093570078 +:10736000849196C1813539F4E2E0F0E089E08093C0 +:10737000570084918DC1823631F489E526DF80E0A3 +:1073800024DF80E885C1823419F0873609F0E5C032 +:107390001092B1011092B00100DF082FFEDEF82E2E +:1073A000FCDE682E8554823008F071C1902F80E099 +:1073B000CF2DD0E0C82BD92B10926F00173609F0D3 +:1073C0004BC081E180935700E895DD24CC24C39421 +:1073D0003FC0E090B501F090B6010091B701109167 +:1073E000B801B6E46B16D9F4ED2DF0E0EE29FF29D3 +:1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 +:10740000B0E0E80EF91E0A1F1B1FE092B501F092D2 +:10741000B6010093B7011093B801DC2418C0D8015D +:10742000C701B695A7959795879575D5CEDE82E06D +:1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA +:10744000B501F092B6010093B7011093B8012197EE +:10745000209709F0BECF7DC08090B5019090B60115 +:10746000A090B701B090B80196E4691609F05DC02C +:1074700083E0F40180935700E89507B600FCFDCF48 +:1074800054C0F6E46F1661F5772031F1E090B50154 +:10749000F090B6010091B7011091B8017EDED82EB0 +:1074A000CC24852D90E08C299D29F7010C01409278 +:1074B0005700E895112482E090E0A0E0B0E0E80EEB +:1074C000F91E0A1F1B1FE092B501F092B60100934E +:1074D000B7011093B80102C060DE582E742423C097 +:1074E000E090B501F090B6010091B7011091B8019C +:1074F00016950795F794E79450DE682FC70113D5CA +:107500008091B5019091B601A091B701B091B801F9 +:107510000296A11DB11D8093B5019093B601A09371 +:10752000B701B093B801219704C0552477244424AF +:107530004394209709F0A5CF96E4691641F485E0BD +:10754000F40180935700E89507B600FCFDCF8DE06D +:107550003CDE82E080936F009CC0833471F4009124 +:10756000B5011091B60119DE90E021E0F8010C019F +:1075700020935700E89511247CCE833619F5E090CE +:10758000B501F090B6010091B7011091B80105DE88 +:10759000F701E16090E021E00C0120935700E895AD +:1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E +:1075B0001B1FE092B501F092B6010093B701109342 +:1075C000B80157CE8D3661F4E091B501F091B60166 +:1075D00085E080935700E89507B600FCFDCF49CEC3 +:1075E000823551F4E091B501F091B6010591149105 +:1075F000812FEBDD802F4CC0843421F5E090B50164 +:10760000F090B6010091B7011091B8011695079559 +:10761000F794E794C2DD682FC70185D48091B50146 +:107620009091B601A091B701B091B8010296A11D49 +:10763000B11D8093B5019093B601A093B701B093AB +:10764000B80117CE843609F5E090B501F090B60187 +:107650000091B7011091B801D801C701B695A7955F +:107660009795879558D4B1DD82E090E0A0E0B0E036 +:10767000E80EF91E0A1F1B1FE092B501F092B60139 +:107680000093B7011093B80104C08B3111F08FE360 +:107690009CDD83E08093E9009091E8008091E80010 +:1076A0008E778093E80095FF04C010C08EB38823C6 +:1076B000C9F08091E80080FFF9CF8091E8008E77D3 +:1076C0008093E80003C08EB3882361F08091E800C6 +:1076D00080FFF9CF84E08093E9008091E8008B7708 +:1076E0008093E800DF91CF911F910F91FF90EF9071 +:1076F000DF90CF90BF90AF909F908F907F906F90D2 +:107700005F904F9008959091BD01892F8F778132BE +:1077100049F58091BE018032A1F0813219F5913A8C +:1077200009F58091E800877F8093E8008CE091E084 +:1077300067E070E027D28091E8008B778093E800C3 +:107740000895913279F48091E800877F8093E80072 +:107750008CE091E067E070E079D28091E8008E776C +:107760008093E800089582E061EC42E0D1D083E0AC +:1077700061E842E1CDD084E060E842E1C9C01F93F6 +:10778000209100081092000844B714BE88E10FB69B +:10779000F89480936000109260000FBE80E8E0E0F3 +:1077A000F0E00FB6F89480936100E09361000FBEA3 +:1077B00031E035BF92E095BF3F9A209A559A809369 +:1077C00061001092610047985D9A289A1092890092 +:1077D0008AEF8093880090936F0083E0809381000C +:1077E000859194918F5F9F4F11F03093B401942F46 +:1077F00041FF19C0809109012817A9F08093000862 +:10780000789480911301882339F08091B20190918E +:10781000B3018F5E9240C8F310920008F89481E0A3 +:10782000809313010CC090FF04C08091B4018823A1 +:1078300051F493FF09C080910901281729F0809124 +:10784000B401882309F04EDCD4D078941092B101B1 +:107850001092B0011EEF20C0D7DC4BD38091B00155 +:107860009091B10181549F4110F0109213018091C9 +:10787000B9019091BA0101969093BA018093B90130 +:10788000292F97FF03C0512F591B252F220F28178F +:1078900010F4479801C0479A809113018823E1F6BC +:1078A0008091E00081608093E0001CDC80E090E04B +:1078B0001F910895FA01923049F0933061F09130B0 +:1078C000F9F484E191E022E130E01EC086E291E02B +:1078D0002EE330E019C0882329F484E691E024E007 +:1078E00030E012C0813029F488E691E028E230E0EF +:1078F0000BC0823029F482E991E028E130E004C035 +:1079000080E090E020E030E091838083C901089519 +:107910008093E9008091EB0081608093EB001092EE +:10792000ED006093EC004093ED008091EE00881F25 +:107930008827881F08958091BD0188238CF403C097 +:107940008EB38823B1F08091E80082FFF9CF809157 +:10795000E8008B778093E80008958EB3882349F080 +:107960008091E80080FFF9CF8091E8008E778093C6 +:10797000E8000895EF92FF920F931F9345D04CD0EB +:1079800008ED10E0F80180818F7780838081806826 +:10799000808380818F7D808319BC1EBA1092BB01C9 +:1079A00080EEE82EF12CF70180818B7F8083F80137 +:1079B00080818160808380E060E042E0A9DFE1EEC9 +:1079C000F0E080818E7F8083E2EEF0E08081816054 +:1079D0008083808188608083F70180818E7F8083AF +:1079E000F8018081806180831F910F91FF90EF905B +:1079F0000895E7EDF0E08081816080838AE482BFB2 +:107A000081E08093BC01B6CFE8EDF0E080818E7F0D +:107A100080831092E20008951092DA001092E10043 +:107A200008951F920F920FB60F9211242F933F9338 +:107A30004F935F936F937F938F939F93AF93BF9376 +:107A4000EF93FF938091DA0080FF1BC08091D800F4 +:107A500080FF17C08091DA008E7F8093DA008091DA +:107A6000D90080FF0BC080E189BD82E189BD09B4E6 +:107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 +:107A800037D28091E10080FF17C08091E20080FF33 +:107A900013C08091E2008E7F8093E2008091E2002B +:107AA00080618093E2008091D80080628093D8004A +:107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 +:107AC0008091E20084FF28C080E189BD82E189BD08 +:107AD00009B400FEFDCF8091D8008F7D8093D8003F +:107AE0008091E1008F7E8093E1008091E2008F7EA3 +:107AF0008093E2008091E20081608093E2008091B7 +:107B0000BB01882331F48091E30087FD02C081E04E +:107B100001C084E08EBBECD18091E10083FF21C0E5 +:107B20008091E20083FF1DC08091E100877F8093F8 +:107B3000E10082E08EBB1092BB018091E1008E7F5C +:107B40008093E1008091E2008E7F8093E20080913B +:107B5000E20080618093E20080E060E042E0D8DEF5 +:107B6000C7D1FF91EF91BF91AF919F918F917F917D +:107B70006F915F914F913F912F910F900FBE0F909A +:107B80001F9018959C014091C3015091C401461764 +:107B9000570718F4F90190E044C06115710511F020 +:107BA000AB01F8CF8091E8008E778093E80040E049 +:107BB00050E0F0CF8EB3882309F444C0853009F437 +:107BC00043C08091E80083FF02C081E00895809166 +:107BD000E80082FD31C08091E80080FF22C08091E2 +:107BE000F3009091F200782F60E0292F30E0262BEF +:107BF000372B07C081918093F100415050402F5F97 +:107C00003F4F4115510519F02830310598F390E0A8 +:107C10002830310509F491E08091E8008E77809357 +:107C2000E8004115510531F6992321F605C08EB3C0 +:107C3000882341F0853041F08091E80082FFF7CF42 +:107C400080E0089582E0089583E008959C01611525 +:107C5000710529F48091E8008B778093E800F901A1 +:107C600026C08EB3882391F1853091F18091E80090 +:107C700083FF02C081E008958091E80082FFF1CF88 +:107C800006C08091F10081936150704059F02091BD +:107C9000F3008091F200322F20E090E0822B932BB2 +:107CA000892B79F78091E8008B778093E800611544 +:107CB0007105B9F605C08EB3882341F0853041F0D7 +:107CC0008091E80080FFF7CF80E0089582E008957A +:107CD00083E008950F931F93DF93CF9300D0CDB728 +:107CE000DEB7EDEBF1E08091F100819381E0E53CBE +:107CF000F807C9F708DD8091E80083FFE4C08091B0 +:107D0000BD019091BE01953009F46DC0963040F4EC +:107D1000913081F1913070F0933009F0D4C02AC0D5 +:107D2000983009F4A3C0993009F4B2C0963009F034 +:107D3000CAC07CC0803809F4C6C0823809F0C3C00C +:107D40008091C10187708093E9008091EB001092CF +:107D5000E9002091E800277F2093E80090E025E0EB +:107D6000969587952A95E1F781708093F10010929E +:107D7000F10087C0882319F0823009F0A4C08F7108 +:107D8000823009F0A0C08091BF01882331F5209195 +:107D9000C101277009F497C02093E9008091EB009E +:107DA00080FF1BC0933021F48091EB00806213C0F0 +:107DB0008091EB0080618093EB0081E090E002C055 +:107DC000880F991F2A95E2F78093EA001092EA0043 +:107DD0008091EB0088608093EB001092E900809125 +:107DE000E800877F51C0882309F06DC01091BF0162 +:107DF0001F770FB7F8948091E800877F8093E800A1 +:107E00009ADD8091E80080FFFCCF8091E3008078CC +:107E1000812B8093E30080688093E300112311F4A9 +:107E200082E001C083E08EBB0FBF4DC0805882301E +:107E300008F049C08091BF019091C0016091C101DB +:107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 +:107E50008091E800877F8093E80089819A8192DE93 +:107E60008091E8008B778093E8002DC0803859F529 +:107E70008091E800877F8093E8008091BB01809328 +:107E8000F1008091E8008E778093E80054DD1BC0FC +:107E90008823C9F49091BF019230A8F48091E80042 +:107EA000877F8093E8009093BB0145DD8091BB0103 +:107EB000882331F48091E30087FD02C081E001C096 +:107EC00084E08EBB50DC8091E80083FF0AC0809183 +:107ED000EB0080628093EB008091E800877F8093C5 +:107EE000E8000F900F90CF91DF911F910F910895AF +:107EF00008951F938EB3882361F01091E9001092CA +:107F0000E9008091E80083FF01C0E4DE1770109360 +:107F1000E9001F910895F999FECF92BD81BDF89AAD +:107F2000992780B50895262FF999FECF1FBA92BDE3 +:107F300081BD20BD0FB6F894FA9AF99A0FBE01964A +:067F40000895F894FFCF44 +:107F46004341544552494E41007700080000000065 +:107F56000000080112011001020000084123380048 +:107F660001000201000109023E00020100803209FF +:107F7600040000010202010005240010010424028D +:107F8600040524060001070582030800FF09040111 +:107F960000020A000000070504021000010705831D +:107FA6000210000104030904280352006F00620056 +:107FB6006F007400200043006F006E0074007200B2 +:107FC6006F006C00200042006F00610072006400C8 +:107FD60000001803410072006400750069006E001D +:0C7FE6006F0020004C004C004300000025 +:040000030000700089 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.c b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.c index c462420ff55..67ce4932376 100644 --- a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.c +++ b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.c @@ -1,780 +1,780 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. - */ - -#define INCLUDE_FROM_CATERINA_C -#include "Caterina.h" - -/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some - * operating systems will not open the port unless the settings can be set successfully. - */ -static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, - .CharFormat = CDC_LINEENCODING_OneStopBit, - .ParityType = CDC_PARITY_None, - .DataBits = 8 }; - -/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, - * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued - * command.) - */ -static uint32_t CurrAddress; - -/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite - * loop until the AVR restarts and the application runs. - */ -static bool RunBootloader = true; - -/* Pulse generation counters to keep track of the time remaining for each pulse type */ -#define TX_RX_LED_PULSE_PERIOD 100 -uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse -uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse - -/* Bootloader timeout timer */ -// MAH 8/15/12- change so timeouts work properly when the chip is running at 8MHz instead of 16. -#define TIMEOUT_PERIOD 8000 -#define EXT_RESET_TIMEOUT_PERIOD 750 - - -/********************************************************************************************************* -LilyPadUSB bootloader code -The LilyPadUSB bootloader has been changed to remove the 8-second delay after external reset which is in -the Leonardo. To enter the bootloader, the user should execute TWO external resets within 750 ms; that is, -press the reset button twice, quickly.\ - -Some other changes were made to allow this code to compile tightly enough to fit in the alloted 4k of -bootloader space. -*/ -// MAH 8/15/12- added this flag to replace the bulky program memory reads to check for the presence of a sketch -// at the top of the memory space. -static bool sketchPresent = false; - -// MAH 8/15/12- make this volatile, since we modify it in one place and read it in another, we want to make -// sure we're always working on the copy in memory and not an erroneous value stored in a cache somewhere. -// This variable stores the length of time we've been in the bootloader when waiting for the 8 second delay. -volatile uint16_t Timeout = 0; -// MAH 8/15/12- added this for delay during startup. Did not use existing Timeout value b/c it only increments -// when there's a sketch at the top of the memory. -volatile uint16_t resetTimeout = 0; - -// MAH 8/15/12- let's make this an 8-bit value instead of 16- that saves on memory because 16-bit addition and -// comparison compiles to bulkier code. Note that this does *not* require a change to the Arduino core- we're -// just sort of ignoring the extra byte that the Arduino core puts at the next location. -uint8_t bootKey = 0x77; -volatile uint8_t *const bootKeyPtr = (volatile uint8_t *)0x0800; - -// StartSketch() is called to clean up our mess before passing execution to the sketch. -void StartSketch(void) -{ - cli(); - - /* Undo TIMER1 setup and clear the count before running the sketch */ - TIMSK1 = 0; - TCCR1B = 0; - - /* Relocate the interrupt vector table to the application section */ - MCUCR = (1 << IVCE); - MCUCR = 0; - - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - /* jump to beginning of application space */ - __asm__ volatile("jmp 0x0000"); - -} - -uint16_t LLEDPulse; - -/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until it times out or is instructed to exit. - */ -int main(void) -{ - /* Save the value of the boot key memory before it is overwritten */ - uint8_t bootKeyPtrVal = *bootKeyPtr; - *bootKeyPtr = 0; - - /* Check the reason for the reset so we can act accordingly */ - uint8_t mcusr_state = MCUSR; // store the initial state of the Status register - MCUSR = 0; // clear all reset flags - - /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ - // MAH 8/15/12- I removed this because wdt_disable() is the first thing SetupHardware() does- why - // do it twice right in a row? - //wdt_disable(); - - /* Setup hardware required for the bootloader */ - // MAH 8/15/12- Moved this up to before the bootloader go/no-go decision tree so I could use the - // timer in that decision tree. Removed the USBInit() call from it; if I'm not going to stay in - // the bootloader, there's no point spending the time initializing the USB. - // SetupHardware(); - wdt_disable(); - - // Disable clock division - clock_prescale_set(clock_div_1); - - // Relocate the interrupt vector table to the bootloader section - MCUCR = (1 << IVCE); - MCUCR = (1 << IVSEL); - - LED_SETUP(); - CPU_PRESCALE(0); - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - // Initialize TIMER1 to handle bootloader timeout and LED tasks. - // With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz - // Our chosen compare match generates an interrupt every 1 ms. - // This interrupt is disabled selectively when doing memory reading, erasing, - // or writing since SPM has tight timing requirements. - - OCR1AH = 0; - OCR1AL = 250; - TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt - TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input - - - // MAH 8/15/12- this replaces bulky pgm_read_word(0) calls later on, to save memory. - if (pgm_read_word(0) != 0xFFFF) sketchPresent = true; - -// MAH 26 Oct 2012- The "bootload or not?" section has been modified since the code released -// with Arduino 1.0.1. The simplest modification is the replacement of equivalence checks on -// the reset bits with masked checks, so if more than one reset occurs before the register is -// checked, the check doesn't fail and fall through to the bootloader unnecessarily. - -// The second, more in depth modification addresses behavior after an external reset (i.e., -// user pushes the reset button). The Leonardo treats all external resets as requests to -// re-enter the bootloader and wait for code to be loaded. It remains in bootloader mode for -// 8 seconds before continuing on to the sketch (if one is present). By defining RESET_DELAY -// equal to 1, this behavior will persist. - -// However, if RESET_DELAY is defined to 0, the reset timeout before loading the sketch drops -// to 750ms. If, during that 750ms, another external reset occurs, THEN an 8-second delay -// in the bootloader will occur. - - // This is the "no-8-second-delay" code. If this is the first time through the loop, we - // don't expect to see the bootKey in memory. - if ( (mcusr_state & (1< EXT_RESET_TIMEOUT_PERIOD) // resetTimeout is getting incremeted - RunBootloader = false; // in the timer1 ISR. - } - // If we make it past that while loop, it's sketch loading time! - *bootKeyPtr = 0; // clear out the bootKey; from now on, we want to treat a reset like - // a normal reset. - cli(); // Disable interrupts, in case no sketch is present. - RunBootloader = true; // We want to hang out in the bootloader if no sketch is present. - if (sketchPresent) StartSketch(); // If a sketch is present, go! Otherwise, wait around - // in the bootloader until one is uploaded. - } - // On a power-on reset, we ALWAYS want to go to the sketch. If there is one. - // This is a place where the old code had an equivalence and now there is a mask. - else if ( (mcusr_state & (1< TIMEOUT_PERIOD) - RunBootloader = false; - - // MAH 8/15/12- This used to be a function call- inlining it saves a few bytes. - LLEDPulse++; - uint8_t p = LLEDPulse >> 8; - if (p > 127) - p = 254-p; - p += p; - if (((uint8_t)LLEDPulse) > p) - L_LED_OFF(); - else - L_LED_ON(); - } - - /* Disconnect from the host - USB interface will be reset later along with the AVR */ - USB_Detach(); - - /* Jump to beginning of application space to run the sketch - do not reset */ - StartSketch(); -} - -// Timer1 is set up to provide periodic interrupts. This is used to flicker the LEDs during -// programming as well as to generate the clock counts which determine how long the board should -// remain in bootloading mode. - -ISR(TIMER1_COMPA_vect, ISR_BLOCK) -{ - /* Reset counter */ - TCNT1H = 0; - TCNT1L = 0; - - /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ - if (TxLEDPulse && !(--TxLEDPulse)) - TX_LED_OFF(); - if (RxLEDPulse && !(--RxLEDPulse)) - RX_LED_OFF(); - resetTimeout++; // Needed for the "short reset delay" mode- governs the time the board waits - // for a second reset before loading the sketch. - if (pgm_read_word(0) != 0xFFFF) - Timeout++; -} - -// MAH 29 Oct 2012 Nothing below this point has to change for the LilyPadUSB support - -/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready - * to relay data to and from the attached USB host. - */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - /* Setup CDC Notification, Rx and Tx Endpoints */ - Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, - ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); -} - -/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to - * the device from the USB host before passing along unhandled control requests to the library for processing - * internally. - */ -void EVENT_USB_Device_ControlRequest(void) -{ - /* Ignore any requests that aren't directed to the CDC interface */ - if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != - (REQTYPE_CLASS | REQREC_INTERFACE)) - { - return; - } - - /* Process CDC specific control requests */ - switch (USB_ControlRequest.bRequest) - { - case CDC_REQ_GetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Write the line coding data to the control endpoint */ - Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearOUT(); - } - - break; - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Read the line coding data in from the host into the global struct */ - Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearIN(); - } - - break; - } -} - -#if !defined(NO_BLOCK_SUPPORT) -/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending - * on the AVR910 protocol command issued. - * - * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform - */ -static void ReadWriteMemoryBlock(const uint8_t Command) -{ - uint16_t BlockSize; - char MemoryType; - - bool HighByte = false; - uint8_t LowByte = 0; - - BlockSize = (FetchNextCommandByte() << 8); - BlockSize |= FetchNextCommandByte(); - - MemoryType = FetchNextCommandByte(); - - if ((MemoryType != 'E') && (MemoryType != 'F')) - { - /* Send error byte back to the host */ - WriteNextResponseByte('?'); - - return; - } - - /* Disable timer 1 interrupt - can't afford to process nonessential interrupts - * while doing SPM tasks */ - TIMSK1 = 0; - - /* Check if command is to read memory */ - if (Command == 'g') - { - /* Re-enable RWW section */ - boot_rww_enable(); - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* Read the next FLASH byte from the current FLASH page */ - #if (FLASHEND > 0xFFFF) - WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); - #else - WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); - #endif - - /* If both bytes in current word have been read, increment the address counter */ - if (HighByte) - CurrAddress += 2; - - HighByte = !HighByte; - } - else - { - /* Read the next EEPROM byte into the endpoint */ - WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - } - else - { - uint32_t PageStartAddress = CurrAddress; - - if (MemoryType == 'F') - { - boot_page_erase(PageStartAddress); - boot_spm_busy_wait(); - } - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* If both bytes in current word have been written, increment the address counter */ - if (HighByte) - { - /* Write the next FLASH word to the current FLASH page */ - boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - else - { - LowByte = FetchNextCommandByte(); - } - - HighByte = !HighByte; - } - else - { - /* Write the next EEPROM byte from the endpoint */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - - /* If in FLASH programming mode, commit the page after writing */ - if (MemoryType == 'F') - { - /* Commit the flash page to memory */ - boot_page_write(PageStartAddress); - - /* Wait until write operation has completed */ - boot_spm_busy_wait(); - } - - /* Send response byte back to the host */ - WriteNextResponseByte('\r'); - } - - /* Re-enable timer 1 interrupt disabled earlier in this routine */ - TIMSK1 = (1 << OCIE1A); -} -#endif - -/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed - * to allow reception of the next data packet from the host. - * - * \return Next received byte from the host in the CDC data OUT endpoint - */ -static uint8_t FetchNextCommandByte(void) -{ - /* Select the OUT endpoint so that the next data byte can be read */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* If OUT endpoint empty, clear it and wait for the next packet from the host */ - while (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearOUT(); - - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return 0; - } - } - - /* Fetch the next byte from the OUT endpoint */ - return Endpoint_Read_8(); -} - -/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the - * bank when full ready for the next byte in the packet to the host. - * - * \param[in] Response Next response byte to send to the host - */ -static void WriteNextResponseByte(const uint8_t Response) -{ - /* Select the IN endpoint so that the next data byte can be written */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ - if (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearIN(); - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Write the next byte to the IN endpoint */ - Endpoint_Write_8(Response); - - TX_LED_ON(); - TxLEDPulse = TX_RX_LED_PULSE_PERIOD; -} - -#define STK_OK 0x10 -#define STK_INSYNC 0x14 // ' ' -#define CRC_EOP 0x20 // 'SPACE' -#define STK_GET_SYNC 0x30 // '0' - -#define STK_GET_PARAMETER 0x41 // 'A' -#define STK_SET_DEVICE 0x42 // 'B' -#define STK_SET_DEVICE_EXT 0x45 // 'E' -#define STK_LOAD_ADDRESS 0x55 // 'U' -#define STK_UNIVERSAL 0x56 // 'V' -#define STK_PROG_PAGE 0x64 // 'd' -#define STK_READ_PAGE 0x74 // 't' -#define STK_READ_SIGN 0x75 // 'u' - -/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions - * and send the appropriate response back to the host. - */ -void CDC_Task(void) -{ - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Check if endpoint has a command in it sent from the host */ - if (!(Endpoint_IsOUTReceived())) - return; - - RX_LED_ON(); - RxLEDPulse = TX_RX_LED_PULSE_PERIOD; - - /* Read in the bootloader command (first byte sent from host) */ - uint8_t Command = FetchNextCommandByte(); - - if (Command == 'E') - { - /* We nearly run out the bootloader timeout clock, - * leaving just a few hundred milliseconds so the - * bootloder has time to respond and service any - * subsequent requests */ - Timeout = TIMEOUT_PERIOD - 500; - - /* Re-enable RWW section - must be done here in case - * user has disabled verification on upload. */ - boot_rww_enable_safe(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'T') - { - FetchNextCommandByte(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if ((Command == 'L') || (Command == 'P')) - { - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 't') - { - // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader - WriteNextResponseByte(0x44); - WriteNextResponseByte(0x00); - } - else if (Command == 'a') - { - // Indicate auto-address increment is supported - WriteNextResponseByte('Y'); - } - else if (Command == 'A') - { - // Set the current address to that given by the host - CurrAddress = (FetchNextCommandByte() << 9); - CurrAddress |= (FetchNextCommandByte() << 1); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'p') - { - // Indicate serial programmer back to the host - WriteNextResponseByte('S'); - } - else if (Command == 'S') - { - // Write the 7-byte software identifier to the endpoint - for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) - WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); - } - else if (Command == 'V') - { - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); - } - else if (Command == 's') - { - WriteNextResponseByte(AVR_SIGNATURE_3); - WriteNextResponseByte(AVR_SIGNATURE_2); - WriteNextResponseByte(AVR_SIGNATURE_1); - } - else if (Command == 'e') - { - // Clear the application section of flash - for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) - { - boot_page_erase(CurrFlashAddress); - boot_spm_busy_wait(); - boot_page_write(CurrFlashAddress); - boot_spm_busy_wait(); - } - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) - else if (Command == 'l') - { - // Set the lock bits to those given by the host - boot_lock_bits_set(FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #endif - else if (Command == 'r') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); - } - else if (Command == 'F') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); - } - else if (Command == 'N') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); - } - else if (Command == 'Q') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); - } - #if !defined(NO_BLOCK_SUPPORT) - else if (Command == 'b') - { - WriteNextResponseByte('Y'); - - // Send block size to the host - WriteNextResponseByte(SPM_PAGESIZE >> 8); - WriteNextResponseByte(SPM_PAGESIZE & 0xFF); - } - else if ((Command == 'B') || (Command == 'g')) - { - // Keep resetting the timeout counter if we're receiving self-programming instructions - Timeout = 0; - // Delegate the block write/read to a separate function for clarity - ReadWriteMemoryBlock(Command); - } - #endif - #if !defined(NO_FLASH_BYTE_SUPPORT) - else if (Command == 'C') - { - // Write the high byte to the current flash page - boot_page_fill(CurrAddress, FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'c') - { - // Write the low byte to the current flash page - boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); - - // Increment the address - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'm') - { - // Commit the flash page to memory - boot_page_write(CurrAddress); - - // Wait until write operation has completed - boot_spm_busy_wait(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'R') - { - #if (FLASHEND > 0xFFFF) - uint16_t ProgramWord = pgm_read_word_far(CurrAddress); - #else - uint16_t ProgramWord = pgm_read_word(CurrAddress); - #endif - - WriteNextResponseByte(ProgramWord >> 8); - WriteNextResponseByte(ProgramWord & 0xFF); - } - #endif - #if !defined(NO_EEPROM_BYTE_SUPPORT) - else if (Command == 'D') - { - // Read the byte from the endpoint and write it to the EEPROM - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - // Increment the address after use - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'd') - { - // Read the EEPROM byte and write it to the endpoint - WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); - - // Increment the address after use - CurrAddress += 2; - } - #endif - else if (Command != 27) - { - // Unknown (non-sync) command, return fail code - WriteNextResponseByte('?'); - } - - - /* Select the IN endpoint */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* Remember if the endpoint is completely full before clearing it */ - bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); - - /* Send the endpoint data to the host */ - Endpoint_ClearIN(); - - /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ - if (IsEndpointFull) - { - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearIN(); - } - - /* Wait until the data has been sent to the host */ - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Acknowledge the command from the host */ - Endpoint_ClearOUT(); -} - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_CATERINA_C +#include "Caterina.h" + +/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some + * operating systems will not open the port unless the settings can be set successfully. + */ +static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, + .CharFormat = CDC_LINEENCODING_OneStopBit, + .ParityType = CDC_PARITY_None, + .DataBits = 8 }; + +/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, + * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued + * command.) + */ +static uint32_t CurrAddress; + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite + * loop until the AVR restarts and the application runs. + */ +static bool RunBootloader = true; + +/* Pulse generation counters to keep track of the time remaining for each pulse type */ +#define TX_RX_LED_PULSE_PERIOD 100 +uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse +uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse + +/* Bootloader timeout timer */ +// MAH 8/15/12- change so timeouts work properly when the chip is running at 8MHz instead of 16. +#define TIMEOUT_PERIOD 8000 +#define EXT_RESET_TIMEOUT_PERIOD 750 + + +/********************************************************************************************************* +LilyPadUSB bootloader code +The LilyPadUSB bootloader has been changed to remove the 8-second delay after external reset which is in +the Leonardo. To enter the bootloader, the user should execute TWO external resets within 750 ms; that is, +press the reset button twice, quickly.\ + +Some other changes were made to allow this code to compile tightly enough to fit in the alloted 4k of +bootloader space. +*/ +// MAH 8/15/12- added this flag to replace the bulky program memory reads to check for the presence of a sketch +// at the top of the memory space. +static bool sketchPresent = false; + +// MAH 8/15/12- make this volatile, since we modify it in one place and read it in another, we want to make +// sure we're always working on the copy in memory and not an erroneous value stored in a cache somewhere. +// This variable stores the length of time we've been in the bootloader when waiting for the 8 second delay. +volatile uint16_t Timeout = 0; +// MAH 8/15/12- added this for delay during startup. Did not use existing Timeout value b/c it only increments +// when there's a sketch at the top of the memory. +volatile uint16_t resetTimeout = 0; + +// MAH 8/15/12- let's make this an 8-bit value instead of 16- that saves on memory because 16-bit addition and +// comparison compiles to bulkier code. Note that this does *not* require a change to the Arduino core- we're +// just sort of ignoring the extra byte that the Arduino core puts at the next location. +uint8_t bootKey = 0x77; +volatile uint8_t *const bootKeyPtr = (volatile uint8_t *)0x0800; + +// StartSketch() is called to clean up our mess before passing execution to the sketch. +void StartSketch(void) +{ + cli(); + + /* Undo TIMER1 setup and clear the count before running the sketch */ + TIMSK1 = 0; + TCCR1B = 0; + + /* Relocate the interrupt vector table to the application section */ + MCUCR = (1 << IVCE); + MCUCR = 0; + + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + /* jump to beginning of application space */ + __asm__ volatile("jmp 0x0000"); + +} + +uint16_t LLEDPulse; + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until it times out or is instructed to exit. + */ +int main(void) +{ + /* Save the value of the boot key memory before it is overwritten */ + uint8_t bootKeyPtrVal = *bootKeyPtr; + *bootKeyPtr = 0; + + /* Check the reason for the reset so we can act accordingly */ + uint8_t mcusr_state = MCUSR; // store the initial state of the Status register + MCUSR = 0; // clear all reset flags + + /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ + // MAH 8/15/12- I removed this because wdt_disable() is the first thing SetupHardware() does- why + // do it twice right in a row? + //wdt_disable(); + + /* Setup hardware required for the bootloader */ + // MAH 8/15/12- Moved this up to before the bootloader go/no-go decision tree so I could use the + // timer in that decision tree. Removed the USBInit() call from it; if I'm not going to stay in + // the bootloader, there's no point spending the time initializing the USB. + // SetupHardware(); + wdt_disable(); + + // Disable clock division + clock_prescale_set(clock_div_1); + + // Relocate the interrupt vector table to the bootloader section + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + LED_SETUP(); + CPU_PRESCALE(0); + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + // Initialize TIMER1 to handle bootloader timeout and LED tasks. + // With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz + // Our chosen compare match generates an interrupt every 1 ms. + // This interrupt is disabled selectively when doing memory reading, erasing, + // or writing since SPM has tight timing requirements. + + OCR1AH = 0; + OCR1AL = 250; + TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt + TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input + + + // MAH 8/15/12- this replaces bulky pgm_read_word(0) calls later on, to save memory. + if (pgm_read_word(0) != 0xFFFF) sketchPresent = true; + +// MAH 26 Oct 2012- The "bootload or not?" section has been modified since the code released +// with Arduino 1.0.1. The simplest modification is the replacement of equivalence checks on +// the reset bits with masked checks, so if more than one reset occurs before the register is +// checked, the check doesn't fail and fall through to the bootloader unnecessarily. + +// The second, more in depth modification addresses behavior after an external reset (i.e., +// user pushes the reset button). The Leonardo treats all external resets as requests to +// re-enter the bootloader and wait for code to be loaded. It remains in bootloader mode for +// 8 seconds before continuing on to the sketch (if one is present). By defining RESET_DELAY +// equal to 1, this behavior will persist. + +// However, if RESET_DELAY is defined to 0, the reset timeout before loading the sketch drops +// to 750ms. If, during that 750ms, another external reset occurs, THEN an 8-second delay +// in the bootloader will occur. + + // This is the "no-8-second-delay" code. If this is the first time through the loop, we + // don't expect to see the bootKey in memory. + if ( (mcusr_state & (1< EXT_RESET_TIMEOUT_PERIOD) // resetTimeout is getting incremeted + RunBootloader = false; // in the timer1 ISR. + } + // If we make it past that while loop, it's sketch loading time! + *bootKeyPtr = 0; // clear out the bootKey; from now on, we want to treat a reset like + // a normal reset. + cli(); // Disable interrupts, in case no sketch is present. + RunBootloader = true; // We want to hang out in the bootloader if no sketch is present. + if (sketchPresent) StartSketch(); // If a sketch is present, go! Otherwise, wait around + // in the bootloader until one is uploaded. + } + // On a power-on reset, we ALWAYS want to go to the sketch. If there is one. + // This is a place where the old code had an equivalence and now there is a mask. + else if ( (mcusr_state & (1< TIMEOUT_PERIOD) + RunBootloader = false; + + // MAH 8/15/12- This used to be a function call- inlining it saves a few bytes. + LLEDPulse++; + uint8_t p = LLEDPulse >> 8; + if (p > 127) + p = 254-p; + p += p; + if (((uint8_t)LLEDPulse) > p) + L_LED_OFF(); + else + L_LED_ON(); + } + + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); + + /* Jump to beginning of application space to run the sketch - do not reset */ + StartSketch(); +} + +// Timer1 is set up to provide periodic interrupts. This is used to flicker the LEDs during +// programming as well as to generate the clock counts which determine how long the board should +// remain in bootloading mode. + +ISR(TIMER1_COMPA_vect, ISR_BLOCK) +{ + /* Reset counter */ + TCNT1H = 0; + TCNT1L = 0; + + /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ + if (TxLEDPulse && !(--TxLEDPulse)) + TX_LED_OFF(); + if (RxLEDPulse && !(--RxLEDPulse)) + RX_LED_OFF(); + resetTimeout++; // Needed for the "short reset delay" mode- governs the time the board waits + // for a second reset before loading the sketch. + if (pgm_read_word(0) != 0xFFFF) + Timeout++; +} + +// MAH 29 Oct 2012 Nothing below this point has to change for the LilyPadUSB support + +/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready + * to relay data to and from the attached USB host. + */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + /* Setup CDC Notification, Rx and Tx Endpoints */ + Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, + ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); +} + +/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to + * the device from the USB host before passing along unhandled control requests to the library for processing + * internally. + */ +void EVENT_USB_Device_ControlRequest(void) +{ + /* Ignore any requests that aren't directed to the CDC interface */ + if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != + (REQTYPE_CLASS | REQREC_INTERFACE)) + { + return; + } + + /* Process CDC specific control requests */ + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Write the line coding data to the control endpoint */ + Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearOUT(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Read the line coding data in from the host into the global struct */ + Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearIN(); + } + + break; + } +} + +#if !defined(NO_BLOCK_SUPPORT) +/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending + * on the AVR910 protocol command issued. + * + * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform + */ +static void ReadWriteMemoryBlock(const uint8_t Command) +{ + uint16_t BlockSize; + char MemoryType; + + bool HighByte = false; + uint8_t LowByte = 0; + + BlockSize = (FetchNextCommandByte() << 8); + BlockSize |= FetchNextCommandByte(); + + MemoryType = FetchNextCommandByte(); + + if ((MemoryType != 'E') && (MemoryType != 'F')) + { + /* Send error byte back to the host */ + WriteNextResponseByte('?'); + + return; + } + + /* Disable timer 1 interrupt - can't afford to process nonessential interrupts + * while doing SPM tasks */ + TIMSK1 = 0; + + /* Check if command is to read memory */ + if (Command == 'g') + { + /* Re-enable RWW section */ + boot_rww_enable(); + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* Read the next FLASH byte from the current FLASH page */ + #if (FLASHEND > 0xFFFF) + WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); + #else + WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); + #endif + + /* If both bytes in current word have been read, increment the address counter */ + if (HighByte) + CurrAddress += 2; + + HighByte = !HighByte; + } + else + { + /* Read the next EEPROM byte into the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + } + else + { + uint32_t PageStartAddress = CurrAddress; + + if (MemoryType == 'F') + { + boot_page_erase(PageStartAddress); + boot_spm_busy_wait(); + } + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* If both bytes in current word have been written, increment the address counter */ + if (HighByte) + { + /* Write the next FLASH word to the current FLASH page */ + boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + else + { + LowByte = FetchNextCommandByte(); + } + + HighByte = !HighByte; + } + else + { + /* Write the next EEPROM byte from the endpoint */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + + /* If in FLASH programming mode, commit the page after writing */ + if (MemoryType == 'F') + { + /* Commit the flash page to memory */ + boot_page_write(PageStartAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + } + + /* Send response byte back to the host */ + WriteNextResponseByte('\r'); + } + + /* Re-enable timer 1 interrupt disabled earlier in this routine */ + TIMSK1 = (1 << OCIE1A); +} +#endif + +/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed + * to allow reception of the next data packet from the host. + * + * \return Next received byte from the host in the CDC data OUT endpoint + */ +static uint8_t FetchNextCommandByte(void) +{ + /* Select the OUT endpoint so that the next data byte can be read */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* If OUT endpoint empty, clear it and wait for the next packet from the host */ + while (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return 0; + } + } + + /* Fetch the next byte from the OUT endpoint */ + return Endpoint_Read_8(); +} + +/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the + * bank when full ready for the next byte in the packet to the host. + * + * \param[in] Response Next response byte to send to the host + */ +static void WriteNextResponseByte(const uint8_t Response) +{ + /* Select the IN endpoint so that the next data byte can be written */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ + if (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next byte to the IN endpoint */ + Endpoint_Write_8(Response); + + TX_LED_ON(); + TxLEDPulse = TX_RX_LED_PULSE_PERIOD; +} + +#define STK_OK 0x10 +#define STK_INSYNC 0x14 // ' ' +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' + +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' + +/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions + * and send the appropriate response back to the host. + */ +void CDC_Task(void) +{ + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Check if endpoint has a command in it sent from the host */ + if (!(Endpoint_IsOUTReceived())) + return; + + RX_LED_ON(); + RxLEDPulse = TX_RX_LED_PULSE_PERIOD; + + /* Read in the bootloader command (first byte sent from host) */ + uint8_t Command = FetchNextCommandByte(); + + if (Command == 'E') + { + /* We nearly run out the bootloader timeout clock, + * leaving just a few hundred milliseconds so the + * bootloder has time to respond and service any + * subsequent requests */ + Timeout = TIMEOUT_PERIOD - 500; + + /* Re-enable RWW section - must be done here in case + * user has disabled verification on upload. */ + boot_rww_enable_safe(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'T') + { + FetchNextCommandByte(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if ((Command == 'L') || (Command == 'P')) + { + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 't') + { + // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader + WriteNextResponseByte(0x44); + WriteNextResponseByte(0x00); + } + else if (Command == 'a') + { + // Indicate auto-address increment is supported + WriteNextResponseByte('Y'); + } + else if (Command == 'A') + { + // Set the current address to that given by the host + CurrAddress = (FetchNextCommandByte() << 9); + CurrAddress |= (FetchNextCommandByte() << 1); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'p') + { + // Indicate serial programmer back to the host + WriteNextResponseByte('S'); + } + else if (Command == 'S') + { + // Write the 7-byte software identifier to the endpoint + for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) + WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); + } + else if (Command == 'V') + { + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); + } + else if (Command == 's') + { + WriteNextResponseByte(AVR_SIGNATURE_3); + WriteNextResponseByte(AVR_SIGNATURE_2); + WriteNextResponseByte(AVR_SIGNATURE_1); + } + else if (Command == 'e') + { + // Clear the application section of flash + for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + } + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) + else if (Command == 'l') + { + // Set the lock bits to those given by the host + boot_lock_bits_set(FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #endif + else if (Command == 'r') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); + } + else if (Command == 'F') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); + } + else if (Command == 'N') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); + } + else if (Command == 'Q') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); + } + #if !defined(NO_BLOCK_SUPPORT) + else if (Command == 'b') + { + WriteNextResponseByte('Y'); + + // Send block size to the host + WriteNextResponseByte(SPM_PAGESIZE >> 8); + WriteNextResponseByte(SPM_PAGESIZE & 0xFF); + } + else if ((Command == 'B') || (Command == 'g')) + { + // Keep resetting the timeout counter if we're receiving self-programming instructions + Timeout = 0; + // Delegate the block write/read to a separate function for clarity + ReadWriteMemoryBlock(Command); + } + #endif + #if !defined(NO_FLASH_BYTE_SUPPORT) + else if (Command == 'C') + { + // Write the high byte to the current flash page + boot_page_fill(CurrAddress, FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'c') + { + // Write the low byte to the current flash page + boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); + + // Increment the address + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'm') + { + // Commit the flash page to memory + boot_page_write(CurrAddress); + + // Wait until write operation has completed + boot_spm_busy_wait(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'R') + { + #if (FLASHEND > 0xFFFF) + uint16_t ProgramWord = pgm_read_word_far(CurrAddress); + #else + uint16_t ProgramWord = pgm_read_word(CurrAddress); + #endif + + WriteNextResponseByte(ProgramWord >> 8); + WriteNextResponseByte(ProgramWord & 0xFF); + } + #endif + #if !defined(NO_EEPROM_BYTE_SUPPORT) + else if (Command == 'D') + { + // Read the byte from the endpoint and write it to the EEPROM + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + // Increment the address after use + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'd') + { + // Read the EEPROM byte and write it to the endpoint + WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); + + // Increment the address after use + CurrAddress += 2; + } + #endif + else if (Command != 27) + { + // Unknown (non-sync) command, return fail code + WriteNextResponseByte('?'); + } + + + /* Select the IN endpoint */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* Remember if the endpoint is completely full before clearing it */ + bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); + + /* Send the endpoint data to the host */ + Endpoint_ClearIN(); + + /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ + if (IsEndpointFull) + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + } + + /* Wait until the data has been sent to the host */ + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Acknowledge the command from the host */ + Endpoint_ClearOUT(); +} + diff --git a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.h b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.h index 5ce80fab609..67ff1b3a4ed 100644 --- a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.h +++ b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.h @@ -1,106 +1,106 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for BootloaderCDC.c. - */ - -#ifndef _CDC_H_ -#define _CDC_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - /* Macros: */ - /** Version major of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MAJOR 0x01 - - /** Version minor of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MINOR 0x00 - - /** Hardware version major of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MAJOR 0x01 - - /** Hardware version minor of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MINOR 0x00 - - /** Eight character bootloader firmware identifier reported to the host when requested */ - #define SOFTWARE_IDENTIFIER "CATERINA" - - #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) - #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); - #define L_LED_OFF() PORTC &= ~(1<<7) - #define L_LED_ON() PORTC |= (1<<7) - #define L_LED_TOGGLE() PORTC ^= (1<<7) - #if DEVICE_PID == 0x0037 // polarity of the RX and TX LEDs is reversed on the Micro - #define TX_LED_OFF() PORTD &= ~(1<<5) - #define TX_LED_ON() PORTD |= (1<<5) - #define RX_LED_OFF() PORTB &= ~(1<<0) - #define RX_LED_ON() PORTB |= (1<<0) - #else - #define TX_LED_OFF() PORTD |= (1<<5) - #define TX_LED_ON() PORTD &= ~(1<<5) - #define RX_LED_OFF() PORTB |= (1<<0) - #define RX_LED_ON() PORTB &= ~(1<<0) - #endif - - /* Type Defines: */ - /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ - typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; - - /* Function Prototypes: */ - void StartSketch(void); - void LEDPulse(void); - - void CDC_Task(void); - void SetupHardware(void); - - void EVENT_USB_Device_ConfigurationChanged(void); - - #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) - #if !defined(NO_BLOCK_SUPPORT) - static void ReadWriteMemoryBlock(const uint8_t Command); - #endif - static uint8_t FetchNextCommandByte(void); - static void WriteNextResponseByte(const uint8_t Response); - #endif - -#endif - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for BootloaderCDC.c. + */ + +#ifndef _CDC_H_ +#define _CDC_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + /* Macros: */ + /** Version major of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MAJOR 0x01 + + /** Version minor of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MINOR 0x00 + + /** Hardware version major of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MAJOR 0x01 + + /** Hardware version minor of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MINOR 0x00 + + /** Eight character bootloader firmware identifier reported to the host when requested */ + #define SOFTWARE_IDENTIFIER "CATERINA" + + #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) + #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); + #define L_LED_OFF() PORTC &= ~(1<<7) + #define L_LED_ON() PORTC |= (1<<7) + #define L_LED_TOGGLE() PORTC ^= (1<<7) + #if DEVICE_PID == 0x0037 // polarity of the RX and TX LEDs is reversed on the Micro + #define TX_LED_OFF() PORTD &= ~(1<<5) + #define TX_LED_ON() PORTD |= (1<<5) + #define RX_LED_OFF() PORTB &= ~(1<<0) + #define RX_LED_ON() PORTB |= (1<<0) + #else + #define TX_LED_OFF() PORTD |= (1<<5) + #define TX_LED_ON() PORTD &= ~(1<<5) + #define RX_LED_OFF() PORTB |= (1<<0) + #define RX_LED_ON() PORTB &= ~(1<<0) + #endif + + /* Type Defines: */ + /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /* Function Prototypes: */ + void StartSketch(void); + void LEDPulse(void); + + void CDC_Task(void); + void SetupHardware(void); + + void EVENT_USB_Device_ConfigurationChanged(void); + + #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) + #if !defined(NO_BLOCK_SUPPORT) + static void ReadWriteMemoryBlock(const uint8_t Command); + #endif + static uint8_t FetchNextCommandByte(void); + static void WriteNextResponseByte(const uint8_t Response); + #endif + +#endif + diff --git a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.c b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.c index 57f39d98af4..3ca9c83affc 100644 --- a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.c +++ b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.c @@ -1,270 +1,270 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ -const USB_Descriptor_Device_t DeviceDescriptor = -{ - .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - - .USBSpecification = VERSION_BCD(01.10), - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_NoSpecificSubclass, - .Protocol = CDC_CSCP_NoSpecificProtocol, - - .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - - .VendorID = DEVICE_VID, - .ProductID = DEVICE_PID, - .ReleaseNumber = VERSION_BCD(00.01), - - .ManufacturerStrIndex = 0x02, - .ProductStrIndex = 0x01, - .SerialNumStrIndex = NO_DESCRIPTOR, - - .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS -}; - -/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ -const USB_Descriptor_Configuration_t ConfigurationDescriptor = -{ - .Config = - { - .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 2, - - .ConfigurationNumber = 1, - .ConfigurationStrIndex = NO_DESCRIPTOR, - - .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, - - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) - }, - - .CDC_CCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 0, - .AlternateSetting = 0, - - .TotalEndpoints = 1, - - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_ACMSubclass, - .Protocol = CDC_CSCP_ATCommandProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_Functional_Header = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x00, - - .CDCSpecification = VERSION_BCD(01.10), - }, - - .CDC_Functional_ACM = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x02, - - .Capabilities = 0x04, - }, - - .CDC_Functional_Union = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x06, - - .MasterInterfaceNumber = 0, - .SlaveInterfaceNumber = 1, - }, - - .CDC_NotificationEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_NOTIFICATION_EPSIZE, - .PollingIntervalMS = 0xFF - }, - - .CDC_DCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 1, - .AlternateSetting = 0, - - .TotalEndpoints = 2, - - .Class = CDC_CSCP_CDCDataClass, - .SubClass = CDC_CSCP_NoDataSubclass, - .Protocol = CDC_CSCP_NoDataProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_DataOutEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - }, - - .CDC_DataInEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - } -}; - -/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests - * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -const USB_Descriptor_String_t LanguageString = -{ - .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, - - .UnicodeString = {LANGUAGE_ID_ENG} -}; - -/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, - * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -const USB_Descriptor_String_t ProductString = -{ - .Header = {.Size = USB_STRING_LEN(19), .Type = DTYPE_String}, - - #if DEVICE_PID == 0x0036 - .UnicodeString = L"Arduino Leonardo" - #elif DEVICE_PID == 0x0037 - .UnicodeString = L"Arduino Micro " - #elif DEVICE_PID == 0x0038 - .UnicodeString = L"Robot Control Board" - #elif DEVICE_PID == 0x0039 - .UnicodeString = L"Robot Motor Board " - #elif DEVICE_PID == 0x003C - .UnicodeString = L"Arduino Esplora " - #else - .UnicodeString = L"USB IO board " - #endif -}; - -const USB_Descriptor_String_t ManufacturerString = -{ - .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, - - #if DEVICE_VID == 0x2341 - .UnicodeString = L"Arduino LLC" - #else - .UnicodeString = L"Unknown " - #endif -}; - -/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" - * documentation) by the application code so that the address and size of a requested descriptor can be given - * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function - * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the - * USB host. - */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - const void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - if (!(DescriptorNumber)) - { - Address = &LanguageString; - Size = LanguageString.Header.Size; - } - else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) - { - Address = &ProductString; - Size = ProductString.Header.Size; - } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) - { - Address = &ManufacturerString; - Size = ManufacturerString.Header.Size; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = DEVICE_VID, + .ProductID = DEVICE_PID, + .ReleaseNumber = VERSION_BCD(00.01), + + .ManufacturerStrIndex = 0x02, + .ProductStrIndex = 0x01, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_ACMSubclass, + .Protocol = CDC_CSCP_ATCommandProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_Header = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x00, + + .CDCSpecification = VERSION_BCD(01.10), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x02, + + .Capabilities = 0x04, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x06, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = CDC_CSCP_CDCDataClass, + .SubClass = CDC_CSCP_NoDataSubclass, + .Protocol = CDC_CSCP_NoDataProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t ProductString = +{ + .Header = {.Size = USB_STRING_LEN(19), .Type = DTYPE_String}, + + #if DEVICE_PID == 0x0036 + .UnicodeString = L"Arduino Leonardo" + #elif DEVICE_PID == 0x0037 + .UnicodeString = L"Arduino Micro " + #elif DEVICE_PID == 0x0038 + .UnicodeString = L"Robot Control Board" + #elif DEVICE_PID == 0x0039 + .UnicodeString = L"Robot Motor Board " + #elif DEVICE_PID == 0x003C + .UnicodeString = L"Arduino Esplora " + #else + .UnicodeString = L"USB IO board " + #endif +}; + +const USB_Descriptor_String_t ManufacturerString = +{ + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + #if DEVICE_VID == 0x2341 + .UnicodeString = L"Arduino LLC" + #else + .UnicodeString = L"Unknown " + #endif +}; + +/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) + { + Address = &ProductString; + Size = ProductString.Header.Size; + } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) + { + Address = &ManufacturerString; + Size = ManufacturerString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.h b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.h index 94091aef046..c843bec82ad 100644 --- a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.h +++ b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.h @@ -1,139 +1,139 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - /* Macros: */ - #if defined(__AVR_AT90USB1287__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB647__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB1286__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB646__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega32U6__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x87 - #elif defined(__AVR_ATmega16U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x8A - #elif defined(__AVR_ATmega16U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB162__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega8U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x93 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB82__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #else - #error The selected AVR part is not currently supported by this bootloader. - #endif - - /** Endpoint number for the CDC control interface event notification endpoint. */ - #define CDC_NOTIFICATION_EPNUM 2 - - /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ - #define CDC_TX_EPNUM 3 - - /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ - #define CDC_RX_EPNUM 4 - - /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ - #define CDC_TXRX_EPSIZE 16 - - /** Size of the CDC control interface notification endpoint bank, in bytes. */ - #define CDC_NOTIFICATION_EPSIZE 8 - - /* Type Defines: */ - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - - // CDC Control Interface - USB_Descriptor_Interface_t CDC_CCI_Interface; - USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; - USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; - USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; - USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; - - // CDC Data Interface - USB_Descriptor_Interface_t CDC_DCI_Interface; - USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; - USB_Descriptor_Endpoint_t CDC_DataInEndpoint; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) - ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + /* Macros: */ + #if defined(__AVR_AT90USB1287__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB647__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB1286__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB646__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega32U6__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x87 + #elif defined(__AVR_ATmega16U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x8A + #elif defined(__AVR_ATmega16U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB162__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega8U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB82__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #else + #error The selected AVR part is not currently supported by this bootloader. + #endif + + /** Endpoint number for the CDC control interface event notification endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ + #define CDC_TXRX_EPSIZE 16 + + /** Size of the CDC control interface notification endpoint bank, in bytes. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // CDC Control Interface + USB_Descriptor_Interface_t CDC_CCI_Interface; + USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; + USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; + USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + + // CDC Data Interface + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif + diff --git a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Makefile b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Makefile index af9990e962d..00385e4539c 100644 --- a/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Makefile +++ b/hardware/arduino/avr/bootloaders/caterina-Arduino_Robot/Makefile @@ -1,738 +1,738 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# USB vendor ID (VID) -# reuse of this VID by others is forbidden by USB-IF -# official Arduino LLC VID -VID = 0x2341 - - -# USB product ID (PID) -# official Leonardo PID -# PID = 0x0036 -# official Micro PID -# PID = 0x0037 -# official Arduino Robot Control Board PID -PID = 0x0038 -# official Arduino Robot Motor Board PID -# PID = 0x0039 -# official Esplora PID -# PID = 0x003C - -# MCU name -MCU = atmega32u4 - - -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - - -# Target board (see library "Board Types" documentation, NONE for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USER - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - - -# Starting byte address of the bootloader, as a byte address - computed via the formula -# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) -# -# Note that the bootloader size and start address given in AVRStudio is in words and not -# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. -FLASH_SIZE_KB = 32 -BOOT_SECTION_SIZE_KB = 4 -BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = Caterina - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Path to the LUFA library -LUFA_PATH = LUFA-111009 - - -# LUFA library compile-time options and predefined tokens -LUFA_OPTS = -D USB_DEVICE_ONLY -LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 -LUFA_OPTS += -D ORDERED_EP_CONFIG -LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 -LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 -LUFA_OPTS += -D USE_RAM_DESCRIPTORS -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -LUFA_OPTS += -D NO_INTERNAL_SERIAL -LUFA_OPTS += -D NO_DEVICE_SELF_POWER -LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP -LUFA_OPTS += -D NO_SOF_EVENTS - -#LUFA_OPTS += -D NO_BLOCK_SUPPORT -#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT -#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT -LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT - - -# Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(LUFA_PATH)/ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=c99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -CDEFS += -DF_USB=$(F_USB)UL -CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) -CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CDEFS += -DDEVICE_VID=$(VID)UL -CDEFS += -DDEVICE_PID=$(PID)UL -CDEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) -ADEFS += -DF_USB=$(F_USB)UL -ADEFS += -DBOARD=BOARD_$(BOARD) -ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -ADEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -CPPDEFS += -DF_USB=$(F_USB)UL -CPPDEFS += -DBOARD=BOARD_$(BOARD) -CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CPPDEFS += $(LUFA_OPTS) -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CPPFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware -# Type: avrdude -c ? -# to get a full listing. -# -#AVRDUDE_PROGRAMMER = avrispmkII -AVRDUDE_PROGRAMMER = usbtiny - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -#AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 -AVRDUDE = /home/david/tmp/Arduino-master/build/linux/dist/tools/avrdude -B 1 -C /home/david/tmp/Arduino-master/build/linux/dist/tools/avrdude.conf -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -z $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - -doxygen: - @echo Generating Project Documentation \($(TARGET)\)... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -checksource: - @for f in $(SRC) $(CPPSRC) $(ASRC); do \ - if [ -f $$f ]; then \ - echo "Found Source File: $$f" ; \ - else \ - echo "Source File Not Found: $$f" ; \ - fi; done - - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff doxygen clean \ -clean_list clean_doxygen program debug gdb-config checksource - +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# USB vendor ID (VID) +# reuse of this VID by others is forbidden by USB-IF +# official Arduino LLC VID +VID = 0x2341 + + +# USB product ID (PID) +# official Leonardo PID +# PID = 0x0036 +# official Micro PID +# PID = 0x0037 +# official Arduino Robot Control Board PID +PID = 0x0038 +# official Arduino Robot Motor Board PID +# PID = 0x0039 +# official Esplora PID +# PID = 0x003C + +# MCU name +MCU = atmega32u4 + + +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Starting byte address of the bootloader, as a byte address - computed via the formula +# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) +# +# Note that the bootloader size and start address given in AVRStudio is in words and not +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. +FLASH_SIZE_KB = 32 +BOOT_SECTION_SIZE_KB = 4 +BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Caterina + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = LUFA-111009 + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D ORDERED_EP_CONFIG +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D NO_INTERNAL_SERIAL +LUFA_OPTS += -D NO_DEVICE_SELF_POWER +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP +LUFA_OPTS += -D NO_SOF_EVENTS + +#LUFA_OPTS += -D NO_BLOCK_SUPPORT +#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT +#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT +LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_USB=$(F_USB)UL +CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += -DDEVICE_VID=$(VID)UL +CDEFS += -DDEVICE_PID=$(PID)UL +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_USB=$(F_USB)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +ADEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_USB=$(F_USB)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +#AVRDUDE_PROGRAMMER = avrispmkII +AVRDUDE_PROGRAMMER = usbtiny + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +#AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 +AVRDUDE = /home/david/tmp/Arduino-master/build/linux/dist/tools/avrdude -B 1 -C /home/david/tmp/Arduino-master/build/linux/dist/tools/avrdude.conf +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation \($(TARGET)\)... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +checksource: + @for f in $(SRC) $(CPPSRC) $(ASRC); do \ + if [ -f $$f ]; then \ + echo "Found Source File: $$f" ; \ + else \ + echo "Source File Not Found: $$f" ; \ + fi; done + + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program debug gdb-config checksource + diff --git a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina-LilyPadUSB.hex b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina-LilyPadUSB.hex old mode 100755 new mode 100644 index abc5ca89c2b..d85ee45ed16 --- a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina-LilyPadUSB.hex +++ b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina-LilyPadUSB.hex @@ -1,259 +1,259 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000FCC400005AC0000048 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C000005DC000004CC000004AC00000FD -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E2E467 -:1070C000FFE702C005900D92A83BB107D9F711E088 -:1070D000A8EBB1E001C01D92A13DB107E1F74FD38C -:1070E0002EC78ECFF89410926F001092810081E02D -:1070F00085BF15BE47985D9A289A0C9400000895A4 -:107100001F920F920FB60F9211242F938F939F937C -:10711000EF93FF9310928500109284008091B80144 -:107120009091B901009741F001979093B901809334 -:10713000B801892B09F45D9A8091BA019091BB0145 -:10714000009741F001979093BB018093BA01892B7E -:1071500009F4289A8091BE019091BF010196909305 -:10716000BF018093BE01E0E0F0E0859194918F5FD4 -:107170009F4F49F08091BC019091BD010196909381 -:10718000BD018093BC01FF91EF919F918F912F9151 -:107190000F900FBE0F901F90189584E08093E90028 -:1071A0000DC08091E8008B778093E80003C08EB318 -:1071B000882351F08091E80082FFF9CF8091E800A8 -:1071C00085FFEFCF8091F1000895982F83E08093A1 -:1071D000E9008091E80085FD0DC08091E8008E7780 -:1071E0008093E80003C08EB3882369F08091E800A3 -:1071F00080FFF9CF9093F1005D9884E690E0909342 -:10720000B9018093B80108954F925F926F927F9277 -:107210008F929F92AF92BF92CF92DF92EF92FF92A6 -:107220000F931F93CF93DF9384E08093E9008091C5 -:10723000E80082FF57C2289884E690E09093BB0153 -:107240008093BA01AADF182F853481F48CEA9DE07F -:107250009093BD018093BC0107B600FCFDCFF99966 -:10726000FECF81E180935700E89503C0843519F47F -:1072700094DF8DE00DC28C34E1F38035D1F3843797 -:1072800021F484E4A2DF80E003C2813611F489E5B1 -:10729000FFC18134B1F481DF182F7FDF90E0880FC8 -:1072A000991FAA2797FDA095BA2F312F330F20E001 -:1072B000442737FD4095542F822B932BA42BB52BBD -:1072C000B8C1803711F483E5E3C1833549F4C0E0E8 -:1072D000D1E089917ADF21E0C730D207D1F7D9C157 -:1072E000863521F481E371DF80E3D2C1833731F445 -:1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD -:10730000E0E0F0E093E085E090935700E89507B661 -:1073100000FCFDCF80935700E89507B600FCFDCF39 -:10732000E058FF4FA0E7E030FA0771F7A2CF8237AD -:1073300039F4E1E0F0E089E0809357008491A8C13E -:10734000863439F4E0E0F0E089E0809357008491DE -:107350009FC18E3439F4E3E0F0E089E08093570078 -:10736000849196C1813539F4E2E0F0E089E08093C0 -:10737000570084918DC1823631F489E526DF80E0A3 -:1073800024DF80E885C1823419F0873609F0E5C032 -:107390001092BD011092BC0100DF082FFEDEF82E16 -:1073A000FCDE682E8554823008F071C1902F80E099 -:1073B000CF2DD0E0C82BD92B10926F00173609F0D3 -:1073C0004BC081E180935700E895DD24CC24C39421 -:1073D0003FC0E090C101F090C2010091C301109143 -:1073E000C401B6E46B16D9F4ED2DF0E0EE29FF29C7 -:1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 -:10740000B0E0E80EF91E0A1F1B1FE092C101F092C6 -:10741000C2010093C3011093C401DC2418C0D80139 -:10742000C701B695A7959795879573D5CEDE82E06F -:1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA -:10744000C101F092C2010093C3011093C4012197BE -:10745000209709F0BECF7DC08090C1019090C201FD -:10746000A090C301B090C40196E4691609F05DC014 -:1074700083E0F40180935700E89507B600FCFDCF48 -:1074800054C0F6E46F1661F5772031F1E090C10148 -:10749000F090C2010091C3011091C4017EDED82E8C -:1074A000CC24852D90E08C299D29F7010C01409278 -:1074B0005700E895112482E090E0A0E0B0E0E80EEB -:1074C000F91E0A1F1B1FE092C101F092C201009336 -:1074D000C3011093C40102C060DE582E742423C07F -:1074E000E090C101F090C2010091C3011091C4016C -:1074F00016950795F794E79450DE682FC70111D5CC -:107500008091C1019091C201A091C301B091C401C9 -:107510000296A11DB11D8093C1019093C201A09359 -:10752000C301B093C401219704C055247724442497 -:107530004394209709F0A5CF96E4691641F485E0BD -:10754000F40180935700E89507B600FCFDCF8DE06D -:107550003CDE82E080936F009CC0833471F4009124 -:10756000C1011091C20119DE90E021E0F8010C0187 -:1075700020935700E89511247CCE833619F5E090CE -:10758000C101F090C2010091C3011091C40105DE58 -:10759000F701E16090E021E00C0120935700E895AD -:1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E -:1075B0001B1FE092C101F092C2010093C30110931E -:1075C000C40157CE8D3661F4E091C101F091C20142 -:1075D00085E080935700E89507B600FCFDCF49CEC3 -:1075E000823551F4E091C101F091C20105911491ED -:1075F000812FEBDD802F4CC0843421F5E090C10158 -:10760000F090C2010091C3011091C4011695079535 -:10761000F794E794C2DD682FC70183D48091C1013C -:107620009091C201A091C301B091C4010296A11D25 -:10763000B11D8093C1019093C201A093C301B09387 -:10764000C40117CE843609F5E090C101F090C20163 -:107650000091C3011091C401D801C701B695A79547 -:107660009795879556D4B1DD82E090E0A0E0B0E038 -:10767000E80EF91E0A1F1B1FE092C101F092C20121 -:107680000093C3011093C40104C08B3111F08FE348 -:107690009CDD83E08093E9009091E8008091E80010 -:1076A0008E778093E80095FF04C010C08EB38823C6 -:1076B000C9F08091E80080FFF9CF8091E8008E77D3 -:1076C0008093E80003C08EB3882361F08091E800C6 -:1076D00080FFF9CF84E08093E9008091E8008B7708 -:1076E0008093E800DF91CF911F910F91FF90EF9071 -:1076F000DF90CF90BF90AF909F908F907F906F90D2 -:107700005F904F9008959091C901892F8F778132B2 -:1077100049F58091CA018032A1F0813219F5913A80 -:1077200009F58091E800877F8093E8008CE091E084 -:1077300067E070E025D28091E8008B778093E800C5 -:107740000895913279F48091E800877F8093E80072 -:107750008CE091E067E070E077D28091E8008E776E -:107760008093E800089582E061EC42E0D1D083E0AC -:1077700061E842E1CDD084E060E842E1C9C01F93F6 -:10778000209100081092000844B714BE88E10FB69B -:10779000F89480936000109260000FBE80E8E0E0F3 -:1077A000F0E00FB6F89480936100E09361000FBEA3 -:1077B00031E035BF92E095BF3F9A209A559A809369 -:1077C00061001092610047985D9A289A1092890092 -:1077D0008AEF8093880090936F0083E0809381000C -:1077E000859194918F5F9F4F11F03093C001942F3A -:1077F00041FF19C0809109012817A9F08093000862 -:10780000789480911301882339F08091BE01909182 -:10781000BF0188579140C8F310920008F89481E0A6 -:10782000809313010CC090FF04C08091C001882395 -:1078300051F493FF09C080910901281729F0809124 -:10784000C001882309F04EDCD4D078941092BD0199 -:107850001092BC011EEF20C0D7DC49D38091BC013F -:107860009091BD01815A9F4010F0109213018091B8 -:10787000C5019091C60101969093C6018093C50100 -:10788000292F97FF03C0512F591B252F220F28178F -:1078900010F4479801C0479A809113018823E1F6BC -:1078A0008091E00081608093E0001CDC80E090E04B -:1078B0001F910895FA01923049F0933061F09130B0 -:1078C000F9F484E191E022E130E01EC086E291E02B -:1078D0002EE330E019C0882329F484E691E024E007 -:1078E00030E012C0813029F488E691E022E230E0F5 -:1078F0000BC0823029F48CE891E02AE230E004C029 -:1079000080E090E020E030E091838083C901089519 -:107910008093E9008091EB0081608093EB001092EE -:10792000ED006093EC004093ED008091EE00881F25 -:107930008827881F08958091C90188238CF403C08B -:107940008EB38823B1F08091E80082FFF9CF809157 -:10795000E8008B778093E80008958EB3882349F080 -:107960008091E80080FFF9CF8091E8008E778093C6 -:10797000E8000895EF92FF920F931F9345D04CD0EB -:1079800008ED10E0F80180818F7780838081806826 -:10799000808380818F7D808319BC1EBA1092C701BD -:1079A00080EEE82EF12CF70180818B7F8083F80137 -:1079B00080818160808380E060E042E0A9DFE1EEC9 -:1079C000F0E080818E7F8083E2EEF0E08081816054 -:1079D0008083808188608083F70180818E7F8083AF -:1079E000F8018081806180831F910F91FF90EF905B -:1079F0000895E7EDF0E08081816080838AE482BFB2 -:107A000081E08093C801B6CFE8EDF0E080818E7F01 -:107A100080831092E20008951092DA001092E10043 -:107A200008951F920F920FB60F9211242F933F9338 -:107A30004F935F936F937F938F939F93AF93BF9376 -:107A4000EF93FF938091DA0080FF1AC08091D800F5 -:107A500080FF16C08091DA008E7F8093DA008091DB -:107A6000D90080FF0AC019BC82E089BD09B400FEBC -:107A7000FDCF81E08EBB3AD203C019BC1EBA36D20C -:107A80008091E10080FF17C08091E20080FF13C069 -:107A90008091E2008E7F8093E2008091E20080611D -:107AA0008093E2008091D80080628093D80019BC56 -:107AB00085E08EBB1BD28091E10084FF2BC08091BA -:107AC000E20084FF27C019BC82E089BD09B400FE32 -:107AD000FDCF8091D8008F7D8093D8008091E10008 -:107AE0008F7E8093E1008091E2008F7E8093E200A0 -:107AF0008091E20081608093E2008091C701882339 -:107B000031F48091E30087FD02C081E001C084E090 -:107B10008EBBECD18091E10083FF21C08091E20017 -:107B200083FF1DC08091E100877F8093E10082E0A8 -:107B30008EBB1092C7018091E1008E7F8093E1009F -:107B40008091E2008E7F8093E2008091E20080616C -:107B50008093E20080E060E042E0DADEC7D1FF918E -:107B6000EF91BF91AF919F918F917F916F915F91B5 -:107B70004F913F912F910F900FBE0F901F9018952E -:107B80009C014091CF015091D0014617570718F43E -:107B9000F90190E044C06115710511F0AB01F8CF17 -:107BA0008091E8008E778093E80040E050E0F0CFCD -:107BB0008EB3882309F444C0853009F443C0809112 -:107BC000E80083FF02C081E008958091E80082FD13 -:107BD00031C08091E80080FF22C08091F300909135 -:107BE000F200782F60E0292F30E0262B372B07C0DA -:107BF00081918093F100415050402F5F3F4F4115DC -:107C0000510519F02830310598F390E028303105FE -:107C100009F491E08091E8008E778093E8004115A7 -:107C2000510531F6992321F605C08EB3882341F022 -:107C3000853041F08091E80082FFF7CF80E0089521 -:107C400082E0089583E008959C016115710529F48F -:107C50008091E8008B778093E800F90126C08EB30D -:107C6000882391F1853091F18091E80083FF02C073 -:107C700081E008958091E80082FFF1CF06C08091F5 -:107C8000F10081936150704059F02091F300809190 -:107C9000F200322F20E090E0822B932B892B79F792 -:107CA0008091E8008B778093E80061157105B9F643 -:107CB00005C08EB3882341F0853041F08091E80003 -:107CC00080FFF7CF80E0089582E0089583E0089573 -:107CD0000F931F93DF93CF9300D0CDB7DEB7E9ECBE -:107CE000F1E08091F100819381E0E13DF807C9F76F -:107CF0000ADD8091E80083FFE4C08091C901909182 -:107D0000CA01953009F46DC0963040F4913081F18C -:107D1000913070F0933009F0D4C02AC0983009F443 -:107D2000A3C0993009F4B2C0963009F0CAC07CC033 -:107D3000803809F4C6C0823809F0C3C08091CD01F3 -:107D400087708093E9008091EB001092E900209108 -:107D5000E800277F2093E80090E025E0969587953E -:107D60002A95E1F781708093F1001092F10087C0AD -:107D7000882319F0823009F0A4C08F71823009F095 -:107D8000A0C08091CB01882331F52091CD012770CF -:107D900009F497C02093E9008091EB0080FF1BC09D -:107DA000933021F48091EB00806213C08091EB004E -:107DB00080618093EB0081E090E002C0880F991F02 -:107DC0002A95E2F78093EA001092EA008091EB0096 -:107DD00088608093EB001092E9008091E800877F33 -:107DE00051C0882309F06DC01091CB011F770FB7E8 -:107DF000F8948091E800877F8093E8009CDD809173 -:107E0000E80080FFFCCF8091E3008078812B809395 -:107E1000E30080688093E300112311F482E001C045 -:107E200083E08EBB0FBF4DC08058823008F049C040 -:107E30008091CB019091CC016091CD01AE014F5F5B -:107E40005F4F38DDBC01009709F43BC08091E8002A -:107E5000877F8093E80089819A8192DE8091E80093 -:107E60008B778093E8002DC0803859F58091E80029 -:107E7000877F8093E8008091C7018093F100809113 -:107E8000E8008E778093E80056DD1BC08823C9F494 -:107E90009091CB019230A8F48091E800877F809385 -:107EA000E8009093C70147DD8091C701882331F432 -:107EB0008091E30087FD02C081E001C084E08EBBB9 -:107EC00052DC8091E80083FF0AC08091EB00806261 -:107ED0008093EB008091E800877F8093E8000F900B -:107EE0000F90CF91DF911F910F91089508951F93E7 -:107EF0008EB3882361F01091E9001092E90080911F -:107F0000E80083FF01C0E4DE17701093E9001F91C1 -:107F10000895F999FECF92BD81BDF89A992780B551 -:107F20000895262FF999FECF1FBA92BD81BD20BDBD -:107F30000FB6F894FA9AF99A0FBE01960895F8943C -:027F4000FFCF71 -:107F42004341544552494E41007700080000000069 -:107F52000000080112011001020000084F1B0792E5 -:107F620001000201000109023E0002010080320903 -:107F72000400000102020100052400100104240291 -:107F8200040524060001070582030800FF09040115 -:107F920000020A0000000705040210000107058321 -:107FA200021000010403090422034C0069006C0062 -:107FB2007900500061006400550053004200200027 -:107FC2002000200020002000200000002A0353008F -:107FD2007000610072006B00460075006E002000A8 -:107FE20045006C0065006300740072006F006E0053 -:087FF200690063007300000048 -:040000030000700089 -:00000001FF +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000FCC400005AC0000048 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C000005DC000004CC000004AC00000FD +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E2E467 +:1070C000FFE702C005900D92A83BB107D9F711E088 +:1070D000A8EBB1E001C01D92A13DB107E1F74FD38C +:1070E0002EC78ECFF89410926F001092810081E02D +:1070F00085BF15BE47985D9A289A0C9400000895A4 +:107100001F920F920FB60F9211242F938F939F937C +:10711000EF93FF9310928500109284008091B80144 +:107120009091B901009741F001979093B901809334 +:10713000B801892B09F45D9A8091BA019091BB0145 +:10714000009741F001979093BB018093BA01892B7E +:1071500009F4289A8091BE019091BF010196909305 +:10716000BF018093BE01E0E0F0E0859194918F5FD4 +:107170009F4F49F08091BC019091BD010196909381 +:10718000BD018093BC01FF91EF919F918F912F9151 +:107190000F900FBE0F901F90189584E08093E90028 +:1071A0000DC08091E8008B778093E80003C08EB318 +:1071B000882351F08091E80082FFF9CF8091E800A8 +:1071C00085FFEFCF8091F1000895982F83E08093A1 +:1071D000E9008091E80085FD0DC08091E8008E7780 +:1071E0008093E80003C08EB3882369F08091E800A3 +:1071F00080FFF9CF9093F1005D9884E690E0909342 +:10720000B9018093B80108954F925F926F927F9277 +:107210008F929F92AF92BF92CF92DF92EF92FF92A6 +:107220000F931F93CF93DF9384E08093E9008091C5 +:10723000E80082FF57C2289884E690E09093BB0153 +:107240008093BA01AADF182F853481F48CEA9DE07F +:107250009093BD018093BC0107B600FCFDCFF99966 +:10726000FECF81E180935700E89503C0843519F47F +:1072700094DF8DE00DC28C34E1F38035D1F3843797 +:1072800021F484E4A2DF80E003C2813611F489E5B1 +:10729000FFC18134B1F481DF182F7FDF90E0880FC8 +:1072A000991FAA2797FDA095BA2F312F330F20E001 +:1072B000442737FD4095542F822B932BA42BB52BBD +:1072C000B8C1803711F483E5E3C1833549F4C0E0E8 +:1072D000D1E089917ADF21E0C730D207D1F7D9C157 +:1072E000863521F481E371DF80E3D2C1833731F445 +:1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD +:10730000E0E0F0E093E085E090935700E89507B661 +:1073100000FCFDCF80935700E89507B600FCFDCF39 +:10732000E058FF4FA0E7E030FA0771F7A2CF8237AD +:1073300039F4E1E0F0E089E0809357008491A8C13E +:10734000863439F4E0E0F0E089E0809357008491DE +:107350009FC18E3439F4E3E0F0E089E08093570078 +:10736000849196C1813539F4E2E0F0E089E08093C0 +:10737000570084918DC1823631F489E526DF80E0A3 +:1073800024DF80E885C1823419F0873609F0E5C032 +:107390001092BD011092BC0100DF082FFEDEF82E16 +:1073A000FCDE682E8554823008F071C1902F80E099 +:1073B000CF2DD0E0C82BD92B10926F00173609F0D3 +:1073C0004BC081E180935700E895DD24CC24C39421 +:1073D0003FC0E090C101F090C2010091C301109143 +:1073E000C401B6E46B16D9F4ED2DF0E0EE29FF29C7 +:1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 +:10740000B0E0E80EF91E0A1F1B1FE092C101F092C6 +:10741000C2010093C3011093C401DC2418C0D80139 +:10742000C701B695A7959795879573D5CEDE82E06F +:1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA +:10744000C101F092C2010093C3011093C4012197BE +:10745000209709F0BECF7DC08090C1019090C201FD +:10746000A090C301B090C40196E4691609F05DC014 +:1074700083E0F40180935700E89507B600FCFDCF48 +:1074800054C0F6E46F1661F5772031F1E090C10148 +:10749000F090C2010091C3011091C4017EDED82E8C +:1074A000CC24852D90E08C299D29F7010C01409278 +:1074B0005700E895112482E090E0A0E0B0E0E80EEB +:1074C000F91E0A1F1B1FE092C101F092C201009336 +:1074D000C3011093C40102C060DE582E742423C07F +:1074E000E090C101F090C2010091C3011091C4016C +:1074F00016950795F794E79450DE682FC70111D5CC +:107500008091C1019091C201A091C301B091C401C9 +:107510000296A11DB11D8093C1019093C201A09359 +:10752000C301B093C401219704C055247724442497 +:107530004394209709F0A5CF96E4691641F485E0BD +:10754000F40180935700E89507B600FCFDCF8DE06D +:107550003CDE82E080936F009CC0833471F4009124 +:10756000C1011091C20119DE90E021E0F8010C0187 +:1075700020935700E89511247CCE833619F5E090CE +:10758000C101F090C2010091C3011091C40105DE58 +:10759000F701E16090E021E00C0120935700E895AD +:1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E +:1075B0001B1FE092C101F092C2010093C30110931E +:1075C000C40157CE8D3661F4E091C101F091C20142 +:1075D00085E080935700E89507B600FCFDCF49CEC3 +:1075E000823551F4E091C101F091C20105911491ED +:1075F000812FEBDD802F4CC0843421F5E090C10158 +:10760000F090C2010091C3011091C4011695079535 +:10761000F794E794C2DD682FC70183D48091C1013C +:107620009091C201A091C301B091C4010296A11D25 +:10763000B11D8093C1019093C201A093C301B09387 +:10764000C40117CE843609F5E090C101F090C20163 +:107650000091C3011091C401D801C701B695A79547 +:107660009795879556D4B1DD82E090E0A0E0B0E038 +:10767000E80EF91E0A1F1B1FE092C101F092C20121 +:107680000093C3011093C40104C08B3111F08FE348 +:107690009CDD83E08093E9009091E8008091E80010 +:1076A0008E778093E80095FF04C010C08EB38823C6 +:1076B000C9F08091E80080FFF9CF8091E8008E77D3 +:1076C0008093E80003C08EB3882361F08091E800C6 +:1076D00080FFF9CF84E08093E9008091E8008B7708 +:1076E0008093E800DF91CF911F910F91FF90EF9071 +:1076F000DF90CF90BF90AF909F908F907F906F90D2 +:107700005F904F9008959091C901892F8F778132B2 +:1077100049F58091CA018032A1F0813219F5913A80 +:1077200009F58091E800877F8093E8008CE091E084 +:1077300067E070E025D28091E8008B778093E800C5 +:107740000895913279F48091E800877F8093E80072 +:107750008CE091E067E070E077D28091E8008E776E +:107760008093E800089582E061EC42E0D1D083E0AC +:1077700061E842E1CDD084E060E842E1C9C01F93F6 +:10778000209100081092000844B714BE88E10FB69B +:10779000F89480936000109260000FBE80E8E0E0F3 +:1077A000F0E00FB6F89480936100E09361000FBEA3 +:1077B00031E035BF92E095BF3F9A209A559A809369 +:1077C00061001092610047985D9A289A1092890092 +:1077D0008AEF8093880090936F0083E0809381000C +:1077E000859194918F5F9F4F11F03093C001942F3A +:1077F00041FF19C0809109012817A9F08093000862 +:10780000789480911301882339F08091BE01909182 +:10781000BF0188579140C8F310920008F89481E0A6 +:10782000809313010CC090FF04C08091C001882395 +:1078300051F493FF09C080910901281729F0809124 +:10784000C001882309F04EDCD4D078941092BD0199 +:107850001092BC011EEF20C0D7DC49D38091BC013F +:107860009091BD01815A9F4010F0109213018091B8 +:10787000C5019091C60101969093C6018093C50100 +:10788000292F97FF03C0512F591B252F220F28178F +:1078900010F4479801C0479A809113018823E1F6BC +:1078A0008091E00081608093E0001CDC80E090E04B +:1078B0001F910895FA01923049F0933061F09130B0 +:1078C000F9F484E191E022E130E01EC086E291E02B +:1078D0002EE330E019C0882329F484E691E024E007 +:1078E00030E012C0813029F488E691E022E230E0F5 +:1078F0000BC0823029F48CE891E02AE230E004C029 +:1079000080E090E020E030E091838083C901089519 +:107910008093E9008091EB0081608093EB001092EE +:10792000ED006093EC004093ED008091EE00881F25 +:107930008827881F08958091C90188238CF403C08B +:107940008EB38823B1F08091E80082FFF9CF809157 +:10795000E8008B778093E80008958EB3882349F080 +:107960008091E80080FFF9CF8091E8008E778093C6 +:10797000E8000895EF92FF920F931F9345D04CD0EB +:1079800008ED10E0F80180818F7780838081806826 +:10799000808380818F7D808319BC1EBA1092C701BD +:1079A00080EEE82EF12CF70180818B7F8083F80137 +:1079B00080818160808380E060E042E0A9DFE1EEC9 +:1079C000F0E080818E7F8083E2EEF0E08081816054 +:1079D0008083808188608083F70180818E7F8083AF +:1079E000F8018081806180831F910F91FF90EF905B +:1079F0000895E7EDF0E08081816080838AE482BFB2 +:107A000081E08093C801B6CFE8EDF0E080818E7F01 +:107A100080831092E20008951092DA001092E10043 +:107A200008951F920F920FB60F9211242F933F9338 +:107A30004F935F936F937F938F939F93AF93BF9376 +:107A4000EF93FF938091DA0080FF1AC08091D800F5 +:107A500080FF16C08091DA008E7F8093DA008091DB +:107A6000D90080FF0AC019BC82E089BD09B400FEBC +:107A7000FDCF81E08EBB3AD203C019BC1EBA36D20C +:107A80008091E10080FF17C08091E20080FF13C069 +:107A90008091E2008E7F8093E2008091E20080611D +:107AA0008093E2008091D80080628093D80019BC56 +:107AB00085E08EBB1BD28091E10084FF2BC08091BA +:107AC000E20084FF27C019BC82E089BD09B400FE32 +:107AD000FDCF8091D8008F7D8093D8008091E10008 +:107AE0008F7E8093E1008091E2008F7E8093E200A0 +:107AF0008091E20081608093E2008091C701882339 +:107B000031F48091E30087FD02C081E001C084E090 +:107B10008EBBECD18091E10083FF21C08091E20017 +:107B200083FF1DC08091E100877F8093E10082E0A8 +:107B30008EBB1092C7018091E1008E7F8093E1009F +:107B40008091E2008E7F8093E2008091E20080616C +:107B50008093E20080E060E042E0DADEC7D1FF918E +:107B6000EF91BF91AF919F918F917F916F915F91B5 +:107B70004F913F912F910F900FBE0F901F9018952E +:107B80009C014091CF015091D0014617570718F43E +:107B9000F90190E044C06115710511F0AB01F8CF17 +:107BA0008091E8008E778093E80040E050E0F0CFCD +:107BB0008EB3882309F444C0853009F443C0809112 +:107BC000E80083FF02C081E008958091E80082FD13 +:107BD00031C08091E80080FF22C08091F300909135 +:107BE000F200782F60E0292F30E0262B372B07C0DA +:107BF00081918093F100415050402F5F3F4F4115DC +:107C0000510519F02830310598F390E028303105FE +:107C100009F491E08091E8008E778093E8004115A7 +:107C2000510531F6992321F605C08EB3882341F022 +:107C3000853041F08091E80082FFF7CF80E0089521 +:107C400082E0089583E008959C016115710529F48F +:107C50008091E8008B778093E800F90126C08EB30D +:107C6000882391F1853091F18091E80083FF02C073 +:107C700081E008958091E80082FFF1CF06C08091F5 +:107C8000F10081936150704059F02091F300809190 +:107C9000F200322F20E090E0822B932B892B79F792 +:107CA0008091E8008B778093E80061157105B9F643 +:107CB00005C08EB3882341F0853041F08091E80003 +:107CC00080FFF7CF80E0089582E0089583E0089573 +:107CD0000F931F93DF93CF9300D0CDB7DEB7E9ECBE +:107CE000F1E08091F100819381E0E13DF807C9F76F +:107CF0000ADD8091E80083FFE4C08091C901909182 +:107D0000CA01953009F46DC0963040F4913081F18C +:107D1000913070F0933009F0D4C02AC0983009F443 +:107D2000A3C0993009F4B2C0963009F0CAC07CC033 +:107D3000803809F4C6C0823809F0C3C08091CD01F3 +:107D400087708093E9008091EB001092E900209108 +:107D5000E800277F2093E80090E025E0969587953E +:107D60002A95E1F781708093F1001092F10087C0AD +:107D7000882319F0823009F0A4C08F71823009F095 +:107D8000A0C08091CB01882331F52091CD012770CF +:107D900009F497C02093E9008091EB0080FF1BC09D +:107DA000933021F48091EB00806213C08091EB004E +:107DB00080618093EB0081E090E002C0880F991F02 +:107DC0002A95E2F78093EA001092EA008091EB0096 +:107DD00088608093EB001092E9008091E800877F33 +:107DE00051C0882309F06DC01091CB011F770FB7E8 +:107DF000F8948091E800877F8093E8009CDD809173 +:107E0000E80080FFFCCF8091E3008078812B809395 +:107E1000E30080688093E300112311F482E001C045 +:107E200083E08EBB0FBF4DC08058823008F049C040 +:107E30008091CB019091CC016091CD01AE014F5F5B +:107E40005F4F38DDBC01009709F43BC08091E8002A +:107E5000877F8093E80089819A8192DE8091E80093 +:107E60008B778093E8002DC0803859F58091E80029 +:107E7000877F8093E8008091C7018093F100809113 +:107E8000E8008E778093E80056DD1BC08823C9F494 +:107E90009091CB019230A8F48091E800877F809385 +:107EA000E8009093C70147DD8091C701882331F432 +:107EB0008091E30087FD02C081E001C084E08EBBB9 +:107EC00052DC8091E80083FF0AC08091EB00806261 +:107ED0008093EB008091E800877F8093E8000F900B +:107EE0000F90CF91DF911F910F91089508951F93E7 +:107EF0008EB3882361F01091E9001092E90080911F +:107F0000E80083FF01C0E4DE17701093E9001F91C1 +:107F10000895F999FECF92BD81BDF89A992780B551 +:107F20000895262FF999FECF1FBA92BD81BD20BDBD +:107F30000FB6F894FA9AF99A0FBE01960895F8943C +:027F4000FFCF71 +:107F42004341544552494E41007700080000000069 +:107F52000000080112011001020000084F1B0792E5 +:107F620001000201000109023E0002010080320903 +:107F72000400000102020100052400100104240291 +:107F8200040524060001070582030800FF09040115 +:107F920000020A0000000705040210000107058321 +:107FA200021000010403090422034C0069006C0062 +:107FB2007900500061006400550053004200200027 +:107FC2002000200020002000200000002A0353008F +:107FD2007000610072006B00460075006E002000A8 +:107FE20045006C0065006300740072006F006E0053 +:087FF200690063007300000048 +:040000030000700089 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.c b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.c index 9a5908150d7..296c62b5b78 100644 --- a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.c +++ b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.c @@ -1,780 +1,780 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. - */ - -#define INCLUDE_FROM_CATERINA_C -#include "Caterina.h" - -/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some - * operating systems will not open the port unless the settings can be set successfully. - */ -static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, - .CharFormat = CDC_LINEENCODING_OneStopBit, - .ParityType = CDC_PARITY_None, - .DataBits = 8 }; - -/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, - * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued - * command.) - */ -static uint32_t CurrAddress; - -/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite - * loop until the AVR restarts and the application runs. - */ -static bool RunBootloader = true; - -/* Pulse generation counters to keep track of the time remaining for each pulse type */ -#define TX_RX_LED_PULSE_PERIOD 100 -uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse -uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse - -/* Bootloader timeout timer */ -// MAH 8/15/12- change so timeouts work properly when the chip is running at 8MHz instead of 16. -#define TIMEOUT_PERIOD 4000 -#define EXT_RESET_TIMEOUT_PERIOD 375 - - -/********************************************************************************************************* -LilyPadUSB bootloader code -The LilyPadUSB bootloader has been changed to remove the 8-second delay after external reset which is in -the Leonardo. To enter the bootloader, the user should execute TWO external resets within 750 ms; that is, -press the reset button twice, quickly.\ - -Some other changes were made to allow this code to compile tightly enough to fit in the alloted 4k of -bootloader space. -*/ -// MAH 8/15/12- added this flag to replace the bulky program memory reads to check for the presence of a sketch -// at the top of the memory space. -static bool sketchPresent = false; - -// MAH 8/15/12- make this volatile, since we modify it in one place and read it in another, we want to make -// sure we're always working on the copy in memory and not an erroneous value stored in a cache somewhere. -// This variable stores the length of time we've been in the bootloader when waiting for the 8 second delay. -volatile uint16_t Timeout = 0; -// MAH 8/15/12- added this for delay during startup. Did not use existing Timeout value b/c it only increments -// when there's a sketch at the top of the memory. -volatile uint16_t resetTimeout = 0; - -// MAH 8/15/12- let's make this an 8-bit value instead of 16- that saves on memory because 16-bit addition and -// comparison compiles to bulkier code. Note that this does *not* require a change to the Arduino core- we're -// just sort of ignoring the extra byte that the Arduino core puts at the next location. -uint8_t bootKey = 0x77; -volatile uint8_t *const bootKeyPtr = (volatile uint8_t *)0x0800; - -// StartSketch() is called to clean up our mess before passing execution to the sketch. -void StartSketch(void) -{ - cli(); - - /* Undo TIMER1 setup and clear the count before running the sketch */ - TIMSK1 = 0; - TCCR1B = 0; - - /* Relocate the interrupt vector table to the application section */ - MCUCR = (1 << IVCE); - MCUCR = 0; - - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - /* jump to beginning of application space */ - __asm__ volatile("jmp 0x0000"); - -} - -uint16_t LLEDPulse; - -/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until it times out or is instructed to exit. - */ -int main(void) -{ - /* Save the value of the boot key memory before it is overwritten */ - uint8_t bootKeyPtrVal = *bootKeyPtr; - *bootKeyPtr = 0; - - /* Check the reason for the reset so we can act accordingly */ - uint8_t mcusr_state = MCUSR; // store the initial state of the Status register - MCUSR = 0; // clear all reset flags - - /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ - // MAH 8/15/12- I removed this because wdt_disable() is the first thing SetupHardware() does- why - // do it twice right in a row? - //wdt_disable(); - - /* Setup hardware required for the bootloader */ - // MAH 8/15/12- Moved this up to before the bootloader go/no-go decision tree so I could use the - // timer in that decision tree. Removed the USBInit() call from it; if I'm not going to stay in - // the bootloader, there's no point spending the time initializing the USB. - // SetupHardware(); - wdt_disable(); - - // Disable clock division - clock_prescale_set(clock_div_1); - - // Relocate the interrupt vector table to the bootloader section - MCUCR = (1 << IVCE); - MCUCR = (1 << IVSEL); - - LED_SETUP(); - CPU_PRESCALE(0); - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - // Initialize TIMER1 to handle bootloader timeout and LED tasks. - // With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz - // Our chosen compare match generates an interrupt every 1 ms. - // This interrupt is disabled selectively when doing memory reading, erasing, - // or writing since SPM has tight timing requirements. - - OCR1AH = 0; - OCR1AL = 250; - TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt - TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input - - - // MAH 8/15/12- this replaces bulky pgm_read_word(0) calls later on, to save memory. - if (pgm_read_word(0) != 0xFFFF) sketchPresent = true; - -// MAH 26 Oct 2012- The "bootload or not?" section has been modified since the code released -// with Arduino 1.0.1. The simplest modification is the replacement of equivalence checks on -// the reset bits with masked checks, so if more than one reset occurs before the register is -// checked, the check doesn't fail and fall through to the bootloader unnecessarily. - -// The second, more in depth modification addresses behavior after an external reset (i.e., -// user pushes the reset button). The Leonardo treats all external resets as requests to -// re-enter the bootloader and wait for code to be loaded. It remains in bootloader mode for -// 8 seconds before continuing on to the sketch (if one is present). By defining RESET_DELAY -// equal to 1, this behavior will persist. - -// However, if RESET_DELAY is defined to 0, the reset timeout before loading the sketch drops -// to 750ms. If, during that 750ms, another external reset occurs, THEN an 8-second delay -// in the bootloader will occur. - - // This is the "no-8-second-delay" code. If this is the first time through the loop, we - // don't expect to see the bootKey in memory. - if ( (mcusr_state & (1< EXT_RESET_TIMEOUT_PERIOD) // resetTimeout is getting incremeted - RunBootloader = false; // in the timer1 ISR. - } - // If we make it past that while loop, it's sketch loading time! - *bootKeyPtr = 0; // clear out the bootKey; from now on, we want to treat a reset like - // a normal reset. - cli(); // Disable interrupts, in case no sketch is present. - RunBootloader = true; // We want to hang out in the bootloader if no sketch is present. - if (sketchPresent) StartSketch(); // If a sketch is present, go! Otherwise, wait around - // in the bootloader until one is uploaded. - } - // On a power-on reset, we ALWAYS want to go to the sketch. If there is one. - // This is a place where the old code had an equivalence and now there is a mask. - else if ( (mcusr_state & (1< TIMEOUT_PERIOD) - RunBootloader = false; - - // MAH 8/15/12- This used to be a function call- inlining it saves a few bytes. - LLEDPulse++; - uint8_t p = LLEDPulse >> 8; - if (p > 127) - p = 254-p; - p += p; - if (((uint8_t)LLEDPulse) > p) - L_LED_OFF(); - else - L_LED_ON(); - } - - /* Disconnect from the host - USB interface will be reset later along with the AVR */ - USB_Detach(); - - /* Jump to beginning of application space to run the sketch - do not reset */ - StartSketch(); -} - -// Timer1 is set up to provide periodic interrupts. This is used to flicker the LEDs during -// programming as well as to generate the clock counts which determine how long the board should -// remain in bootloading mode. - -ISR(TIMER1_COMPA_vect, ISR_BLOCK) -{ - /* Reset counter */ - TCNT1H = 0; - TCNT1L = 0; - - /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ - if (TxLEDPulse && !(--TxLEDPulse)) - TX_LED_OFF(); - if (RxLEDPulse && !(--RxLEDPulse)) - RX_LED_OFF(); - resetTimeout++; // Needed for the "short reset delay" mode- governs the time the board waits - // for a second reset before loading the sketch. - if (pgm_read_word(0) != 0xFFFF) - Timeout++; -} - -// MAH 29 Oct 2012 Nothing below this point has to change for the LilyPadUSB support - -/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready - * to relay data to and from the attached USB host. - */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - /* Setup CDC Notification, Rx and Tx Endpoints */ - Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, - ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); -} - -/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to - * the device from the USB host before passing along unhandled control requests to the library for processing - * internally. - */ -void EVENT_USB_Device_ControlRequest(void) -{ - /* Ignore any requests that aren't directed to the CDC interface */ - if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != - (REQTYPE_CLASS | REQREC_INTERFACE)) - { - return; - } - - /* Process CDC specific control requests */ - switch (USB_ControlRequest.bRequest) - { - case CDC_REQ_GetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Write the line coding data to the control endpoint */ - Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearOUT(); - } - - break; - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Read the line coding data in from the host into the global struct */ - Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearIN(); - } - - break; - } -} - -#if !defined(NO_BLOCK_SUPPORT) -/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending - * on the AVR910 protocol command issued. - * - * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform - */ -static void ReadWriteMemoryBlock(const uint8_t Command) -{ - uint16_t BlockSize; - char MemoryType; - - bool HighByte = false; - uint8_t LowByte = 0; - - BlockSize = (FetchNextCommandByte() << 8); - BlockSize |= FetchNextCommandByte(); - - MemoryType = FetchNextCommandByte(); - - if ((MemoryType != 'E') && (MemoryType != 'F')) - { - /* Send error byte back to the host */ - WriteNextResponseByte('?'); - - return; - } - - /* Disable timer 1 interrupt - can't afford to process nonessential interrupts - * while doing SPM tasks */ - TIMSK1 = 0; - - /* Check if command is to read memory */ - if (Command == 'g') - { - /* Re-enable RWW section */ - boot_rww_enable(); - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* Read the next FLASH byte from the current FLASH page */ - #if (FLASHEND > 0xFFFF) - WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); - #else - WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); - #endif - - /* If both bytes in current word have been read, increment the address counter */ - if (HighByte) - CurrAddress += 2; - - HighByte = !HighByte; - } - else - { - /* Read the next EEPROM byte into the endpoint */ - WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - } - else - { - uint32_t PageStartAddress = CurrAddress; - - if (MemoryType == 'F') - { - boot_page_erase(PageStartAddress); - boot_spm_busy_wait(); - } - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* If both bytes in current word have been written, increment the address counter */ - if (HighByte) - { - /* Write the next FLASH word to the current FLASH page */ - boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - else - { - LowByte = FetchNextCommandByte(); - } - - HighByte = !HighByte; - } - else - { - /* Write the next EEPROM byte from the endpoint */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - - /* If in FLASH programming mode, commit the page after writing */ - if (MemoryType == 'F') - { - /* Commit the flash page to memory */ - boot_page_write(PageStartAddress); - - /* Wait until write operation has completed */ - boot_spm_busy_wait(); - } - - /* Send response byte back to the host */ - WriteNextResponseByte('\r'); - } - - /* Re-enable timer 1 interrupt disabled earlier in this routine */ - TIMSK1 = (1 << OCIE1A); -} -#endif - -/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed - * to allow reception of the next data packet from the host. - * - * \return Next received byte from the host in the CDC data OUT endpoint - */ -static uint8_t FetchNextCommandByte(void) -{ - /* Select the OUT endpoint so that the next data byte can be read */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* If OUT endpoint empty, clear it and wait for the next packet from the host */ - while (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearOUT(); - - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return 0; - } - } - - /* Fetch the next byte from the OUT endpoint */ - return Endpoint_Read_8(); -} - -/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the - * bank when full ready for the next byte in the packet to the host. - * - * \param[in] Response Next response byte to send to the host - */ -static void WriteNextResponseByte(const uint8_t Response) -{ - /* Select the IN endpoint so that the next data byte can be written */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ - if (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearIN(); - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Write the next byte to the IN endpoint */ - Endpoint_Write_8(Response); - - TX_LED_ON(); - TxLEDPulse = TX_RX_LED_PULSE_PERIOD; -} - -#define STK_OK 0x10 -#define STK_INSYNC 0x14 // ' ' -#define CRC_EOP 0x20 // 'SPACE' -#define STK_GET_SYNC 0x30 // '0' - -#define STK_GET_PARAMETER 0x41 // 'A' -#define STK_SET_DEVICE 0x42 // 'B' -#define STK_SET_DEVICE_EXT 0x45 // 'E' -#define STK_LOAD_ADDRESS 0x55 // 'U' -#define STK_UNIVERSAL 0x56 // 'V' -#define STK_PROG_PAGE 0x64 // 'd' -#define STK_READ_PAGE 0x74 // 't' -#define STK_READ_SIGN 0x75 // 'u' - -/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions - * and send the appropriate response back to the host. - */ -void CDC_Task(void) -{ - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Check if endpoint has a command in it sent from the host */ - if (!(Endpoint_IsOUTReceived())) - return; - - RX_LED_ON(); - RxLEDPulse = TX_RX_LED_PULSE_PERIOD; - - /* Read in the bootloader command (first byte sent from host) */ - uint8_t Command = FetchNextCommandByte(); - - if (Command == 'E') - { - /* We nearly run out the bootloader timeout clock, - * leaving just a few hundred milliseconds so the - * bootloder has time to respond and service any - * subsequent requests */ - Timeout = TIMEOUT_PERIOD - 500; - - /* Re-enable RWW section - must be done here in case - * user has disabled verification on upload. */ - boot_rww_enable_safe(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'T') - { - FetchNextCommandByte(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if ((Command == 'L') || (Command == 'P')) - { - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 't') - { - // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader - WriteNextResponseByte(0x44); - WriteNextResponseByte(0x00); - } - else if (Command == 'a') - { - // Indicate auto-address increment is supported - WriteNextResponseByte('Y'); - } - else if (Command == 'A') - { - // Set the current address to that given by the host - CurrAddress = (FetchNextCommandByte() << 9); - CurrAddress |= (FetchNextCommandByte() << 1); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'p') - { - // Indicate serial programmer back to the host - WriteNextResponseByte('S'); - } - else if (Command == 'S') - { - // Write the 7-byte software identifier to the endpoint - for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) - WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); - } - else if (Command == 'V') - { - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); - } - else if (Command == 's') - { - WriteNextResponseByte(AVR_SIGNATURE_3); - WriteNextResponseByte(AVR_SIGNATURE_2); - WriteNextResponseByte(AVR_SIGNATURE_1); - } - else if (Command == 'e') - { - // Clear the application section of flash - for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) - { - boot_page_erase(CurrFlashAddress); - boot_spm_busy_wait(); - boot_page_write(CurrFlashAddress); - boot_spm_busy_wait(); - } - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) - else if (Command == 'l') - { - // Set the lock bits to those given by the host - boot_lock_bits_set(FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #endif - else if (Command == 'r') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); - } - else if (Command == 'F') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); - } - else if (Command == 'N') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); - } - else if (Command == 'Q') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); - } - #if !defined(NO_BLOCK_SUPPORT) - else if (Command == 'b') - { - WriteNextResponseByte('Y'); - - // Send block size to the host - WriteNextResponseByte(SPM_PAGESIZE >> 8); - WriteNextResponseByte(SPM_PAGESIZE & 0xFF); - } - else if ((Command == 'B') || (Command == 'g')) - { - // Keep resetting the timeout counter if we're receiving self-programming instructions - Timeout = 0; - // Delegate the block write/read to a separate function for clarity - ReadWriteMemoryBlock(Command); - } - #endif - #if !defined(NO_FLASH_BYTE_SUPPORT) - else if (Command == 'C') - { - // Write the high byte to the current flash page - boot_page_fill(CurrAddress, FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'c') - { - // Write the low byte to the current flash page - boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); - - // Increment the address - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'm') - { - // Commit the flash page to memory - boot_page_write(CurrAddress); - - // Wait until write operation has completed - boot_spm_busy_wait(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'R') - { - #if (FLASHEND > 0xFFFF) - uint16_t ProgramWord = pgm_read_word_far(CurrAddress); - #else - uint16_t ProgramWord = pgm_read_word(CurrAddress); - #endif - - WriteNextResponseByte(ProgramWord >> 8); - WriteNextResponseByte(ProgramWord & 0xFF); - } - #endif - #if !defined(NO_EEPROM_BYTE_SUPPORT) - else if (Command == 'D') - { - // Read the byte from the endpoint and write it to the EEPROM - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - // Increment the address after use - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'd') - { - // Read the EEPROM byte and write it to the endpoint - WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); - - // Increment the address after use - CurrAddress += 2; - } - #endif - else if (Command != 27) - { - // Unknown (non-sync) command, return fail code - WriteNextResponseByte('?'); - } - - - /* Select the IN endpoint */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* Remember if the endpoint is completely full before clearing it */ - bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); - - /* Send the endpoint data to the host */ - Endpoint_ClearIN(); - - /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ - if (IsEndpointFull) - { - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearIN(); - } - - /* Wait until the data has been sent to the host */ - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Acknowledge the command from the host */ - Endpoint_ClearOUT(); -} - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_CATERINA_C +#include "Caterina.h" + +/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some + * operating systems will not open the port unless the settings can be set successfully. + */ +static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, + .CharFormat = CDC_LINEENCODING_OneStopBit, + .ParityType = CDC_PARITY_None, + .DataBits = 8 }; + +/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, + * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued + * command.) + */ +static uint32_t CurrAddress; + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite + * loop until the AVR restarts and the application runs. + */ +static bool RunBootloader = true; + +/* Pulse generation counters to keep track of the time remaining for each pulse type */ +#define TX_RX_LED_PULSE_PERIOD 100 +uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse +uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse + +/* Bootloader timeout timer */ +// MAH 8/15/12- change so timeouts work properly when the chip is running at 8MHz instead of 16. +#define TIMEOUT_PERIOD 4000 +#define EXT_RESET_TIMEOUT_PERIOD 375 + + +/********************************************************************************************************* +LilyPadUSB bootloader code +The LilyPadUSB bootloader has been changed to remove the 8-second delay after external reset which is in +the Leonardo. To enter the bootloader, the user should execute TWO external resets within 750 ms; that is, +press the reset button twice, quickly.\ + +Some other changes were made to allow this code to compile tightly enough to fit in the alloted 4k of +bootloader space. +*/ +// MAH 8/15/12- added this flag to replace the bulky program memory reads to check for the presence of a sketch +// at the top of the memory space. +static bool sketchPresent = false; + +// MAH 8/15/12- make this volatile, since we modify it in one place and read it in another, we want to make +// sure we're always working on the copy in memory and not an erroneous value stored in a cache somewhere. +// This variable stores the length of time we've been in the bootloader when waiting for the 8 second delay. +volatile uint16_t Timeout = 0; +// MAH 8/15/12- added this for delay during startup. Did not use existing Timeout value b/c it only increments +// when there's a sketch at the top of the memory. +volatile uint16_t resetTimeout = 0; + +// MAH 8/15/12- let's make this an 8-bit value instead of 16- that saves on memory because 16-bit addition and +// comparison compiles to bulkier code. Note that this does *not* require a change to the Arduino core- we're +// just sort of ignoring the extra byte that the Arduino core puts at the next location. +uint8_t bootKey = 0x77; +volatile uint8_t *const bootKeyPtr = (volatile uint8_t *)0x0800; + +// StartSketch() is called to clean up our mess before passing execution to the sketch. +void StartSketch(void) +{ + cli(); + + /* Undo TIMER1 setup and clear the count before running the sketch */ + TIMSK1 = 0; + TCCR1B = 0; + + /* Relocate the interrupt vector table to the application section */ + MCUCR = (1 << IVCE); + MCUCR = 0; + + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + /* jump to beginning of application space */ + __asm__ volatile("jmp 0x0000"); + +} + +uint16_t LLEDPulse; + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until it times out or is instructed to exit. + */ +int main(void) +{ + /* Save the value of the boot key memory before it is overwritten */ + uint8_t bootKeyPtrVal = *bootKeyPtr; + *bootKeyPtr = 0; + + /* Check the reason for the reset so we can act accordingly */ + uint8_t mcusr_state = MCUSR; // store the initial state of the Status register + MCUSR = 0; // clear all reset flags + + /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ + // MAH 8/15/12- I removed this because wdt_disable() is the first thing SetupHardware() does- why + // do it twice right in a row? + //wdt_disable(); + + /* Setup hardware required for the bootloader */ + // MAH 8/15/12- Moved this up to before the bootloader go/no-go decision tree so I could use the + // timer in that decision tree. Removed the USBInit() call from it; if I'm not going to stay in + // the bootloader, there's no point spending the time initializing the USB. + // SetupHardware(); + wdt_disable(); + + // Disable clock division + clock_prescale_set(clock_div_1); + + // Relocate the interrupt vector table to the bootloader section + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + LED_SETUP(); + CPU_PRESCALE(0); + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + // Initialize TIMER1 to handle bootloader timeout and LED tasks. + // With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz + // Our chosen compare match generates an interrupt every 1 ms. + // This interrupt is disabled selectively when doing memory reading, erasing, + // or writing since SPM has tight timing requirements. + + OCR1AH = 0; + OCR1AL = 250; + TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt + TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input + + + // MAH 8/15/12- this replaces bulky pgm_read_word(0) calls later on, to save memory. + if (pgm_read_word(0) != 0xFFFF) sketchPresent = true; + +// MAH 26 Oct 2012- The "bootload or not?" section has been modified since the code released +// with Arduino 1.0.1. The simplest modification is the replacement of equivalence checks on +// the reset bits with masked checks, so if more than one reset occurs before the register is +// checked, the check doesn't fail and fall through to the bootloader unnecessarily. + +// The second, more in depth modification addresses behavior after an external reset (i.e., +// user pushes the reset button). The Leonardo treats all external resets as requests to +// re-enter the bootloader and wait for code to be loaded. It remains in bootloader mode for +// 8 seconds before continuing on to the sketch (if one is present). By defining RESET_DELAY +// equal to 1, this behavior will persist. + +// However, if RESET_DELAY is defined to 0, the reset timeout before loading the sketch drops +// to 750ms. If, during that 750ms, another external reset occurs, THEN an 8-second delay +// in the bootloader will occur. + + // This is the "no-8-second-delay" code. If this is the first time through the loop, we + // don't expect to see the bootKey in memory. + if ( (mcusr_state & (1< EXT_RESET_TIMEOUT_PERIOD) // resetTimeout is getting incremeted + RunBootloader = false; // in the timer1 ISR. + } + // If we make it past that while loop, it's sketch loading time! + *bootKeyPtr = 0; // clear out the bootKey; from now on, we want to treat a reset like + // a normal reset. + cli(); // Disable interrupts, in case no sketch is present. + RunBootloader = true; // We want to hang out in the bootloader if no sketch is present. + if (sketchPresent) StartSketch(); // If a sketch is present, go! Otherwise, wait around + // in the bootloader until one is uploaded. + } + // On a power-on reset, we ALWAYS want to go to the sketch. If there is one. + // This is a place where the old code had an equivalence and now there is a mask. + else if ( (mcusr_state & (1< TIMEOUT_PERIOD) + RunBootloader = false; + + // MAH 8/15/12- This used to be a function call- inlining it saves a few bytes. + LLEDPulse++; + uint8_t p = LLEDPulse >> 8; + if (p > 127) + p = 254-p; + p += p; + if (((uint8_t)LLEDPulse) > p) + L_LED_OFF(); + else + L_LED_ON(); + } + + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); + + /* Jump to beginning of application space to run the sketch - do not reset */ + StartSketch(); +} + +// Timer1 is set up to provide periodic interrupts. This is used to flicker the LEDs during +// programming as well as to generate the clock counts which determine how long the board should +// remain in bootloading mode. + +ISR(TIMER1_COMPA_vect, ISR_BLOCK) +{ + /* Reset counter */ + TCNT1H = 0; + TCNT1L = 0; + + /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ + if (TxLEDPulse && !(--TxLEDPulse)) + TX_LED_OFF(); + if (RxLEDPulse && !(--RxLEDPulse)) + RX_LED_OFF(); + resetTimeout++; // Needed for the "short reset delay" mode- governs the time the board waits + // for a second reset before loading the sketch. + if (pgm_read_word(0) != 0xFFFF) + Timeout++; +} + +// MAH 29 Oct 2012 Nothing below this point has to change for the LilyPadUSB support + +/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready + * to relay data to and from the attached USB host. + */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + /* Setup CDC Notification, Rx and Tx Endpoints */ + Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, + ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); +} + +/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to + * the device from the USB host before passing along unhandled control requests to the library for processing + * internally. + */ +void EVENT_USB_Device_ControlRequest(void) +{ + /* Ignore any requests that aren't directed to the CDC interface */ + if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != + (REQTYPE_CLASS | REQREC_INTERFACE)) + { + return; + } + + /* Process CDC specific control requests */ + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Write the line coding data to the control endpoint */ + Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearOUT(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Read the line coding data in from the host into the global struct */ + Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearIN(); + } + + break; + } +} + +#if !defined(NO_BLOCK_SUPPORT) +/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending + * on the AVR910 protocol command issued. + * + * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform + */ +static void ReadWriteMemoryBlock(const uint8_t Command) +{ + uint16_t BlockSize; + char MemoryType; + + bool HighByte = false; + uint8_t LowByte = 0; + + BlockSize = (FetchNextCommandByte() << 8); + BlockSize |= FetchNextCommandByte(); + + MemoryType = FetchNextCommandByte(); + + if ((MemoryType != 'E') && (MemoryType != 'F')) + { + /* Send error byte back to the host */ + WriteNextResponseByte('?'); + + return; + } + + /* Disable timer 1 interrupt - can't afford to process nonessential interrupts + * while doing SPM tasks */ + TIMSK1 = 0; + + /* Check if command is to read memory */ + if (Command == 'g') + { + /* Re-enable RWW section */ + boot_rww_enable(); + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* Read the next FLASH byte from the current FLASH page */ + #if (FLASHEND > 0xFFFF) + WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); + #else + WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); + #endif + + /* If both bytes in current word have been read, increment the address counter */ + if (HighByte) + CurrAddress += 2; + + HighByte = !HighByte; + } + else + { + /* Read the next EEPROM byte into the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + } + else + { + uint32_t PageStartAddress = CurrAddress; + + if (MemoryType == 'F') + { + boot_page_erase(PageStartAddress); + boot_spm_busy_wait(); + } + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* If both bytes in current word have been written, increment the address counter */ + if (HighByte) + { + /* Write the next FLASH word to the current FLASH page */ + boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + else + { + LowByte = FetchNextCommandByte(); + } + + HighByte = !HighByte; + } + else + { + /* Write the next EEPROM byte from the endpoint */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + + /* If in FLASH programming mode, commit the page after writing */ + if (MemoryType == 'F') + { + /* Commit the flash page to memory */ + boot_page_write(PageStartAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + } + + /* Send response byte back to the host */ + WriteNextResponseByte('\r'); + } + + /* Re-enable timer 1 interrupt disabled earlier in this routine */ + TIMSK1 = (1 << OCIE1A); +} +#endif + +/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed + * to allow reception of the next data packet from the host. + * + * \return Next received byte from the host in the CDC data OUT endpoint + */ +static uint8_t FetchNextCommandByte(void) +{ + /* Select the OUT endpoint so that the next data byte can be read */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* If OUT endpoint empty, clear it and wait for the next packet from the host */ + while (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return 0; + } + } + + /* Fetch the next byte from the OUT endpoint */ + return Endpoint_Read_8(); +} + +/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the + * bank when full ready for the next byte in the packet to the host. + * + * \param[in] Response Next response byte to send to the host + */ +static void WriteNextResponseByte(const uint8_t Response) +{ + /* Select the IN endpoint so that the next data byte can be written */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ + if (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next byte to the IN endpoint */ + Endpoint_Write_8(Response); + + TX_LED_ON(); + TxLEDPulse = TX_RX_LED_PULSE_PERIOD; +} + +#define STK_OK 0x10 +#define STK_INSYNC 0x14 // ' ' +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' + +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' + +/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions + * and send the appropriate response back to the host. + */ +void CDC_Task(void) +{ + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Check if endpoint has a command in it sent from the host */ + if (!(Endpoint_IsOUTReceived())) + return; + + RX_LED_ON(); + RxLEDPulse = TX_RX_LED_PULSE_PERIOD; + + /* Read in the bootloader command (first byte sent from host) */ + uint8_t Command = FetchNextCommandByte(); + + if (Command == 'E') + { + /* We nearly run out the bootloader timeout clock, + * leaving just a few hundred milliseconds so the + * bootloder has time to respond and service any + * subsequent requests */ + Timeout = TIMEOUT_PERIOD - 500; + + /* Re-enable RWW section - must be done here in case + * user has disabled verification on upload. */ + boot_rww_enable_safe(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'T') + { + FetchNextCommandByte(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if ((Command == 'L') || (Command == 'P')) + { + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 't') + { + // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader + WriteNextResponseByte(0x44); + WriteNextResponseByte(0x00); + } + else if (Command == 'a') + { + // Indicate auto-address increment is supported + WriteNextResponseByte('Y'); + } + else if (Command == 'A') + { + // Set the current address to that given by the host + CurrAddress = (FetchNextCommandByte() << 9); + CurrAddress |= (FetchNextCommandByte() << 1); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'p') + { + // Indicate serial programmer back to the host + WriteNextResponseByte('S'); + } + else if (Command == 'S') + { + // Write the 7-byte software identifier to the endpoint + for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) + WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); + } + else if (Command == 'V') + { + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); + } + else if (Command == 's') + { + WriteNextResponseByte(AVR_SIGNATURE_3); + WriteNextResponseByte(AVR_SIGNATURE_2); + WriteNextResponseByte(AVR_SIGNATURE_1); + } + else if (Command == 'e') + { + // Clear the application section of flash + for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + } + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) + else if (Command == 'l') + { + // Set the lock bits to those given by the host + boot_lock_bits_set(FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #endif + else if (Command == 'r') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); + } + else if (Command == 'F') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); + } + else if (Command == 'N') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); + } + else if (Command == 'Q') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); + } + #if !defined(NO_BLOCK_SUPPORT) + else if (Command == 'b') + { + WriteNextResponseByte('Y'); + + // Send block size to the host + WriteNextResponseByte(SPM_PAGESIZE >> 8); + WriteNextResponseByte(SPM_PAGESIZE & 0xFF); + } + else if ((Command == 'B') || (Command == 'g')) + { + // Keep resetting the timeout counter if we're receiving self-programming instructions + Timeout = 0; + // Delegate the block write/read to a separate function for clarity + ReadWriteMemoryBlock(Command); + } + #endif + #if !defined(NO_FLASH_BYTE_SUPPORT) + else if (Command == 'C') + { + // Write the high byte to the current flash page + boot_page_fill(CurrAddress, FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'c') + { + // Write the low byte to the current flash page + boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); + + // Increment the address + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'm') + { + // Commit the flash page to memory + boot_page_write(CurrAddress); + + // Wait until write operation has completed + boot_spm_busy_wait(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'R') + { + #if (FLASHEND > 0xFFFF) + uint16_t ProgramWord = pgm_read_word_far(CurrAddress); + #else + uint16_t ProgramWord = pgm_read_word(CurrAddress); + #endif + + WriteNextResponseByte(ProgramWord >> 8); + WriteNextResponseByte(ProgramWord & 0xFF); + } + #endif + #if !defined(NO_EEPROM_BYTE_SUPPORT) + else if (Command == 'D') + { + // Read the byte from the endpoint and write it to the EEPROM + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + // Increment the address after use + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'd') + { + // Read the EEPROM byte and write it to the endpoint + WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); + + // Increment the address after use + CurrAddress += 2; + } + #endif + else if (Command != 27) + { + // Unknown (non-sync) command, return fail code + WriteNextResponseByte('?'); + } + + + /* Select the IN endpoint */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* Remember if the endpoint is completely full before clearing it */ + bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); + + /* Send the endpoint data to the host */ + Endpoint_ClearIN(); + + /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ + if (IsEndpointFull) + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + } + + /* Wait until the data has been sent to the host */ + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Acknowledge the command from the host */ + Endpoint_ClearOUT(); +} + diff --git a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.h b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.h index f8251d4837b..7836ed759a8 100644 --- a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.h +++ b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.h @@ -1,99 +1,99 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for BootloaderCDC.c. - */ - -#ifndef _CDC_H_ -#define _CDC_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - /* Macros: */ - /** Version major of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MAJOR 0x01 - - /** Version minor of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MINOR 0x00 - - /** Hardware version major of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MAJOR 0x01 - - /** Hardware version minor of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MINOR 0x00 - - /** Eight character bootloader firmware identifier reported to the host when requested */ - #define SOFTWARE_IDENTIFIER "CATERINA" - - #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) - #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); - #define L_LED_OFF() PORTC &= ~(1<<7) - #define L_LED_ON() PORTC |= (1<<7) - #define L_LED_TOGGLE() PORTC ^= (1<<7) - #define TX_LED_OFF() PORTD |= (1<<5) - #define TX_LED_ON() PORTD &= ~(1<<5) - #define RX_LED_OFF() PORTB |= (1<<0) - #define RX_LED_ON() PORTB &= ~(1<<0) - - /* Type Defines: */ - /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ - typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; - - /* Function Prototypes: */ - void StartSketch(void); - void LEDPulse(void); - - void CDC_Task(void); - void SetupHardware(void); - - void EVENT_USB_Device_ConfigurationChanged(void); - - #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) - #if !defined(NO_BLOCK_SUPPORT) - static void ReadWriteMemoryBlock(const uint8_t Command); - #endif - static uint8_t FetchNextCommandByte(void); - static void WriteNextResponseByte(const uint8_t Response); - #endif - -#endif - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for BootloaderCDC.c. + */ + +#ifndef _CDC_H_ +#define _CDC_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + /* Macros: */ + /** Version major of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MAJOR 0x01 + + /** Version minor of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MINOR 0x00 + + /** Hardware version major of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MAJOR 0x01 + + /** Hardware version minor of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MINOR 0x00 + + /** Eight character bootloader firmware identifier reported to the host when requested */ + #define SOFTWARE_IDENTIFIER "CATERINA" + + #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) + #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); + #define L_LED_OFF() PORTC &= ~(1<<7) + #define L_LED_ON() PORTC |= (1<<7) + #define L_LED_TOGGLE() PORTC ^= (1<<7) + #define TX_LED_OFF() PORTD |= (1<<5) + #define TX_LED_ON() PORTD &= ~(1<<5) + #define RX_LED_OFF() PORTB |= (1<<0) + #define RX_LED_ON() PORTB &= ~(1<<0) + + /* Type Defines: */ + /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /* Function Prototypes: */ + void StartSketch(void); + void LEDPulse(void); + + void CDC_Task(void); + void SetupHardware(void); + + void EVENT_USB_Device_ConfigurationChanged(void); + + #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) + #if !defined(NO_BLOCK_SUPPORT) + static void ReadWriteMemoryBlock(const uint8_t Command); + #endif + static uint8_t FetchNextCommandByte(void); + static void WriteNextResponseByte(const uint8_t Response); + #endif + +#endif + diff --git a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.c b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.c index f58519ff912..a19707f2b3f 100644 --- a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.c +++ b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.c @@ -1,260 +1,260 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ -const USB_Descriptor_Device_t DeviceDescriptor = -{ - .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - - .USBSpecification = VERSION_BCD(01.10), - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_NoSpecificSubclass, - .Protocol = CDC_CSCP_NoSpecificProtocol, - - .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - - .VendorID = DEVICE_VID, - .ProductID = DEVICE_PID, - .ReleaseNumber = VERSION_BCD(00.01), - - .ManufacturerStrIndex = 0x02, - .ProductStrIndex = 0x01, - .SerialNumStrIndex = NO_DESCRIPTOR, - - .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS -}; - -/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ -const USB_Descriptor_Configuration_t ConfigurationDescriptor = -{ - .Config = - { - .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 2, - - .ConfigurationNumber = 1, - .ConfigurationStrIndex = NO_DESCRIPTOR, - - .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, - - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) - }, - - .CDC_CCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 0, - .AlternateSetting = 0, - - .TotalEndpoints = 1, - - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_ACMSubclass, - .Protocol = CDC_CSCP_ATCommandProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_Functional_Header = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x00, - - .CDCSpecification = VERSION_BCD(01.10), - }, - - .CDC_Functional_ACM = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x02, - - .Capabilities = 0x04, - }, - - .CDC_Functional_Union = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x06, - - .MasterInterfaceNumber = 0, - .SlaveInterfaceNumber = 1, - }, - - .CDC_NotificationEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_NOTIFICATION_EPSIZE, - .PollingIntervalMS = 0xFF - }, - - .CDC_DCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 1, - .AlternateSetting = 0, - - .TotalEndpoints = 2, - - .Class = CDC_CSCP_CDCDataClass, - .SubClass = CDC_CSCP_NoDataSubclass, - .Protocol = CDC_CSCP_NoDataProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_DataOutEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - }, - - .CDC_DataInEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - } -}; - -/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests - * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -const USB_Descriptor_String_t LanguageString = -{ - .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, - - .UnicodeString = {LANGUAGE_ID_ENG} -}; - -/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, - * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -const USB_Descriptor_String_t ProductString = -{ - .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - #if DEVICE_PID == 0x9207 - .UnicodeString = L"LilyPadUSB " - #else - .UnicodeString = L"USB IO board " - #endif -}; - -const USB_Descriptor_String_t ManufNameString = -{ - .Header = {.Size = USB_STRING_LEN(20), .Type = DTYPE_String}, - #if DEVICE_VID == 0x1B4F - .UnicodeString = L"SparkFun Electronics" - #else - .UnicodeString = L"Unknown " - #endif -}; - -/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" - * documentation) by the application code so that the address and size of a requested descriptor can be given - * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function - * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the - * USB host. - */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - const void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - if (!(DescriptorNumber)) - { - Address = &LanguageString; - Size = LanguageString.Header.Size; - } - else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) - { - Address = &ProductString; - Size = ProductString.Header.Size; - } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) - { - Address = &ManufNameString; - Size = ManufNameString.Header.Size; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = DEVICE_VID, + .ProductID = DEVICE_PID, + .ReleaseNumber = VERSION_BCD(00.01), + + .ManufacturerStrIndex = 0x02, + .ProductStrIndex = 0x01, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_ACMSubclass, + .Protocol = CDC_CSCP_ATCommandProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_Header = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x00, + + .CDCSpecification = VERSION_BCD(01.10), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x02, + + .Capabilities = 0x04, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x06, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = CDC_CSCP_CDCDataClass, + .SubClass = CDC_CSCP_NoDataSubclass, + .Protocol = CDC_CSCP_NoDataProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t ProductString = +{ + .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, + #if DEVICE_PID == 0x9207 + .UnicodeString = L"LilyPadUSB " + #else + .UnicodeString = L"USB IO board " + #endif +}; + +const USB_Descriptor_String_t ManufNameString = +{ + .Header = {.Size = USB_STRING_LEN(20), .Type = DTYPE_String}, + #if DEVICE_VID == 0x1B4F + .UnicodeString = L"SparkFun Electronics" + #else + .UnicodeString = L"Unknown " + #endif +}; + +/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) + { + Address = &ProductString; + Size = ProductString.Header.Size; + } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) + { + Address = &ManufNameString; + Size = ManufNameString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.h b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.h index 94091aef046..c843bec82ad 100644 --- a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.h +++ b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.h @@ -1,139 +1,139 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - /* Macros: */ - #if defined(__AVR_AT90USB1287__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB647__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB1286__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB646__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega32U6__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x87 - #elif defined(__AVR_ATmega16U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x8A - #elif defined(__AVR_ATmega16U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB162__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega8U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x93 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB82__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #else - #error The selected AVR part is not currently supported by this bootloader. - #endif - - /** Endpoint number for the CDC control interface event notification endpoint. */ - #define CDC_NOTIFICATION_EPNUM 2 - - /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ - #define CDC_TX_EPNUM 3 - - /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ - #define CDC_RX_EPNUM 4 - - /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ - #define CDC_TXRX_EPSIZE 16 - - /** Size of the CDC control interface notification endpoint bank, in bytes. */ - #define CDC_NOTIFICATION_EPSIZE 8 - - /* Type Defines: */ - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - - // CDC Control Interface - USB_Descriptor_Interface_t CDC_CCI_Interface; - USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; - USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; - USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; - USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; - - // CDC Data Interface - USB_Descriptor_Interface_t CDC_DCI_Interface; - USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; - USB_Descriptor_Endpoint_t CDC_DataInEndpoint; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) - ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + /* Macros: */ + #if defined(__AVR_AT90USB1287__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB647__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB1286__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB646__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega32U6__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x87 + #elif defined(__AVR_ATmega16U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x8A + #elif defined(__AVR_ATmega16U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB162__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega8U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB82__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #else + #error The selected AVR part is not currently supported by this bootloader. + #endif + + /** Endpoint number for the CDC control interface event notification endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ + #define CDC_TXRX_EPSIZE 16 + + /** Size of the CDC control interface notification endpoint bank, in bytes. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // CDC Control Interface + USB_Descriptor_Interface_t CDC_CCI_Interface; + USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; + USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; + USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + + // CDC Data Interface + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif + diff --git a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Makefile b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Makefile index 8443e14bc82..0b5659a3c96 100644 --- a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Makefile +++ b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Makefile @@ -1,716 +1,716 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# USB vendor ID (VID) -# official Arduino LLC VID = 0x2341 -# SparkFun VID = 0x1B4F -VID = 0x1B4F - -# USB product ID (PID) -# official Leonardo PID = 0x0036 -# SparkFun LilyPadUSB PID = 0x9207 -PID = 0x9207 - -# MCU name -MCU = atmega32u4 - -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Target board (see library "Board Types" documentation, NONE for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USER - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 8000000 - - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - - -# Starting byte address of the bootloader, as a byte address - computed via the formula -# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) -# -# Note that the bootloader size and start address given in AVRStudio is in words and not -# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. -FLASH_SIZE_KB = 32 -BOOT_SECTION_SIZE_KB = 4 -BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = Caterina - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Path to the LUFA library -LUFA_PATH = LUFA-111009 - - -# LUFA library compile-time options and predefined tokens -LUFA_OPTS = -D USB_DEVICE_ONLY -LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 -LUFA_OPTS += -D ORDERED_EP_CONFIG -LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 -LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 -LUFA_OPTS += -D USE_RAM_DESCRIPTORS -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -LUFA_OPTS += -D NO_INTERNAL_SERIAL -LUFA_OPTS += -D NO_DEVICE_SELF_POWER -LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP -LUFA_OPTS += -D NO_SOF_EVENTS - -#LUFA_OPTS += -D NO_BLOCK_SUPPORT -#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT -#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT -LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT - - -# Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(LUFA_PATH)/ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=c99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -CDEFS += -DF_USB=$(F_USB)UL -CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) -CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CDEFS += -DDEVICE_VID=$(VID)UL -CDEFS += -DDEVICE_PID=$(PID)UL -CDEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) -ADEFS += -DF_USB=$(F_USB)UL -ADEFS += -DBOARD=BOARD_$(BOARD) -ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -ADEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -CPPDEFS += -DF_USB=$(F_USB)UL -CPPDEFS += -DBOARD=BOARD_$(BOARD) -CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CPPDEFS += $(LUFA_OPTS) -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CPPFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = avrispmkII - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep -AVRDUDE_WRITE_FUSES = -U efuse:w:0xce:m -AVRDUDE_WRITE_FUSES += -U hfuse:w:0xd8:m -AVRDUDE_WRITE_FUSES += -U lfuse:w:0xff:m - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -B 1 -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym -#build: lib - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_WRITE_FUSES) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -z $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - -doxygen: - @echo Generating Project Documentation \($(TARGET)\)... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -checksource: - @for f in $(SRC) $(CPPSRC) $(ASRC); do \ - if [ -f $$f ]; then \ - echo "Found Source File: $$f" ; \ - else \ - echo "Source File Not Found: $$f" ; \ - fi; done - - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff doxygen clean \ -clean_list clean_doxygen program debug gdb-config checksource - +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# USB vendor ID (VID) +# official Arduino LLC VID = 0x2341 +# SparkFun VID = 0x1B4F +VID = 0x1B4F + +# USB product ID (PID) +# official Leonardo PID = 0x0036 +# SparkFun LilyPadUSB PID = 0x9207 +PID = 0x9207 + +# MCU name +MCU = atmega32u4 + +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 8000000 + + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Starting byte address of the bootloader, as a byte address - computed via the formula +# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) +# +# Note that the bootloader size and start address given in AVRStudio is in words and not +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. +FLASH_SIZE_KB = 32 +BOOT_SECTION_SIZE_KB = 4 +BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Caterina + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = LUFA-111009 + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D ORDERED_EP_CONFIG +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D NO_INTERNAL_SERIAL +LUFA_OPTS += -D NO_DEVICE_SELF_POWER +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP +LUFA_OPTS += -D NO_SOF_EVENTS + +#LUFA_OPTS += -D NO_BLOCK_SUPPORT +#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT +#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT +LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_USB=$(F_USB)UL +CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += -DDEVICE_VID=$(VID)UL +CDEFS += -DDEVICE_PID=$(PID)UL +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_USB=$(F_USB)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +ADEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_USB=$(F_USB)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkII + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep +AVRDUDE_WRITE_FUSES = -U efuse:w:0xce:m +AVRDUDE_WRITE_FUSES += -U hfuse:w:0xd8:m +AVRDUDE_WRITE_FUSES += -U lfuse:w:0xff:m + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude -B 1 +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_WRITE_FUSES) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation \($(TARGET)\)... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +checksource: + @for f in $(SRC) $(CPPSRC) $(ASRC); do \ + if [ -f $$f ]; then \ + echo "Found Source File: $$f" ; \ + else \ + echo "Source File Not Found: $$f" ; \ + fi; done + + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program debug gdb-config checksource + diff --git a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Readme.txt b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Readme.txt index 9656a6ea8bb..d06661172ce 100644 --- a/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Readme.txt +++ b/hardware/arduino/avr/bootloaders/caterina-LilyPadUSB/Readme.txt @@ -1,11 +1,11 @@ -Building the bootloader for the LilyPadUSB -1. Download the LUFA-111009 file (http://fourwalledcubicle.com/blog/2011/10/lufa-111009-released/). -2. Extract that file directly to the Caterina-LilyPadUSB bootloader directory. -3. Open a command prompt in the Caterina-LilyPadUSB bootloader directory. -4. Type 'make'. -5. Enjoy! - -Programming the bootloader for the LilyPadUSB -1. Open a command prompt in the Caterina-LilyPadUSB folder. -2. Connect your programmer- use a 2x3 .1" header, pressed against the programming vias. +Building the bootloader for the LilyPadUSB +1. Download the LUFA-111009 file (http://fourwalledcubicle.com/blog/2011/10/lufa-111009-released/). +2. Extract that file directly to the Caterina-LilyPadUSB bootloader directory. +3. Open a command prompt in the Caterina-LilyPadUSB bootloader directory. +4. Type 'make'. +5. Enjoy! + +Programming the bootloader for the LilyPadUSB +1. Open a command prompt in the Caterina-LilyPadUSB folder. +2. Connect your programmer- use a 2x3 .1" header, pressed against the programming vias. 3. Type 'make program' into the command prompt. \ No newline at end of file diff --git a/hardware/arduino/avr/bootloaders/caterina/Caterina.c b/hardware/arduino/avr/bootloaders/caterina/Caterina.c index 9860b3a3f0b..0204873ac89 100644 --- a/hardware/arduino/avr/bootloaders/caterina/Caterina.c +++ b/hardware/arduino/avr/bootloaders/caterina/Caterina.c @@ -1,714 +1,714 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. - */ - -#define INCLUDE_FROM_CATERINA_C -#include "Caterina.h" - -/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some - * operating systems will not open the port unless the settings can be set successfully. - */ -static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, - .CharFormat = CDC_LINEENCODING_OneStopBit, - .ParityType = CDC_PARITY_None, - .DataBits = 8 }; - -/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, - * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued - * command.) - */ -static uint32_t CurrAddress; - -/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite - * loop until the AVR restarts and the application runs. - */ -static bool RunBootloader = true; - -/* Pulse generation counters to keep track of the time remaining for each pulse type */ -#define TX_RX_LED_PULSE_PERIOD 100 -uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse -uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse - -/* Bootloader timeout timer */ -#define TIMEOUT_PERIOD 8000 -uint16_t Timeout = 0; - -uint16_t bootKey = 0x7777; -volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0800; - -void StartSketch(void) -{ - cli(); - - /* Undo TIMER1 setup and clear the count before running the sketch */ - TIMSK1 = 0; - TCCR1B = 0; - TCNT1H = 0; // 16-bit write to TCNT1 requires high byte be written first - TCNT1L = 0; - - /* Relocate the interrupt vector table to the application section */ - MCUCR = (1 << IVCE); - MCUCR = 0; - - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - /* jump to beginning of application space */ - __asm__ volatile("jmp 0x0000"); -} - -/* Breathing animation on L LED indicates bootloader is running */ -uint16_t LLEDPulse; -void LEDPulse(void) -{ - LLEDPulse++; - uint8_t p = LLEDPulse >> 8; - if (p > 127) - p = 254-p; - p += p; - if (((uint8_t)LLEDPulse) > p) - L_LED_OFF(); - else - L_LED_ON(); -} - -/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until it times out or is instructed to exit. - */ -int main(void) -{ - /* Save the value of the boot key memory before it is overwritten */ - uint16_t bootKeyPtrVal = *bootKeyPtr; - *bootKeyPtr = 0; - - /* Check the reason for the reset so we can act accordingly */ - uint8_t mcusr_state = MCUSR; // store the initial state of the Status register - MCUSR = 0; // clear all reset flags - - /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ - wdt_disable(); - - if (mcusr_state & (1< TIMEOUT_PERIOD) - RunBootloader = false; - - LEDPulse(); - } - - /* Disconnect from the host - USB interface will be reset later along with the AVR */ - USB_Detach(); - - /* Jump to beginning of application space to run the sketch - do not reset */ - StartSketch(); -} - -/** Configures all hardware required for the bootloader. */ -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Disable clock division */ - clock_prescale_set(clock_div_1); - - /* Relocate the interrupt vector table to the bootloader section */ - MCUCR = (1 << IVCE); - MCUCR = (1 << IVSEL); - - LED_SETUP(); - CPU_PRESCALE(0); - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - /* Initialize TIMER1 to handle bootloader timeout and LED tasks. - * With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz - * Our chosen compare match generates an interrupt every 1 ms. - * This interrupt is disabled selectively when doing memory reading, erasing, - * or writing since SPM has tight timing requirements. - */ - OCR1AH = 0; - OCR1AL = 250; - TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt - TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input - - /* Initialize USB Subsystem */ - USB_Init(); -} - -//uint16_t ctr = 0; -ISR(TIMER1_COMPA_vect, ISR_BLOCK) -{ - /* Reset counter */ - TCNT1H = 0; - TCNT1L = 0; - - /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ - if (TxLEDPulse && !(--TxLEDPulse)) - TX_LED_OFF(); - if (RxLEDPulse && !(--RxLEDPulse)) - RX_LED_OFF(); - - if (pgm_read_word(0) != 0xFFFF) - Timeout++; -} - -/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready - * to relay data to and from the attached USB host. - */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - /* Setup CDC Notification, Rx and Tx Endpoints */ - Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, - ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); -} - -/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to - * the device from the USB host before passing along unhandled control requests to the library for processing - * internally. - */ -void EVENT_USB_Device_ControlRequest(void) -{ - /* Ignore any requests that aren't directed to the CDC interface */ - if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != - (REQTYPE_CLASS | REQREC_INTERFACE)) - { - return; - } - - /* Process CDC specific control requests */ - switch (USB_ControlRequest.bRequest) - { - case CDC_REQ_GetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Write the line coding data to the control endpoint */ - Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearOUT(); - } - - break; - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Read the line coding data in from the host into the global struct */ - Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearIN(); - } - - break; - } -} - -#if !defined(NO_BLOCK_SUPPORT) -/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending - * on the AVR910 protocol command issued. - * - * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform - */ -static void ReadWriteMemoryBlock(const uint8_t Command) -{ - uint16_t BlockSize; - char MemoryType; - - bool HighByte = false; - uint8_t LowByte = 0; - - BlockSize = (FetchNextCommandByte() << 8); - BlockSize |= FetchNextCommandByte(); - - MemoryType = FetchNextCommandByte(); - - if ((MemoryType != 'E') && (MemoryType != 'F')) - { - /* Send error byte back to the host */ - WriteNextResponseByte('?'); - - return; - } - - /* Disable timer 1 interrupt - can't afford to process nonessential interrupts - * while doing SPM tasks */ - TIMSK1 = 0; - - /* Check if command is to read memory */ - if (Command == 'g') - { - /* Re-enable RWW section */ - boot_rww_enable(); - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* Read the next FLASH byte from the current FLASH page */ - #if (FLASHEND > 0xFFFF) - WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); - #else - WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); - #endif - - /* If both bytes in current word have been read, increment the address counter */ - if (HighByte) - CurrAddress += 2; - - HighByte = !HighByte; - } - else - { - /* Read the next EEPROM byte into the endpoint */ - WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - } - else - { - uint32_t PageStartAddress = CurrAddress; - - if (MemoryType == 'F') - { - boot_page_erase(PageStartAddress); - boot_spm_busy_wait(); - } - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* If both bytes in current word have been written, increment the address counter */ - if (HighByte) - { - /* Write the next FLASH word to the current FLASH page */ - boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - else - { - LowByte = FetchNextCommandByte(); - } - - HighByte = !HighByte; - } - else - { - /* Write the next EEPROM byte from the endpoint */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - - /* If in FLASH programming mode, commit the page after writing */ - if (MemoryType == 'F') - { - /* Commit the flash page to memory */ - boot_page_write(PageStartAddress); - - /* Wait until write operation has completed */ - boot_spm_busy_wait(); - } - - /* Send response byte back to the host */ - WriteNextResponseByte('\r'); - } - - /* Re-enable timer 1 interrupt disabled earlier in this routine */ - TIMSK1 = (1 << OCIE1A); -} -#endif - -/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed - * to allow reception of the next data packet from the host. - * - * \return Next received byte from the host in the CDC data OUT endpoint - */ -static uint8_t FetchNextCommandByte(void) -{ - /* Select the OUT endpoint so that the next data byte can be read */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* If OUT endpoint empty, clear it and wait for the next packet from the host */ - while (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearOUT(); - - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return 0; - } - } - - /* Fetch the next byte from the OUT endpoint */ - return Endpoint_Read_8(); -} - -/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the - * bank when full ready for the next byte in the packet to the host. - * - * \param[in] Response Next response byte to send to the host - */ -static void WriteNextResponseByte(const uint8_t Response) -{ - /* Select the IN endpoint so that the next data byte can be written */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ - if (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearIN(); - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Write the next byte to the IN endpoint */ - Endpoint_Write_8(Response); - - TX_LED_ON(); - TxLEDPulse = TX_RX_LED_PULSE_PERIOD; -} - -#define STK_OK 0x10 -#define STK_INSYNC 0x14 // ' ' -#define CRC_EOP 0x20 // 'SPACE' -#define STK_GET_SYNC 0x30 // '0' - -#define STK_GET_PARAMETER 0x41 // 'A' -#define STK_SET_DEVICE 0x42 // 'B' -#define STK_SET_DEVICE_EXT 0x45 // 'E' -#define STK_LOAD_ADDRESS 0x55 // 'U' -#define STK_UNIVERSAL 0x56 // 'V' -#define STK_PROG_PAGE 0x64 // 'd' -#define STK_READ_PAGE 0x74 // 't' -#define STK_READ_SIGN 0x75 // 'u' - -/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions - * and send the appropriate response back to the host. - */ -void CDC_Task(void) -{ - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Check if endpoint has a command in it sent from the host */ - if (!(Endpoint_IsOUTReceived())) - return; - - RX_LED_ON(); - RxLEDPulse = TX_RX_LED_PULSE_PERIOD; - - /* Read in the bootloader command (first byte sent from host) */ - uint8_t Command = FetchNextCommandByte(); - - if (Command == 'E') - { - /* We nearly run out the bootloader timeout clock, - * leaving just a few hundred milliseconds so the - * bootloder has time to respond and service any - * subsequent requests */ - Timeout = TIMEOUT_PERIOD - 500; - - /* Re-enable RWW section - must be done here in case - * user has disabled verification on upload. */ - boot_rww_enable_safe(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'T') - { - FetchNextCommandByte(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if ((Command == 'L') || (Command == 'P')) - { - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 't') - { - // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader - WriteNextResponseByte(0x44); - WriteNextResponseByte(0x00); - } - else if (Command == 'a') - { - // Indicate auto-address increment is supported - WriteNextResponseByte('Y'); - } - else if (Command == 'A') - { - // Set the current address to that given by the host - CurrAddress = (FetchNextCommandByte() << 9); - CurrAddress |= (FetchNextCommandByte() << 1); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'p') - { - // Indicate serial programmer back to the host - WriteNextResponseByte('S'); - } - else if (Command == 'S') - { - // Write the 7-byte software identifier to the endpoint - for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) - WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); - } - else if (Command == 'V') - { - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); - } - else if (Command == 's') - { - WriteNextResponseByte(AVR_SIGNATURE_3); - WriteNextResponseByte(AVR_SIGNATURE_2); - WriteNextResponseByte(AVR_SIGNATURE_1); - } - else if (Command == 'e') - { - // Clear the application section of flash - for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) - { - boot_page_erase(CurrFlashAddress); - boot_spm_busy_wait(); - boot_page_write(CurrFlashAddress); - boot_spm_busy_wait(); - } - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) - else if (Command == 'l') - { - // Set the lock bits to those given by the host - boot_lock_bits_set(FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #endif - else if (Command == 'r') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); - } - else if (Command == 'F') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); - } - else if (Command == 'N') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); - } - else if (Command == 'Q') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); - } - #if !defined(NO_BLOCK_SUPPORT) - else if (Command == 'b') - { - WriteNextResponseByte('Y'); - - // Send block size to the host - WriteNextResponseByte(SPM_PAGESIZE >> 8); - WriteNextResponseByte(SPM_PAGESIZE & 0xFF); - } - else if ((Command == 'B') || (Command == 'g')) - { - // Keep resetting the timeout counter if we're receiving self-programming instructions - Timeout = 0; - // Delegate the block write/read to a separate function for clarity - ReadWriteMemoryBlock(Command); - } - #endif - #if !defined(NO_FLASH_BYTE_SUPPORT) - else if (Command == 'C') - { - // Write the high byte to the current flash page - boot_page_fill(CurrAddress, FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'c') - { - // Write the low byte to the current flash page - boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); - - // Increment the address - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'm') - { - // Commit the flash page to memory - boot_page_write(CurrAddress); - - // Wait until write operation has completed - boot_spm_busy_wait(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'R') - { - #if (FLASHEND > 0xFFFF) - uint16_t ProgramWord = pgm_read_word_far(CurrAddress); - #else - uint16_t ProgramWord = pgm_read_word(CurrAddress); - #endif - - WriteNextResponseByte(ProgramWord >> 8); - WriteNextResponseByte(ProgramWord & 0xFF); - } - #endif - #if !defined(NO_EEPROM_BYTE_SUPPORT) - else if (Command == 'D') - { - // Read the byte from the endpoint and write it to the EEPROM - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - // Increment the address after use - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'd') - { - // Read the EEPROM byte and write it to the endpoint - WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); - - // Increment the address after use - CurrAddress += 2; - } - #endif - else if (Command != 27) - { - // Unknown (non-sync) command, return fail code - WriteNextResponseByte('?'); - } - - - /* Select the IN endpoint */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* Remember if the endpoint is completely full before clearing it */ - bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); - - /* Send the endpoint data to the host */ - Endpoint_ClearIN(); - - /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ - if (IsEndpointFull) - { - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearIN(); - } - - /* Wait until the data has been sent to the host */ - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Acknowledge the command from the host */ - Endpoint_ClearOUT(); -} - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_CATERINA_C +#include "Caterina.h" + +/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some + * operating systems will not open the port unless the settings can be set successfully. + */ +static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, + .CharFormat = CDC_LINEENCODING_OneStopBit, + .ParityType = CDC_PARITY_None, + .DataBits = 8 }; + +/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, + * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued + * command.) + */ +static uint32_t CurrAddress; + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite + * loop until the AVR restarts and the application runs. + */ +static bool RunBootloader = true; + +/* Pulse generation counters to keep track of the time remaining for each pulse type */ +#define TX_RX_LED_PULSE_PERIOD 100 +uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse +uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse + +/* Bootloader timeout timer */ +#define TIMEOUT_PERIOD 8000 +uint16_t Timeout = 0; + +uint16_t bootKey = 0x7777; +volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0800; + +void StartSketch(void) +{ + cli(); + + /* Undo TIMER1 setup and clear the count before running the sketch */ + TIMSK1 = 0; + TCCR1B = 0; + TCNT1H = 0; // 16-bit write to TCNT1 requires high byte be written first + TCNT1L = 0; + + /* Relocate the interrupt vector table to the application section */ + MCUCR = (1 << IVCE); + MCUCR = 0; + + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + /* jump to beginning of application space */ + __asm__ volatile("jmp 0x0000"); +} + +/* Breathing animation on L LED indicates bootloader is running */ +uint16_t LLEDPulse; +void LEDPulse(void) +{ + LLEDPulse++; + uint8_t p = LLEDPulse >> 8; + if (p > 127) + p = 254-p; + p += p; + if (((uint8_t)LLEDPulse) > p) + L_LED_OFF(); + else + L_LED_ON(); +} + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until it times out or is instructed to exit. + */ +int main(void) +{ + /* Save the value of the boot key memory before it is overwritten */ + uint16_t bootKeyPtrVal = *bootKeyPtr; + *bootKeyPtr = 0; + + /* Check the reason for the reset so we can act accordingly */ + uint8_t mcusr_state = MCUSR; // store the initial state of the Status register + MCUSR = 0; // clear all reset flags + + /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ + wdt_disable(); + + if (mcusr_state & (1< TIMEOUT_PERIOD) + RunBootloader = false; + + LEDPulse(); + } + + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); + + /* Jump to beginning of application space to run the sketch - do not reset */ + StartSketch(); +} + +/** Configures all hardware required for the bootloader. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + /* Relocate the interrupt vector table to the bootloader section */ + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + LED_SETUP(); + CPU_PRESCALE(0); + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + /* Initialize TIMER1 to handle bootloader timeout and LED tasks. + * With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz + * Our chosen compare match generates an interrupt every 1 ms. + * This interrupt is disabled selectively when doing memory reading, erasing, + * or writing since SPM has tight timing requirements. + */ + OCR1AH = 0; + OCR1AL = 250; + TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt + TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input + + /* Initialize USB Subsystem */ + USB_Init(); +} + +//uint16_t ctr = 0; +ISR(TIMER1_COMPA_vect, ISR_BLOCK) +{ + /* Reset counter */ + TCNT1H = 0; + TCNT1L = 0; + + /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ + if (TxLEDPulse && !(--TxLEDPulse)) + TX_LED_OFF(); + if (RxLEDPulse && !(--RxLEDPulse)) + RX_LED_OFF(); + + if (pgm_read_word(0) != 0xFFFF) + Timeout++; +} + +/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready + * to relay data to and from the attached USB host. + */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + /* Setup CDC Notification, Rx and Tx Endpoints */ + Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, + ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); +} + +/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to + * the device from the USB host before passing along unhandled control requests to the library for processing + * internally. + */ +void EVENT_USB_Device_ControlRequest(void) +{ + /* Ignore any requests that aren't directed to the CDC interface */ + if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != + (REQTYPE_CLASS | REQREC_INTERFACE)) + { + return; + } + + /* Process CDC specific control requests */ + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Write the line coding data to the control endpoint */ + Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearOUT(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Read the line coding data in from the host into the global struct */ + Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearIN(); + } + + break; + } +} + +#if !defined(NO_BLOCK_SUPPORT) +/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending + * on the AVR910 protocol command issued. + * + * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform + */ +static void ReadWriteMemoryBlock(const uint8_t Command) +{ + uint16_t BlockSize; + char MemoryType; + + bool HighByte = false; + uint8_t LowByte = 0; + + BlockSize = (FetchNextCommandByte() << 8); + BlockSize |= FetchNextCommandByte(); + + MemoryType = FetchNextCommandByte(); + + if ((MemoryType != 'E') && (MemoryType != 'F')) + { + /* Send error byte back to the host */ + WriteNextResponseByte('?'); + + return; + } + + /* Disable timer 1 interrupt - can't afford to process nonessential interrupts + * while doing SPM tasks */ + TIMSK1 = 0; + + /* Check if command is to read memory */ + if (Command == 'g') + { + /* Re-enable RWW section */ + boot_rww_enable(); + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* Read the next FLASH byte from the current FLASH page */ + #if (FLASHEND > 0xFFFF) + WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); + #else + WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); + #endif + + /* If both bytes in current word have been read, increment the address counter */ + if (HighByte) + CurrAddress += 2; + + HighByte = !HighByte; + } + else + { + /* Read the next EEPROM byte into the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + } + else + { + uint32_t PageStartAddress = CurrAddress; + + if (MemoryType == 'F') + { + boot_page_erase(PageStartAddress); + boot_spm_busy_wait(); + } + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* If both bytes in current word have been written, increment the address counter */ + if (HighByte) + { + /* Write the next FLASH word to the current FLASH page */ + boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + else + { + LowByte = FetchNextCommandByte(); + } + + HighByte = !HighByte; + } + else + { + /* Write the next EEPROM byte from the endpoint */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + + /* If in FLASH programming mode, commit the page after writing */ + if (MemoryType == 'F') + { + /* Commit the flash page to memory */ + boot_page_write(PageStartAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + } + + /* Send response byte back to the host */ + WriteNextResponseByte('\r'); + } + + /* Re-enable timer 1 interrupt disabled earlier in this routine */ + TIMSK1 = (1 << OCIE1A); +} +#endif + +/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed + * to allow reception of the next data packet from the host. + * + * \return Next received byte from the host in the CDC data OUT endpoint + */ +static uint8_t FetchNextCommandByte(void) +{ + /* Select the OUT endpoint so that the next data byte can be read */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* If OUT endpoint empty, clear it and wait for the next packet from the host */ + while (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return 0; + } + } + + /* Fetch the next byte from the OUT endpoint */ + return Endpoint_Read_8(); +} + +/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the + * bank when full ready for the next byte in the packet to the host. + * + * \param[in] Response Next response byte to send to the host + */ +static void WriteNextResponseByte(const uint8_t Response) +{ + /* Select the IN endpoint so that the next data byte can be written */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ + if (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next byte to the IN endpoint */ + Endpoint_Write_8(Response); + + TX_LED_ON(); + TxLEDPulse = TX_RX_LED_PULSE_PERIOD; +} + +#define STK_OK 0x10 +#define STK_INSYNC 0x14 // ' ' +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' + +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' + +/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions + * and send the appropriate response back to the host. + */ +void CDC_Task(void) +{ + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Check if endpoint has a command in it sent from the host */ + if (!(Endpoint_IsOUTReceived())) + return; + + RX_LED_ON(); + RxLEDPulse = TX_RX_LED_PULSE_PERIOD; + + /* Read in the bootloader command (first byte sent from host) */ + uint8_t Command = FetchNextCommandByte(); + + if (Command == 'E') + { + /* We nearly run out the bootloader timeout clock, + * leaving just a few hundred milliseconds so the + * bootloder has time to respond and service any + * subsequent requests */ + Timeout = TIMEOUT_PERIOD - 500; + + /* Re-enable RWW section - must be done here in case + * user has disabled verification on upload. */ + boot_rww_enable_safe(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'T') + { + FetchNextCommandByte(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if ((Command == 'L') || (Command == 'P')) + { + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 't') + { + // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader + WriteNextResponseByte(0x44); + WriteNextResponseByte(0x00); + } + else if (Command == 'a') + { + // Indicate auto-address increment is supported + WriteNextResponseByte('Y'); + } + else if (Command == 'A') + { + // Set the current address to that given by the host + CurrAddress = (FetchNextCommandByte() << 9); + CurrAddress |= (FetchNextCommandByte() << 1); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'p') + { + // Indicate serial programmer back to the host + WriteNextResponseByte('S'); + } + else if (Command == 'S') + { + // Write the 7-byte software identifier to the endpoint + for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) + WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); + } + else if (Command == 'V') + { + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); + } + else if (Command == 's') + { + WriteNextResponseByte(AVR_SIGNATURE_3); + WriteNextResponseByte(AVR_SIGNATURE_2); + WriteNextResponseByte(AVR_SIGNATURE_1); + } + else if (Command == 'e') + { + // Clear the application section of flash + for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + } + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) + else if (Command == 'l') + { + // Set the lock bits to those given by the host + boot_lock_bits_set(FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #endif + else if (Command == 'r') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); + } + else if (Command == 'F') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); + } + else if (Command == 'N') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); + } + else if (Command == 'Q') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); + } + #if !defined(NO_BLOCK_SUPPORT) + else if (Command == 'b') + { + WriteNextResponseByte('Y'); + + // Send block size to the host + WriteNextResponseByte(SPM_PAGESIZE >> 8); + WriteNextResponseByte(SPM_PAGESIZE & 0xFF); + } + else if ((Command == 'B') || (Command == 'g')) + { + // Keep resetting the timeout counter if we're receiving self-programming instructions + Timeout = 0; + // Delegate the block write/read to a separate function for clarity + ReadWriteMemoryBlock(Command); + } + #endif + #if !defined(NO_FLASH_BYTE_SUPPORT) + else if (Command == 'C') + { + // Write the high byte to the current flash page + boot_page_fill(CurrAddress, FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'c') + { + // Write the low byte to the current flash page + boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); + + // Increment the address + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'm') + { + // Commit the flash page to memory + boot_page_write(CurrAddress); + + // Wait until write operation has completed + boot_spm_busy_wait(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'R') + { + #if (FLASHEND > 0xFFFF) + uint16_t ProgramWord = pgm_read_word_far(CurrAddress); + #else + uint16_t ProgramWord = pgm_read_word(CurrAddress); + #endif + + WriteNextResponseByte(ProgramWord >> 8); + WriteNextResponseByte(ProgramWord & 0xFF); + } + #endif + #if !defined(NO_EEPROM_BYTE_SUPPORT) + else if (Command == 'D') + { + // Read the byte from the endpoint and write it to the EEPROM + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + // Increment the address after use + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'd') + { + // Read the EEPROM byte and write it to the endpoint + WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); + + // Increment the address after use + CurrAddress += 2; + } + #endif + else if (Command != 27) + { + // Unknown (non-sync) command, return fail code + WriteNextResponseByte('?'); + } + + + /* Select the IN endpoint */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* Remember if the endpoint is completely full before clearing it */ + bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); + + /* Send the endpoint data to the host */ + Endpoint_ClearIN(); + + /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ + if (IsEndpointFull) + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + } + + /* Wait until the data has been sent to the host */ + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Acknowledge the command from the host */ + Endpoint_ClearOUT(); +} + diff --git a/hardware/arduino/avr/bootloaders/caterina/Caterina.h b/hardware/arduino/avr/bootloaders/caterina/Caterina.h index 5ce80fab609..67ff1b3a4ed 100644 --- a/hardware/arduino/avr/bootloaders/caterina/Caterina.h +++ b/hardware/arduino/avr/bootloaders/caterina/Caterina.h @@ -1,106 +1,106 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for BootloaderCDC.c. - */ - -#ifndef _CDC_H_ -#define _CDC_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - /* Macros: */ - /** Version major of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MAJOR 0x01 - - /** Version minor of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MINOR 0x00 - - /** Hardware version major of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MAJOR 0x01 - - /** Hardware version minor of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MINOR 0x00 - - /** Eight character bootloader firmware identifier reported to the host when requested */ - #define SOFTWARE_IDENTIFIER "CATERINA" - - #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) - #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); - #define L_LED_OFF() PORTC &= ~(1<<7) - #define L_LED_ON() PORTC |= (1<<7) - #define L_LED_TOGGLE() PORTC ^= (1<<7) - #if DEVICE_PID == 0x0037 // polarity of the RX and TX LEDs is reversed on the Micro - #define TX_LED_OFF() PORTD &= ~(1<<5) - #define TX_LED_ON() PORTD |= (1<<5) - #define RX_LED_OFF() PORTB &= ~(1<<0) - #define RX_LED_ON() PORTB |= (1<<0) - #else - #define TX_LED_OFF() PORTD |= (1<<5) - #define TX_LED_ON() PORTD &= ~(1<<5) - #define RX_LED_OFF() PORTB |= (1<<0) - #define RX_LED_ON() PORTB &= ~(1<<0) - #endif - - /* Type Defines: */ - /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ - typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; - - /* Function Prototypes: */ - void StartSketch(void); - void LEDPulse(void); - - void CDC_Task(void); - void SetupHardware(void); - - void EVENT_USB_Device_ConfigurationChanged(void); - - #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) - #if !defined(NO_BLOCK_SUPPORT) - static void ReadWriteMemoryBlock(const uint8_t Command); - #endif - static uint8_t FetchNextCommandByte(void); - static void WriteNextResponseByte(const uint8_t Response); - #endif - -#endif - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for BootloaderCDC.c. + */ + +#ifndef _CDC_H_ +#define _CDC_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + /* Macros: */ + /** Version major of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MAJOR 0x01 + + /** Version minor of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MINOR 0x00 + + /** Hardware version major of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MAJOR 0x01 + + /** Hardware version minor of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MINOR 0x00 + + /** Eight character bootloader firmware identifier reported to the host when requested */ + #define SOFTWARE_IDENTIFIER "CATERINA" + + #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) + #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); + #define L_LED_OFF() PORTC &= ~(1<<7) + #define L_LED_ON() PORTC |= (1<<7) + #define L_LED_TOGGLE() PORTC ^= (1<<7) + #if DEVICE_PID == 0x0037 // polarity of the RX and TX LEDs is reversed on the Micro + #define TX_LED_OFF() PORTD &= ~(1<<5) + #define TX_LED_ON() PORTD |= (1<<5) + #define RX_LED_OFF() PORTB &= ~(1<<0) + #define RX_LED_ON() PORTB |= (1<<0) + #else + #define TX_LED_OFF() PORTD |= (1<<5) + #define TX_LED_ON() PORTD &= ~(1<<5) + #define RX_LED_OFF() PORTB |= (1<<0) + #define RX_LED_ON() PORTB &= ~(1<<0) + #endif + + /* Type Defines: */ + /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /* Function Prototypes: */ + void StartSketch(void); + void LEDPulse(void); + + void CDC_Task(void); + void SetupHardware(void); + + void EVENT_USB_Device_ConfigurationChanged(void); + + #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) + #if !defined(NO_BLOCK_SUPPORT) + static void ReadWriteMemoryBlock(const uint8_t Command); + #endif + static uint8_t FetchNextCommandByte(void); + static void WriteNextResponseByte(const uint8_t Response); + #endif + +#endif + diff --git a/hardware/arduino/avr/bootloaders/caterina/Descriptors.c b/hardware/arduino/avr/bootloaders/caterina/Descriptors.c index b5e51507ed6..9ca7de47a12 100644 --- a/hardware/arduino/avr/bootloaders/caterina/Descriptors.c +++ b/hardware/arduino/avr/bootloaders/caterina/Descriptors.c @@ -1,266 +1,266 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ -const USB_Descriptor_Device_t DeviceDescriptor = -{ - .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - - .USBSpecification = VERSION_BCD(01.10), - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_NoSpecificSubclass, - .Protocol = CDC_CSCP_NoSpecificProtocol, - - .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - - .VendorID = DEVICE_VID, - .ProductID = DEVICE_PID, - .ReleaseNumber = VERSION_BCD(00.01), - - .ManufacturerStrIndex = 0x02, - .ProductStrIndex = 0x01, - .SerialNumStrIndex = NO_DESCRIPTOR, - - .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS -}; - -/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ -const USB_Descriptor_Configuration_t ConfigurationDescriptor = -{ - .Config = - { - .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 2, - - .ConfigurationNumber = 1, - .ConfigurationStrIndex = NO_DESCRIPTOR, - - .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, - - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) - }, - - .CDC_CCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 0, - .AlternateSetting = 0, - - .TotalEndpoints = 1, - - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_ACMSubclass, - .Protocol = CDC_CSCP_ATCommandProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_Functional_Header = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x00, - - .CDCSpecification = VERSION_BCD(01.10), - }, - - .CDC_Functional_ACM = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x02, - - .Capabilities = 0x04, - }, - - .CDC_Functional_Union = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x06, - - .MasterInterfaceNumber = 0, - .SlaveInterfaceNumber = 1, - }, - - .CDC_NotificationEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_NOTIFICATION_EPSIZE, - .PollingIntervalMS = 0xFF - }, - - .CDC_DCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 1, - .AlternateSetting = 0, - - .TotalEndpoints = 2, - - .Class = CDC_CSCP_CDCDataClass, - .SubClass = CDC_CSCP_NoDataSubclass, - .Protocol = CDC_CSCP_NoDataProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_DataOutEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - }, - - .CDC_DataInEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - } -}; - -/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests - * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -const USB_Descriptor_String_t LanguageString = -{ - .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, - - .UnicodeString = {LANGUAGE_ID_ENG} -}; - -/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, - * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -const USB_Descriptor_String_t ProductString = -{ - .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - - #if DEVICE_PID == 0x0036 - .UnicodeString = L"Arduino Leonardo" - #elif DEVICE_PID == 0x0037 - .UnicodeString = L"Arduino Micro " - #elif DEVICE_PID == 0x003C - .UnicodeString = L"Arduino Esplora " - #else - .UnicodeString = L"USB IO board " - #endif -}; - -const USB_Descriptor_String_t ManufNameString = -{ - .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, - - #if DEVICE_VID == 0x2341 - .UnicodeString = L"Arduino LLC" - #else - .UnicodeString = L"Unknown " - #endif -}; - -/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" - * documentation) by the application code so that the address and size of a requested descriptor can be given - * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function - * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the - * USB host. - */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - const void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - if (!(DescriptorNumber)) - { - Address = &LanguageString; - Size = LanguageString.Header.Size; - } - else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) - { - Address = &ProductString; - Size = ProductString.Header.Size; - } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) - { - Address = &ManufNameString; - Size = ManufNameString.Header.Size; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = DEVICE_VID, + .ProductID = DEVICE_PID, + .ReleaseNumber = VERSION_BCD(00.01), + + .ManufacturerStrIndex = 0x02, + .ProductStrIndex = 0x01, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_ACMSubclass, + .Protocol = CDC_CSCP_ATCommandProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_Header = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x00, + + .CDCSpecification = VERSION_BCD(01.10), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x02, + + .Capabilities = 0x04, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x06, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = CDC_CSCP_CDCDataClass, + .SubClass = CDC_CSCP_NoDataSubclass, + .Protocol = CDC_CSCP_NoDataProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t ProductString = +{ + .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, + + #if DEVICE_PID == 0x0036 + .UnicodeString = L"Arduino Leonardo" + #elif DEVICE_PID == 0x0037 + .UnicodeString = L"Arduino Micro " + #elif DEVICE_PID == 0x003C + .UnicodeString = L"Arduino Esplora " + #else + .UnicodeString = L"USB IO board " + #endif +}; + +const USB_Descriptor_String_t ManufNameString = +{ + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + #if DEVICE_VID == 0x2341 + .UnicodeString = L"Arduino LLC" + #else + .UnicodeString = L"Unknown " + #endif +}; + +/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) + { + Address = &ProductString; + Size = ProductString.Header.Size; + } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) + { + Address = &ManufNameString; + Size = ManufNameString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/hardware/arduino/avr/bootloaders/caterina/Descriptors.h b/hardware/arduino/avr/bootloaders/caterina/Descriptors.h index 94091aef046..c843bec82ad 100644 --- a/hardware/arduino/avr/bootloaders/caterina/Descriptors.h +++ b/hardware/arduino/avr/bootloaders/caterina/Descriptors.h @@ -1,139 +1,139 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - /* Macros: */ - #if defined(__AVR_AT90USB1287__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB647__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB1286__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB646__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega32U6__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x87 - #elif defined(__AVR_ATmega16U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x8A - #elif defined(__AVR_ATmega16U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB162__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega8U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x93 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB82__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #else - #error The selected AVR part is not currently supported by this bootloader. - #endif - - /** Endpoint number for the CDC control interface event notification endpoint. */ - #define CDC_NOTIFICATION_EPNUM 2 - - /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ - #define CDC_TX_EPNUM 3 - - /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ - #define CDC_RX_EPNUM 4 - - /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ - #define CDC_TXRX_EPSIZE 16 - - /** Size of the CDC control interface notification endpoint bank, in bytes. */ - #define CDC_NOTIFICATION_EPSIZE 8 - - /* Type Defines: */ - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - - // CDC Control Interface - USB_Descriptor_Interface_t CDC_CCI_Interface; - USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; - USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; - USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; - USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; - - // CDC Data Interface - USB_Descriptor_Interface_t CDC_DCI_Interface; - USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; - USB_Descriptor_Endpoint_t CDC_DataInEndpoint; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) - ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif - +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + /* Macros: */ + #if defined(__AVR_AT90USB1287__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB647__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB1286__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB646__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega32U6__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x87 + #elif defined(__AVR_ATmega16U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x8A + #elif defined(__AVR_ATmega16U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB162__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega8U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB82__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #else + #error The selected AVR part is not currently supported by this bootloader. + #endif + + /** Endpoint number for the CDC control interface event notification endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ + #define CDC_TXRX_EPSIZE 16 + + /** Size of the CDC control interface notification endpoint bank, in bytes. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // CDC Control Interface + USB_Descriptor_Interface_t CDC_CCI_Interface; + USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; + USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; + USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + + // CDC Data Interface + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif + diff --git a/hardware/arduino/avr/bootloaders/caterina/Makefile b/hardware/arduino/avr/bootloaders/caterina/Makefile index b3bd9e8d3fe..884e3040da7 100644 --- a/hardware/arduino/avr/bootloaders/caterina/Makefile +++ b/hardware/arduino/avr/bootloaders/caterina/Makefile @@ -1,732 +1,732 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# USB vendor ID (VID) -# reuse of this VID by others is forbidden by USB-IF -# official Arduino LLC VID -# VID = 0x2341 - - -# USB product ID (PID) -# official Leonardo PID -# PID = 0x0036 -# official Micro PID -# PID = 0x0037 -# official Esplora PID -# PID = 0x003C - -# MCU name -MCU = atmega32u4 - - -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - - -# Target board (see library "Board Types" documentation, NONE for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USER - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - - -# Starting byte address of the bootloader, as a byte address - computed via the formula -# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) -# -# Note that the bootloader size and start address given in AVRStudio is in words and not -# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. -FLASH_SIZE_KB = 32 -BOOT_SECTION_SIZE_KB = 4 -BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = Caterina - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Path to the LUFA library -LUFA_PATH = ../../../../../../LUFA/LUFA-111009 - - -# LUFA library compile-time options and predefined tokens -LUFA_OPTS = -D USB_DEVICE_ONLY -LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 -LUFA_OPTS += -D ORDERED_EP_CONFIG -LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 -LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 -LUFA_OPTS += -D USE_RAM_DESCRIPTORS -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -LUFA_OPTS += -D NO_INTERNAL_SERIAL -LUFA_OPTS += -D NO_DEVICE_SELF_POWER -LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP -LUFA_OPTS += -D NO_SOF_EVENTS - -#LUFA_OPTS += -D NO_BLOCK_SUPPORT -#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT -#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT -LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT - - -# Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(LUFA_PATH)/ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=c99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -CDEFS += -DF_USB=$(F_USB)UL -CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) -CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CDEFS += -DDEVICE_VID=$(VID)UL -CDEFS += -DDEVICE_PID=$(PID)UL -CDEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) -ADEFS += -DF_USB=$(F_USB)UL -ADEFS += -DBOARD=BOARD_$(BOARD) -ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -ADEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -CPPDEFS += -DF_USB=$(F_USB)UL -CPPDEFS += -DBOARD=BOARD_$(BOARD) -CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CPPDEFS += $(LUFA_OPTS) -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CPPFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = avrispmkII - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -z $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - -doxygen: - @echo Generating Project Documentation \($(TARGET)\)... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -checksource: - @for f in $(SRC) $(CPPSRC) $(ASRC); do \ - if [ -f $$f ]; then \ - echo "Found Source File: $$f" ; \ - else \ - echo "Source File Not Found: $$f" ; \ - fi; done - - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff doxygen clean \ -clean_list clean_doxygen program debug gdb-config checksource - +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# USB vendor ID (VID) +# reuse of this VID by others is forbidden by USB-IF +# official Arduino LLC VID +# VID = 0x2341 + + +# USB product ID (PID) +# official Leonardo PID +# PID = 0x0036 +# official Micro PID +# PID = 0x0037 +# official Esplora PID +# PID = 0x003C + +# MCU name +MCU = atmega32u4 + + +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Starting byte address of the bootloader, as a byte address - computed via the formula +# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) +# +# Note that the bootloader size and start address given in AVRStudio is in words and not +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. +FLASH_SIZE_KB = 32 +BOOT_SECTION_SIZE_KB = 4 +BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Caterina + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../../../../../../LUFA/LUFA-111009 + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D ORDERED_EP_CONFIG +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D NO_INTERNAL_SERIAL +LUFA_OPTS += -D NO_DEVICE_SELF_POWER +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP +LUFA_OPTS += -D NO_SOF_EVENTS + +#LUFA_OPTS += -D NO_BLOCK_SUPPORT +#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT +#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT +LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_USB=$(F_USB)UL +CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += -DDEVICE_VID=$(VID)UL +CDEFS += -DDEVICE_PID=$(PID)UL +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_USB=$(F_USB)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +ADEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_USB=$(F_USB)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkII + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation \($(TARGET)\)... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +checksource: + @for f in $(SRC) $(CPPSRC) $(ASRC); do \ + if [ -f $$f ]; then \ + echo "Found Source File: $$f" ; \ + else \ + echo "Source File Not Found: $$f" ; \ + fi; done + + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program debug gdb-config checksource + diff --git a/hardware/arduino/avr/bootloaders/lilypad/LilyPadBOOT_168.hex b/hardware/arduino/avr/bootloaders/lilypad/LilyPadBOOT_168.hex index aea378e9676..0c7a4bd9616 100644 --- a/hardware/arduino/avr/bootloaders/lilypad/LilyPadBOOT_168.hex +++ b/hardware/arduino/avr/bootloaders/lilypad/LilyPadBOOT_168.hex @@ -1,117 +1,117 @@ -:103800000C94341C0C944F1C0C944F1C0C944F1CA7 -:103810000C944F1C0C944F1C0C944F1C0C944F1C7C -:103820000C944F1C0C944F1C0C944F1C0C944F1C6C -:103830000C944F1C0C944F1C0C944F1C0C944F1C5C -:103840000C944F1C0C944F1C0C944F1C0C944F1C4C -:103850000C944F1C0C944F1C0C944F1C0C944F1C3C -:103860000C944F1C0C944F1C11241FBECFEFD4E0BE -:10387000DEBFCDBF11E0A0E0B1E0E8E1FFE302C0B0 -:1038800005900D92A230B107D9F712E0A2E0B1E0A5 -:1038900001C01D92AD30B107E1F70C94311D0C94BD -:1038A000001CCF93DF93CDB7DEB724970FB6F89403 -:1038B000DEBF0FBECDBF382F882309F433E010924E -:1038C0000A02332309F44BC020E02D9A19821A8290 -:1038D0001B821C8289819A81AB81BC8180549F416B -:1038E000A040B040A0F489819A81AB81BC8101964F -:1038F000A11DB11D89839A83AB83BC8389819A8181 -:10390000AB81BC8180549F41A040B04060F32D98B2 -:1039100019821A821B821C8289819A81AB81BC81A7 -:1039200080549F41A040B040A0F489819A81AB812E -:10393000BC810196A11DB11D89839A83AB83BC8391 -:1039400089819A81AB81BC8180549F41A040B04065 -:1039500060F32F5F231708F4B8CF20930A02249650 -:103960000FB6F894DEBF0FBECDBFDF91CF910895A3 -:10397000EF92FF920F931F93EE24FF248701809113 -:10398000C00087FD17C00894E11CF11C011D111D2A -:1039900081E0E81689E0F8068DE3080780E0180763 -:1039A00070F3E0910201F091030109958091C0004C -:1039B00087FFE9CF8091C600992787FD90951F91D9 -:1039C0000F91FF90EF900895982F8091C00085FF90 -:1039D000FCCF9093C60008950E94B81C803271F00D -:1039E000809104018F5F80930401853009F0089570 -:1039F000E0910201F09103010995089584E10E948C -:103A0000E41C80E10E94E41C08951F93182F0E947B -:103A1000B81C803269F0809104018F5F80930401AB -:103A2000853079F4E0910201F0910301099509C014 -:103A300084E10E94E41C812F0E94E41C80E10E942A -:103A4000E41C1F910895282F882351F090E0809165 -:103A5000C00087FFFCCF8091C6009F5F2917B9F790 -:103A60000895CFEFD4E0DEBFCDBF000089E18093A1 -:103A7000C4001092C50088E18093C10086E0809365 -:103A8000C2005098589A259A83E00E94511C0E94C7 -:103A9000B81C8033B1F18133B9F1803409F454C0DA -:103AA000813409F45AC0823409F469C0853409F4B8 -:103AB0006CC0803531F1813521F1823511F18535C8 -:103AC00009F4B2C0863509F4BAC0843609F463C07B -:103AD000843709F4BBC0853709F40EC1863709F471 -:103AE0004AC0809104018F5F80930401853079F68C -:103AF000E0910201F091030109950E94B81C803306 -:103B000051F60E94EC1CC3CF0E94B81C803249F7CA -:103B100084E10E94E41C81E40E94E41C86E50E948A -:103B2000E41C82E50E94E41C80E20E94E41C89E41B -:103B30000E94E41C83E50E94E41C80E50E94E41CD2 -:103B400080E10E94E41CA3CF0E94B81C8638C8F212 -:103B50000E94B81C0E94EC1C9ACF0E94B81C8038AE -:103B600009F4F7C0813809F4F8C0823809F4F9C0C3 -:103B7000883909F4BDC080E00E94051D88CF84E12A -:103B80000E94231D0E94EC1C82CF85E00E94231D11 -:103B90000E94EC1C7CCF0E94B81C809309020E94FA -:103BA000B81C8093080280910C028E7F80930C02D7 -:103BB0000E94B81C853409F4C6C080910802909117 -:103BC0000902892B09F0ADC00E94B81C803209F0AF -:103BD00088CF80910C0280FFC8C08091080290912C -:103BE00009020097D1F02091060130910701E8E029 -:103BF000F1E0AC014E0F5F1FF999FECF32BD21BD40 -:103C0000819180BDFA9AF99A2F5F3F4F4E175F0757 -:103C100099F7309307012093060184E10E94E41C88 -:103C200080E10E94E41C33CF0E94B81C80930601FF -:103C30000E94B81C809307010E94EC1C28CF84E0EE -:103C40000E94231D80E00E94051D21CF0E94B81C08 -:103C5000809309020E94B81C809308020E94B81C3D -:103C6000853409F4F4C080910C028E7F80930C029D -:103C70008091060190910701880F991F9093070189 -:103C8000809306010E94B81C803209F000CF84E1C5 -:103C90000E94E41C2091080230910902211531058F -:103CA00019F1C0E0D0E0E0910601F09107018091A8 -:103CB0000C0280FFC4C0F999FECFF2BDE1BDF89AB5 -:103CC00080B50E94E41CE0910601F0910701319655 -:103CD000F0930701E0930601209108023091090258 -:103CE0002196C217D30718F380E10E94E41CCFCEBF -:103CF00083E00E94051DCBCE0E94B81C803209F0E3 -:103D0000F0CE84E10E94E41C8EE10E94E41C84E970 -:103D10000E94E41C86E00E94E41C80E10E94E41CF6 -:103D2000B6CEC0E0D0E008E011E00E94B81CF80177 -:103D300081938F0121968091080290910902C81702 -:103D4000D90798F341CF80910C02816080930C02D7 -:103D500034CF82E00E94051D9ACE81E00E94051DAD -:103D600096CE80E10E94051D92CE8091070187FDCD -:103D700080C010920B028091060190910701880F7C -:103D8000991F90930701809306018091080280FF9C -:103D900009C080910802909109020196909309024E -:103DA00080930802F894F999FECF1127E09106015B -:103DB000F0910701C8E0D1E08091080290910902DA -:103DC000103091F40091570001700130D9F303E0F5 -:103DD00000935700E8950091570001700130D9F326 -:103DE00001E100935700E895099019900091570060 -:103DF00001700130D9F301E000935700E895139565 -:103E0000103498F011270091570001700130D9F358 -:103E100005E000935700E8950091570001700130CC -:103E2000D9F301E100935700E8953296029709F023 -:103E3000C7CF103011F00296E5CF1124EECE81FFEE -:103E40000CC03196F0930701E093060149CF8091B1 -:103E50000C02816080930C0215CF84910E94E41CB7 -:103E60002091080230910902E0910601F0910701CA -:103E7000E8CF81E080930B027ECF0F931F930E94C7 -:103E8000B81C182F0E94E41C0E94B81C082F0E9426 -:103E9000E41C11362CF0175501363CF0075508C0CC -:103EA0001033D4F310530136CCF700330CF0005329 -:103EB0001295107F100F812F992787FD90951F91E4 -:103EC0000F9108951F93282F992787FD9095807F44 -:103ED00090709595879595958795959587959595E6 -:103EE00087958A304CF0982F995A822F8F708A309C -:103EF0004CF0182F195A08C0982F905D822F8F70A0 -:103F00008A30BCF7182F105D892F0E94E41C812F86 -:083F10000E94E41C1F910895BA -:023F1800800027 -:0400000300003800C1 -:00000001FF +:103800000C94341C0C944F1C0C944F1C0C944F1CA7 +:103810000C944F1C0C944F1C0C944F1C0C944F1C7C +:103820000C944F1C0C944F1C0C944F1C0C944F1C6C +:103830000C944F1C0C944F1C0C944F1C0C944F1C5C +:103840000C944F1C0C944F1C0C944F1C0C944F1C4C +:103850000C944F1C0C944F1C0C944F1C0C944F1C3C +:103860000C944F1C0C944F1C11241FBECFEFD4E0BE +:10387000DEBFCDBF11E0A0E0B1E0E8E1FFE302C0B0 +:1038800005900D92A230B107D9F712E0A2E0B1E0A5 +:1038900001C01D92AD30B107E1F70C94311D0C94BD +:1038A000001CCF93DF93CDB7DEB724970FB6F89403 +:1038B000DEBF0FBECDBF382F882309F433E010924E +:1038C0000A02332309F44BC020E02D9A19821A8290 +:1038D0001B821C8289819A81AB81BC8180549F416B +:1038E000A040B040A0F489819A81AB81BC8101964F +:1038F000A11DB11D89839A83AB83BC8389819A8181 +:10390000AB81BC8180549F41A040B04060F32D98B2 +:1039100019821A821B821C8289819A81AB81BC81A7 +:1039200080549F41A040B040A0F489819A81AB812E +:10393000BC810196A11DB11D89839A83AB83BC8391 +:1039400089819A81AB81BC8180549F41A040B04065 +:1039500060F32F5F231708F4B8CF20930A02249650 +:103960000FB6F894DEBF0FBECDBFDF91CF910895A3 +:10397000EF92FF920F931F93EE24FF248701809113 +:10398000C00087FD17C00894E11CF11C011D111D2A +:1039900081E0E81689E0F8068DE3080780E0180763 +:1039A00070F3E0910201F091030109958091C0004C +:1039B00087FFE9CF8091C600992787FD90951F91D9 +:1039C0000F91FF90EF900895982F8091C00085FF90 +:1039D000FCCF9093C60008950E94B81C803271F00D +:1039E000809104018F5F80930401853009F0089570 +:1039F000E0910201F09103010995089584E10E948C +:103A0000E41C80E10E94E41C08951F93182F0E947B +:103A1000B81C803269F0809104018F5F80930401AB +:103A2000853079F4E0910201F0910301099509C014 +:103A300084E10E94E41C812F0E94E41C80E10E942A +:103A4000E41C1F910895282F882351F090E0809165 +:103A5000C00087FFFCCF8091C6009F5F2917B9F790 +:103A60000895CFEFD4E0DEBFCDBF000089E18093A1 +:103A7000C4001092C50088E18093C10086E0809365 +:103A8000C2005098589A259A83E00E94511C0E94C7 +:103A9000B81C8033B1F18133B9F1803409F454C0DA +:103AA000813409F45AC0823409F469C0853409F4B8 +:103AB0006CC0803531F1813521F1823511F18535C8 +:103AC00009F4B2C0863509F4BAC0843609F463C07B +:103AD000843709F4BBC0853709F40EC1863709F471 +:103AE0004AC0809104018F5F80930401853079F68C +:103AF000E0910201F091030109950E94B81C803306 +:103B000051F60E94EC1CC3CF0E94B81C803249F7CA +:103B100084E10E94E41C81E40E94E41C86E50E948A +:103B2000E41C82E50E94E41C80E20E94E41C89E41B +:103B30000E94E41C83E50E94E41C80E50E94E41CD2 +:103B400080E10E94E41CA3CF0E94B81C8638C8F212 +:103B50000E94B81C0E94EC1C9ACF0E94B81C8038AE +:103B600009F4F7C0813809F4F8C0823809F4F9C0C3 +:103B7000883909F4BDC080E00E94051D88CF84E12A +:103B80000E94231D0E94EC1C82CF85E00E94231D11 +:103B90000E94EC1C7CCF0E94B81C809309020E94FA +:103BA000B81C8093080280910C028E7F80930C02D7 +:103BB0000E94B81C853409F4C6C080910802909117 +:103BC0000902892B09F0ADC00E94B81C803209F0AF +:103BD00088CF80910C0280FFC8C08091080290912C +:103BE00009020097D1F02091060130910701E8E029 +:103BF000F1E0AC014E0F5F1FF999FECF32BD21BD40 +:103C0000819180BDFA9AF99A2F5F3F4F4E175F0757 +:103C100099F7309307012093060184E10E94E41C88 +:103C200080E10E94E41C33CF0E94B81C80930601FF +:103C30000E94B81C809307010E94EC1C28CF84E0EE +:103C40000E94231D80E00E94051D21CF0E94B81C08 +:103C5000809309020E94B81C809308020E94B81C3D +:103C6000853409F4F4C080910C028E7F80930C029D +:103C70008091060190910701880F991F9093070189 +:103C8000809306010E94B81C803209F000CF84E1C5 +:103C90000E94E41C2091080230910902211531058F +:103CA00019F1C0E0D0E0E0910601F09107018091A8 +:103CB0000C0280FFC4C0F999FECFF2BDE1BDF89AB5 +:103CC00080B50E94E41CE0910601F0910701319655 +:103CD000F0930701E0930601209108023091090258 +:103CE0002196C217D30718F380E10E94E41CCFCEBF +:103CF00083E00E94051DCBCE0E94B81C803209F0E3 +:103D0000F0CE84E10E94E41C8EE10E94E41C84E970 +:103D10000E94E41C86E00E94E41C80E10E94E41CF6 +:103D2000B6CEC0E0D0E008E011E00E94B81CF80177 +:103D300081938F0121968091080290910902C81702 +:103D4000D90798F341CF80910C02816080930C02D7 +:103D500034CF82E00E94051D9ACE81E00E94051DAD +:103D600096CE80E10E94051D92CE8091070187FDCD +:103D700080C010920B028091060190910701880F7C +:103D8000991F90930701809306018091080280FF9C +:103D900009C080910802909109020196909309024E +:103DA00080930802F894F999FECF1127E09106015B +:103DB000F0910701C8E0D1E08091080290910902DA +:103DC000103091F40091570001700130D9F303E0F5 +:103DD00000935700E8950091570001700130D9F326 +:103DE00001E100935700E895099019900091570060 +:103DF00001700130D9F301E000935700E895139565 +:103E0000103498F011270091570001700130D9F358 +:103E100005E000935700E8950091570001700130CC +:103E2000D9F301E100935700E8953296029709F023 +:103E3000C7CF103011F00296E5CF1124EECE81FFEE +:103E40000CC03196F0930701E093060149CF8091B1 +:103E50000C02816080930C0215CF84910E94E41CB7 +:103E60002091080230910902E0910601F0910701CA +:103E7000E8CF81E080930B027ECF0F931F930E94C7 +:103E8000B81C182F0E94E41C0E94B81C082F0E9426 +:103E9000E41C11362CF0175501363CF0075508C0CC +:103EA0001033D4F310530136CCF700330CF0005329 +:103EB0001295107F100F812F992787FD90951F91E4 +:103EC0000F9108951F93282F992787FD9095807F44 +:103ED00090709595879595958795959587959595E6 +:103EE00087958A304CF0982F995A822F8F708A309C +:103EF0004CF0182F195A08C0982F905D822F8F70A0 +:103F00008A30BCF7182F105D892F0E94E41C812F86 +:083F10000E94E41C1F910895BA +:023F1800800027 +:0400000300003800C1 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega168.hex b/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega168.hex index c2f2b5b530c..9c4d33fb159 100644 --- a/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega168.hex +++ b/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega168.hex @@ -1,35 +1,35 @@ -:103E0000112484B714BE81FFF0D085E08093810037 -:103E100082E08093C00088E18093C10086E08093B7 -:103E2000C20080E18093C4008EE0C9D0259A86E06C -:103E300020E33CEF91E0309385002093840096BB13 -:103E4000B09BFECF1D9AA8958150A9F7CC24DD2404 -:103E500088248394B5E0AB2EA1E19A2EF3E0BF2E27 -:103E6000A2D0813461F49FD0082FAFD0023811F076 -:103E7000013811F484E001C083E08DD089C0823420 -:103E800011F484E103C0853419F485E0A6D080C024 -:103E9000853579F488D0E82EFF2485D0082F10E0EE -:103EA000102F00270E291F29000F111F8ED0680127 -:103EB0006FC0863521F484E090D080E0DECF843678 -:103EC00009F040C070D06FD0082F6DD080E0C816C8 -:103ED00088E3D80618F4F601B7BEE895C0E0D1E053 -:103EE00062D089930C17E1F7F0E0CF16F8E3DF0614 -:103EF00018F0F601B7BEE89568D007B600FCFDCF14 -:103F0000A601A0E0B1E02C9130E011968C911197C0 -:103F100090E0982F8827822B932B1296FA010C01A0 -:103F200087BEE89511244E5F5F4FF1E0A038BF07D0 -:103F300051F7F601A7BEE89507B600FCFDCF97BE86 -:103F4000E89526C08437B1F42ED02DD0F82E2BD092 -:103F50003CD0F601EF2C8F010F5F1F4F84911BD0D7 -:103F6000EA94F801C1F70894C11CD11CFA94CF0C53 -:103F7000D11C0EC0853739F428D08EE10CD084E9ED -:103F80000AD086E07ACF813511F488E018D01DD0B0 -:103F900080E101D065CF982F8091C00085FFFCCFD4 -:103FA0009093C60008958091C00087FFFCCF809158 -:103FB000C00084FD01C0A8958091C6000895E0E688 -:103FC000F0E098E1908380830895EDDF803219F06E -:103FD00088E0F5DFFFCF84E1DECF1F93182FE3DF0A -:103FE0001150E9F7F2DF1F91089580E0E8DFEE2736 -:043FF000FF2709940A -:023FFE000404B9 -:0400000300003E00BB -:00000001FF +:103E0000112484B714BE81FFF0D085E08093810037 +:103E100082E08093C00088E18093C10086E08093B7 +:103E2000C20080E18093C4008EE0C9D0259A86E06C +:103E300020E33CEF91E0309385002093840096BB13 +:103E4000B09BFECF1D9AA8958150A9F7CC24DD2404 +:103E500088248394B5E0AB2EA1E19A2EF3E0BF2E27 +:103E6000A2D0813461F49FD0082FAFD0023811F076 +:103E7000013811F484E001C083E08DD089C0823420 +:103E800011F484E103C0853419F485E0A6D080C024 +:103E9000853579F488D0E82EFF2485D0082F10E0EE +:103EA000102F00270E291F29000F111F8ED0680127 +:103EB0006FC0863521F484E090D080E0DECF843678 +:103EC00009F040C070D06FD0082F6DD080E0C816C8 +:103ED00088E3D80618F4F601B7BEE895C0E0D1E053 +:103EE00062D089930C17E1F7F0E0CF16F8E3DF0614 +:103EF00018F0F601B7BEE89568D007B600FCFDCF14 +:103F0000A601A0E0B1E02C9130E011968C911197C0 +:103F100090E0982F8827822B932B1296FA010C01A0 +:103F200087BEE89511244E5F5F4FF1E0A038BF07D0 +:103F300051F7F601A7BEE89507B600FCFDCF97BE86 +:103F4000E89526C08437B1F42ED02DD0F82E2BD092 +:103F50003CD0F601EF2C8F010F5F1F4F84911BD0D7 +:103F6000EA94F801C1F70894C11CD11CFA94CF0C53 +:103F7000D11C0EC0853739F428D08EE10CD084E9ED +:103F80000AD086E07ACF813511F488E018D01DD0B0 +:103F900080E101D065CF982F8091C00085FFFCCFD4 +:103FA0009093C60008958091C00087FFFCCF809158 +:103FB000C00084FD01C0A8958091C6000895E0E688 +:103FC000F0E098E1908380830895EDDF803219F06E +:103FD00088E0F5DFFFCF84E1DECF1F93182FE3DF0A +:103FE0001150E9F7F2DF1F91089580E0E8DFEE2736 +:043FF000FF2709940A +:023FFE000404B9 +:0400000300003E00BB +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex b/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex index a219f08336d..2a09a245d82 100644 --- a/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex +++ b/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex @@ -1,35 +1,35 @@ -:107E0000112484B714BE81FFF0D085E080938100F7 -:107E100082E08093C00088E18093C10086E0809377 -:107E2000C20080E18093C4008EE0C9D0259A86E02C -:107E300020E33CEF91E0309385002093840096BBD3 -:107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 -:107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 -:107E6000A2D0813461F49FD0082FAFD0023811F036 -:107E7000013811F484E001C083E08DD089C08234E0 -:107E800011F484E103C0853419F485E0A6D080C0E4 -:107E9000853579F488D0E82EFF2485D0082F10E0AE -:107EA000102F00270E291F29000F111F8ED06801E7 -:107EB0006FC0863521F484E090D080E0DECF843638 -:107EC00009F040C070D06FD0082F6DD080E0C81688 -:107ED00080E7D80618F4F601B7BEE895C0E0D1E017 -:107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 -:107EF00018F0F601B7BEE89568D007B600FCFDCFD4 -:107F0000A601A0E0B1E02C9130E011968C91119780 -:107F100090E0982F8827822B932B1296FA010C0160 -:107F200087BEE89511244E5F5F4FF1E0A038BF0790 -:107F300051F7F601A7BEE89507B600FCFDCF97BE46 -:107F4000E89526C08437B1F42ED02DD0F82E2BD052 -:107F50003CD0F601EF2C8F010F5F1F4F84911BD097 -:107F6000EA94F801C1F70894C11CD11CFA94CF0C13 -:107F7000D11C0EC0853739F428D08EE10CD085E9AC -:107F80000AD08FE07ACF813511F488E018D01DD067 -:107F900080E101D065CF982F8091C00085FFFCCF94 -:107FA0009093C60008958091C00087FFFCCF809118 -:107FB000C00084FD01C0A8958091C6000895E0E648 -:107FC000F0E098E1908380830895EDDF803219F02E -:107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA -:107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 -:047FF000FF270994CA -:027FFE00040479 -:0400000300007E007B -:00000001FF +:107E0000112484B714BE81FFF0D085E080938100F7 +:107E100082E08093C00088E18093C10086E0809377 +:107E2000C20080E18093C4008EE0C9D0259A86E02C +:107E300020E33CEF91E0309385002093840096BBD3 +:107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 +:107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 +:107E6000A2D0813461F49FD0082FAFD0023811F036 +:107E7000013811F484E001C083E08DD089C08234E0 +:107E800011F484E103C0853419F485E0A6D080C0E4 +:107E9000853579F488D0E82EFF2485D0082F10E0AE +:107EA000102F00270E291F29000F111F8ED06801E7 +:107EB0006FC0863521F484E090D080E0DECF843638 +:107EC00009F040C070D06FD0082F6DD080E0C81688 +:107ED00080E7D80618F4F601B7BEE895C0E0D1E017 +:107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 +:107EF00018F0F601B7BEE89568D007B600FCFDCFD4 +:107F0000A601A0E0B1E02C9130E011968C91119780 +:107F100090E0982F8827822B932B1296FA010C0160 +:107F200087BEE89511244E5F5F4FF1E0A038BF0790 +:107F300051F7F601A7BEE89507B600FCFDCF97BE46 +:107F4000E89526C08437B1F42ED02DD0F82E2BD052 +:107F50003CD0F601EF2C8F010F5F1F4F84911BD097 +:107F6000EA94F801C1F70894C11CD11CFA94CF0C13 +:107F7000D11C0EC0853739F428D08EE10CD085E9AC +:107F80000AD08FE07ACF813511F488E018D01DD067 +:107F900080E101D065CF982F8091C00085FFFCCF94 +:107FA0009093C60008958091C00087FFFCCF809118 +:107FB000C00084FD01C0A8958091C6000895E0E648 +:107FC000F0E098E1908380830895EDDF803219F02E +:107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA +:107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 +:047FF000FF270994CA +:027FFE00040479 +:0400000300007E007B +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega8.hex b/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega8.hex index b04f27685df..2278b244a59 100644 --- a/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega8.hex +++ b/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega8.hex @@ -1,33 +1,33 @@ -:101E000011248FE594E09EBF8DBF84B714BE81FF7F -:101E1000E2D085E08EBD82E08BB988E18AB986E8A0 -:101E200080BD80E189B98EE0C2D0BD9A96E020E302 -:101E30003CEF54E040E23DBD2CBD58BF08B602FE69 -:101E4000FDCF88B3842788BBA8959150A1F7CC24F7 -:101E5000DD2488248394B5E0AB2EA1E19A2EF3E033 -:101E6000BF2E9ED0813461F49BD0082FA4D00238BD -:101E700011F0013811F484E001C083E08DD089C0F5 -:101E8000823411F484E103C0853419F485E09BD0D9 -:101E900080C0853579F484D0E82EFF2481D0082FC6 -:101EA00010E0102F00270E291F29000F111F83D0CB -:101EB00068016FC0863521F484E085D080E0DECFF4 -:101EC000843609F040C06CD06BD0082F69D080E018 -:101ED000C81688E1D80618F4F601B7BEE895C0E048 -:101EE000D1E05ED089930C17E1F7F0E0CF16F8E16E -:101EF000DF0618F0F601B7BEE8955DD007B600FC26 -:101F0000FDCFA601A0E0B1E02C9130E011968C91BC -:101F1000119790E0982F8827822B932B1296FA0125 -:101F20000C0187BEE89511244E5F5F4FF1E0A034AD -:101F3000BF0751F7F601A7BEE89507B600FCFDCF35 -:101F400097BEE89526C08437B1F42AD029D0F82E60 -:101F500027D031D0F601EF2C8F010F5F1F4F8491F6 -:101F60001BD0EA94F801C1F70894C11CD11CFA9463 -:101F7000CF0CD11C0EC0853739F41DD08EE10CD0AA -:101F800083E90AD087E07ACF813511F488E00FD059 -:101F900012D080E101D065CF5D9BFECF8CB9089552 -:101FA0005F9BFECF5C9901C0A8958CB1089598E124 -:101FB00091BD81BD0895F4DF803219F088E0F7DF2C -:101FC000FFCF84E1E9CF1F93182FEADF1150E9F723 -:101FD000F2DF1F91089580E0EADFEE27FF270994E2 -:021FFE000404D9 -:0400000300001E00DB -:00000001FF +:101E000011248FE594E09EBF8DBF84B714BE81FF7F +:101E1000E2D085E08EBD82E08BB988E18AB986E8A0 +:101E200080BD80E189B98EE0C2D0BD9A96E020E302 +:101E30003CEF54E040E23DBD2CBD58BF08B602FE69 +:101E4000FDCF88B3842788BBA8959150A1F7CC24F7 +:101E5000DD2488248394B5E0AB2EA1E19A2EF3E033 +:101E6000BF2E9ED0813461F49BD0082FA4D00238BD +:101E700011F0013811F484E001C083E08DD089C0F5 +:101E8000823411F484E103C0853419F485E09BD0D9 +:101E900080C0853579F484D0E82EFF2481D0082FC6 +:101EA00010E0102F00270E291F29000F111F83D0CB +:101EB00068016FC0863521F484E085D080E0DECFF4 +:101EC000843609F040C06CD06BD0082F69D080E018 +:101ED000C81688E1D80618F4F601B7BEE895C0E048 +:101EE000D1E05ED089930C17E1F7F0E0CF16F8E16E +:101EF000DF0618F0F601B7BEE8955DD007B600FC26 +:101F0000FDCFA601A0E0B1E02C9130E011968C91BC +:101F1000119790E0982F8827822B932B1296FA0125 +:101F20000C0187BEE89511244E5F5F4FF1E0A034AD +:101F3000BF0751F7F601A7BEE89507B600FCFDCF35 +:101F400097BEE89526C08437B1F42AD029D0F82E60 +:101F500027D031D0F601EF2C8F010F5F1F4F8491F6 +:101F60001BD0EA94F801C1F70894C11CD11CFA9463 +:101F7000CF0CD11C0EC0853739F41DD08EE10CD0AA +:101F800083E90AD087E07ACF813511F488E00FD059 +:101F900012D080E101D065CF5D9BFECF8CB9089552 +:101FA0005F9BFECF5C9901C0A8958CB1089598E124 +:101FB00091BD81BD0895F4DF803219F088E0F7DF2C +:101FC000FFCF84E1E9CF1F93182FEADF1150E9F723 +:101FD000F2DF1F91089580E0EADFEE27FF270994E2 +:021FFE000404D9 +:0400000300001E00DB +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/stk500v2/License.txt b/hardware/arduino/avr/bootloaders/stk500v2/License.txt index e7dcdd8d748..a66eb905e34 100644 --- a/hardware/arduino/avr/bootloaders/stk500v2/License.txt +++ b/hardware/arduino/avr/bootloaders/stk500v2/License.txt @@ -1,280 +1,280 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 --git a/hardware/arduino/avr/bootloaders/stk500v2/Makefile b/hardware/arduino/avr/bootloaders/stk500v2/Makefile index 6b66a26615d..5560ef97e88 100644 --- a/hardware/arduino/avr/bootloaders/stk500v2/Makefile +++ b/hardware/arduino/avr/bootloaders/stk500v2/Makefile @@ -1,588 +1,588 @@ -# ---------------------------------------------------------------------------- -# Makefile to compile and link stk500boot bootloader -# Author: Peter Fleury -# File: $Id: Makefile,v 1.3 2006/03/04 19:26:17 peter Exp $ -# based on WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. -# -# Adjust F_CPU below to the clock frequency in Mhz of your AVR target -# Adjust BOOTLOADER_ADDRESS to your AVR target -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- -# = Mark Sproul msproul-at-skychariot.com - - -# MCU name -#MCU = atmega128 - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -#F_CPU = 16000000 - - -# Bootloader -# Please adjust if using a different AVR -# 0x0e00*2=0x1C00 for ATmega8 512 words Boot Size -# 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size -# 0xF800*2=0x1F000 for ATmega1280 -# 0xF000*2=0x1E000 for ATmega1280 -#BOOTLOADER_ADDRESS = 1E000 - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = stk500boot - - -# List C source files here. (C dependencies are automatically generated.) -SRC = stk500boot.c - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=gnu99 - - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU)UL - - -# Place -I options here -CINCS = - - - -#---------------- Compiler Options ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) $(CINCS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-jump-tables -CFLAGS += -Wall -Wstrict-prototypes -CFLAGS += -Wa,-adhlns=$(<:.c=.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -ahlms: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) - - -#--------------- bootloader linker Options ------- -# BOOTLOADER_ADDRESS (=Start of Boot Loader section -# in bytes - not words) is defined above. -#LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles -nodefaultlibs -#LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles -LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware: alf avr910 avrisp bascom bsd -# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 -# -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = stk500v2 - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = com1 # programmer connected to serial device - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: - - - - -# Define all object files. -OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(SRC:.c=.lst) $(ASRC:.S=.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - -############################################################ -# May 25, 2010 Adding 1280 support -mega1280: MCU = atmega1280 -mega1280: F_CPU = 16000000 -mega1280: BOOTLOADER_ADDRESS = 1E000 -mega1280: CFLAGS += -D_MEGA_BOARD_ -mega1280: begin gccversion sizebefore build sizeafter end - mv $(TARGET).hex stk500boot_v2_mega1280.hex - - -############################################################ -# Jul 6, 2010 Adding 2560 support -mega2560: MCU = atmega2560 -mega2560: F_CPU = 16000000 -mega2560: BOOTLOADER_ADDRESS = 3E000 -mega2560: CFLAGS += -D_MEGA_BOARD_ -mega2560: begin gccversion sizebefore build sizeafter end - mv $(TARGET).hex stk500boot_v2_mega2560.hex - - -############################################################ -#Initial config on Amber128 board -# avrdude: Device signature = 0x1e9702 -# avrdude: safemode: lfuse reads as 8F -# avrdude: safemode: hfuse reads as CB -# avrdude: safemode: efuse reads as FF -# Jul 17, 2010 Adding 128 support -############################################################ -amber128: MCU = atmega128 -#amber128: F_CPU = 16000000 -amber128: F_CPU = 14745600 -amber128: BOOTLOADER_ADDRESS = 1E000 -amber128: CFLAGS += -D_BOARD_AMBER128_ -amber128: begin gccversion sizebefore build sizeafter end - mv $(TARGET).hex stk500boot_v2_amber128.hex - -############################################################ -# Aug 23, 2010 Adding atmega2561 support -m2561: MCU = atmega2561 -m2561: F_CPU = 8000000 -m2561: BOOTLOADER_ADDRESS = 3E000 -m2561: CFLAGS += -D_ANDROID_2561_ -DBAUDRATE=57600 -m2561: begin gccversion sizebefore build sizeafter end - mv $(TARGET).hex stk500boot_v2_android2561.hex - - -############################################################ -# avrdude: Device signature = 0x1e9801 -# avrdude: safemode: lfuse reads as EC -# avrdude: safemode: hfuse reads as 18 -# avrdude: safemode: efuse reads as FD -# Aug 23, 2010 Adding cerebot 2560 @ 8mhz -#avrdude -P usb -c usbtiny -p m2560 -v -U flash:w:/Arduino/WiringBootV2_upd1/stk500boot_v2_cerebotplus.hex -############################################################ -cerebot: MCU = atmega2560 -cerebot: F_CPU = 8000000 -cerebot: BOOTLOADER_ADDRESS = 3E000 -cerebot: CFLAGS += -D_CEREBOTPLUS_BOARD_ -DBAUDRATE=38400 -DUART_BAUDRATE_DOUBLE_SPEED=1 -cerebot: begin gccversion sizebefore build sizeafter end - mv $(TARGET).hex stk500boot_v2_cerebotplus.hex - - -############################################################ -# Aug 23, 2010 Adding atmega2561 support -penguino: MCU = atmega32 -penguino: F_CPU = 16000000 -penguino: BOOTLOADER_ADDRESS = 7800 -penguino: CFLAGS += -D_PENGUINO_ -DBAUDRATE=57600 -penguino: begin gccversion sizebefore build sizeafter end - mv $(TARGET).hex stk500boot_v2_penguino.hex - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -build: elf hex eep lss sym -#build: hex eep lss sym - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) *.hex - $(REMOVE) *.eep - $(REMOVE) *.cof - $(REMOVE) *.elf - $(REMOVE) *.map - $(REMOVE) *.sym - $(REMOVE) *.lss - $(REMOVE) $(OBJ) - $(REMOVE) $(LST) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) .dep/* - - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff \ -clean clean_list program debug gdb-config - +# ---------------------------------------------------------------------------- +# Makefile to compile and link stk500boot bootloader +# Author: Peter Fleury +# File: $Id: Makefile,v 1.3 2006/03/04 19:26:17 peter Exp $ +# based on WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# +# Adjust F_CPU below to the clock frequency in Mhz of your AVR target +# Adjust BOOTLOADER_ADDRESS to your AVR target +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- +# = Mark Sproul msproul-at-skychariot.com + + +# MCU name +#MCU = atmega128 + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +#F_CPU = 16000000 + + +# Bootloader +# Please adjust if using a different AVR +# 0x0e00*2=0x1C00 for ATmega8 512 words Boot Size +# 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size +# 0xF800*2=0x1F000 for ATmega1280 +# 0xF000*2=0x1E000 for ATmega1280 +#BOOTLOADER_ADDRESS = 1E000 + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = stk500boot + + +# List C source files here. (C dependencies are automatically generated.) +SRC = stk500boot.c + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=gnu99 + + +# Place -D or -U options here +CDEFS = -DF_CPU=$(F_CPU)UL + + +# Place -I options here +CINCS = + + + +#---------------- Compiler Options ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-jump-tables +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + +#--------------- bootloader linker Options ------- +# BOOTLOADER_ADDRESS (=Start of Boot Loader section +# in bytes - not words) is defined above. +#LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles -nodefaultlibs +#LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles +LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = stk500v2 + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = com1 # programmer connected to serial device + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(SRC:.c=.lst) $(ASRC:.S=.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + +############################################################ +# May 25, 2010 Adding 1280 support +mega1280: MCU = atmega1280 +mega1280: F_CPU = 16000000 +mega1280: BOOTLOADER_ADDRESS = 1E000 +mega1280: CFLAGS += -D_MEGA_BOARD_ +mega1280: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_mega1280.hex + + +############################################################ +# Jul 6, 2010 Adding 2560 support +mega2560: MCU = atmega2560 +mega2560: F_CPU = 16000000 +mega2560: BOOTLOADER_ADDRESS = 3E000 +mega2560: CFLAGS += -D_MEGA_BOARD_ +mega2560: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_mega2560.hex + + +############################################################ +#Initial config on Amber128 board +# avrdude: Device signature = 0x1e9702 +# avrdude: safemode: lfuse reads as 8F +# avrdude: safemode: hfuse reads as CB +# avrdude: safemode: efuse reads as FF +# Jul 17, 2010 Adding 128 support +############################################################ +amber128: MCU = atmega128 +#amber128: F_CPU = 16000000 +amber128: F_CPU = 14745600 +amber128: BOOTLOADER_ADDRESS = 1E000 +amber128: CFLAGS += -D_BOARD_AMBER128_ +amber128: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_amber128.hex + +############################################################ +# Aug 23, 2010 Adding atmega2561 support +m2561: MCU = atmega2561 +m2561: F_CPU = 8000000 +m2561: BOOTLOADER_ADDRESS = 3E000 +m2561: CFLAGS += -D_ANDROID_2561_ -DBAUDRATE=57600 +m2561: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_android2561.hex + + +############################################################ +# avrdude: Device signature = 0x1e9801 +# avrdude: safemode: lfuse reads as EC +# avrdude: safemode: hfuse reads as 18 +# avrdude: safemode: efuse reads as FD +# Aug 23, 2010 Adding cerebot 2560 @ 8mhz +#avrdude -P usb -c usbtiny -p m2560 -v -U flash:w:/Arduino/WiringBootV2_upd1/stk500boot_v2_cerebotplus.hex +############################################################ +cerebot: MCU = atmega2560 +cerebot: F_CPU = 8000000 +cerebot: BOOTLOADER_ADDRESS = 3E000 +cerebot: CFLAGS += -D_CEREBOTPLUS_BOARD_ -DBAUDRATE=38400 -DUART_BAUDRATE_DOUBLE_SPEED=1 +cerebot: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_cerebotplus.hex + + +############################################################ +# Aug 23, 2010 Adding atmega2561 support +penguino: MCU = atmega32 +penguino: F_CPU = 16000000 +penguino: BOOTLOADER_ADDRESS = 7800 +penguino: CFLAGS += -D_PENGUINO_ -DBAUDRATE=57600 +penguino: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_penguino.hex + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +build: elf hex eep lss sym +#build: hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) *.hex + $(REMOVE) *.eep + $(REMOVE) *.cof + $(REMOVE) *.elf + $(REMOVE) *.map + $(REMOVE) *.sym + $(REMOVE) *.lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program debug gdb-config + diff --git a/hardware/arduino/avr/bootloaders/stk500v2/Mega2560-prod-firmware-2011-06-29.hex b/hardware/arduino/avr/bootloaders/stk500v2/Mega2560-prod-firmware-2011-06-29.hex index 4f366997c8d..a2213eee6b4 100644 --- a/hardware/arduino/avr/bootloaders/stk500v2/Mega2560-prod-firmware-2011-06-29.hex +++ b/hardware/arduino/avr/bootloaders/stk500v2/Mega2560-prod-firmware-2011-06-29.hex @@ -1,513 +1,513 @@ -:020000023000CC -:10E000000D94F6F20D941FF30D941FF30D941FF36E -:10E010000D941FF30D941FF30D941FF30D941FF334 -:10E020000D941FF30D941FF30D941FF30D941FF324 -:10E030000D941FF30D941FF30D941FF30D941FF314 -:10E040000D941FF30D941FF30D941FF30D941FF304 -:10E050000D941FF30D941FF30D941FF30D941FF3F4 -:10E060000D941FF30D941FF30D941FF30D941FF3E4 -:10E070000D941FF30D941FF30D941FF30D941FF3D4 -:10E080000D941FF30D941FF30D941FF30D941FF3C4 -:10E090000D941FF30D941FF30D941FF30D941FF3B4 -:10E0A0000D941FF30D941FF30D941FF30D941FF3A4 -:10E0B0000D941FF30D941FF30D941FF30D941FF394 -:10E0C0000D941FF30D941FF30D941FF30D941FF384 -:10E0D0000D941FF30D941FF30D941FF30D941FF374 -:10E0E0000D941FF341546D65676132353630004140 -:10E0F000726475696E6F206578706C6F72657220DE -:10E1000073746B3530305632206279204D4C530099 -:10E11000426F6F746C6F616465723E004875683F52 -:10E1200000436F6D70696C6564206F6E20203D2028 -:10E1300000435055205479706520202020203D2038 -:10E14000005F5F4156525F415243485F5F203D2070 -:10E1500000415652204C69624320566572203D2092 -:10E16000004743432056657273696F6E20203D203F -:10E1700000435055207369676E61747572653D2068 -:10E18000004C6F77206675736520202020203D208D -:10E1900000486967682066757365202020203D204F -:10E1A00000457874206675736520202020203D206E -:10E1B000004C6F636B2066757365202020203D2026 -:10E1C00000536570202039203230313000312E3636 -:10E1D0002E3700342E332E33005623202020414486 -:10E1E00044522020206F7020636F6465202020201F -:10E1F00020696E737472756374696F6E20616464F4 -:10E2000072202020496E74657272757074006E6F92 -:10E2100020766563746F7200726A6D702020006AE8 -:10E220006D7020005768617420706F72743A0050EE -:10E230006F7274206E6F7420737570706F72746576 -:10E2400064004D7573742062652061206C65747480 -:10E2500065720020005772697474696E67204545C5 -:10E260000052656164696E6720454500656570729E -:10E270006F6D206572726F7220636F756E743D00F2 -:10E28000504F525400303D5A65726F206164647281 -:10E290006573732063747273003F3D435055207360 -:10E2A0007461747300403D454550524F4D20746574 -:10E2B000737400423D426C696E6B204C45440045CE -:10E2C0003D44756D7020454550524F4D00463D44CC -:10E2D000756D7020464C41534800483D48656C7050 -:10E2E000004C3D4C69737420492F4F20506F72745D -:10E2F0007300513D517569742026206A756D702038 -:10E30000746F20757365722070676D00523D44759F -:10E310006D702052414D00563D73686F7720696ED5 -:10E320007465727275707420566563746F727300D1 -:10E33000593D506F727420626C696E6B002A0052F6 -:10E340004553455400494E543000494E543100491C -:10E350004E543200494E543300494E543400494E15 -:10E36000543500494E543600494E54370050434905 -:10E370004E5430005043494E5431005043494E549E -:10E3800032005744540054494D45523020434F4DBC -:10E3900050410054494D45523020434F4D504200AA -:10E3A00054494D455230204F56460054494D455230 -:10E3B0003120434150540054494D45523120434F80 -:10E3C0004D50410054494D45523120434F4D50422C -:10E3D0000054494D45523120434F4D50430054495C -:10E3E0004D455231204F56460054494D455232203A -:10E3F000434F4D50410054494D45523220434F4DFB -:10E4000050420054494D455232204F56460054491F -:10E410004D45523320434150540054494D455233E9 -:10E4200020434F4D50410054494D45523320434FF6 -:10E430004D50420054494D45523320434F4D5043B7 -:10E440000054494D455233204F56460054494D45DE -:10E45000523420434150540054494D4552342043D6 -:10E460004F4D50410054494D45523420434F4D507B -:10E47000420054494D45523420434F4D50430054BF -:10E48000494D455234204F56460054494D4552356A -:10E4900020434150540054494D45523520434F4D7F -:10E4A00050410054494D45523520434F4D50420094 -:10E4B00054494D45523520434F4D50430054494D2A -:10E4C000455235204F564600555341525430205244 -:10E4D000580055534152543020554452450055532D -:10E4E0004152543020545800555341525431205217 -:10E4F000580055534152543120554452450055530C -:10E5000041525431205458005553415254322052F4 -:10E5100058005553415254322055445245005553EA -:10E5200041525432205458005553415254332052D2 -:10E5300058005553415254332055445245005553C9 -:10E5400041525433205458005350492053544300EF -:10E5500041444300414E414C4F4720434F4D5000F2 -:10E560004545205245414459005457490053504DA8 -:10E57000205245414459002A003FE345E34AE34F16 -:10E58000E354E359E35EE363E368E36DE374E37B41 -:10E59000E382E3E9E3F6E303E4ABE3B7E3C4E3D107 -:10E5A000E3DEE386E393E3A0E348E5C8E4D2E4DEF8 -:10E5B000E454E550E560E50EE41AE427E434E44170 -:10E5C000E4E8E4F2E4FEE469E56DE54CE458E46572 -:10E5D000E472E47FE48AE496E4A3E4B0E4BDE408F2 -:10E5E000E512E51EE528E532E53EE50011241FBEF3 -:10E5F000CFEFD1E2DEBFCDBF01E00CBF12E0A0E063 -:10E60000B2E0EAEDFFEF03E00BBF02C007900D920E -:10E61000A030B107D9F712E0A0E0B2E001C01D922E -:10E62000AC30B107E1F70F94FBF40D94EBFF01E27E -:10E630000EBF0FEF0DBF11241FBE0D94FBF40D9400 -:10E6400000F020E030E040ED57E005C0FA013197DE -:10E65000F1F72F5F3F4F28173907C0F308959C014A -:10E66000442737FD4095542FDA01C901860F911DCB -:10E67000A11DB11DABBFFC018791882369F0809378 -:10E68000C6008091C00086FFFCCF8091C0008064EE -:10E690008093C0006F5FE8CF08958DE08093C6003F -:10E6A0008091C00086FFFCCF8091C0008064809381 -:10E6B000C0008AE08093C6008091C00086FFFCCF36 -:10E6C0008091C00080648093C00008950F942FF360 -:10E6D0000F944DF30895FC019081992359F0909384 -:10E6E000C6008091C00086FFFCCF8091C00080648E -:10E6F0008093C0003196992379F70895282F982F99 -:10E7000092959F70892F805D8A3308F0895F80938E -:10E71000C6008091C00086FFFCCF8091C00080645D -:10E720008093C000822F8F70982F905D9A3308F0ED -:10E73000995F9093C6008091C00086FFFCCF8091C6 -:10E74000C00080648093C00008959C01FB01853661 -:10E7500091051CF46330710594F0C90164E670E022 -:10E760000F948CFF605D7F4F6093C6008091C00066 -:10E7700086FFFCCF8091C00080648093C0002B3066 -:10E78000310514F43297B4F0C90164E670E00F94D7 -:10E790008CFF6AE070E00F948CFF605D7F4F6093A8 -:10E7A000C6008091C00086FFFCCF8091C0008064CD -:10E7B0008093C000C9016AE070E00F948CFFC0969E -:10E7C0008093C6008091C00086FFFCCF8091C0007E -:10E7D00080648093C0000895282F277020642093C0 -:10E7E0007C0020917B0086958695869590E08170CF -:10E7F000907033E0880F991F3A95E1F7277F282B17 -:10E8000020937B0080917A00806480937A008091CD -:10E810007A0086FDFCCF2091780040917900942FFA -:10E8200080E030E0282B392BC90108951F93182F61 -:10E8300080E892EE60E00F942FF31093C600809171 -:10E84000C00086FFFCCF8091C00080648093C00030 -:10E850000F944DF31F9108952F923F924F925F9224 -:10E860006F927F928F929F92AF92BF92CF92DF92E0 -:10E87000EF92FF920F931F93DF93CF93CDB7DEB745 -:10E8800062970FB6F894DEBF0FBECDBF382E622E52 -:10E89000CA01DB015C016D01772460E2262E2E01A6 -:10E8A0000894411C511C8BC081E0A81680E0B8067A -:10E8B00081E0C80680E0D80628F0C601AA27BB2759 -:10E8C0000F947EF3BB27AD2D9C2D8B2D0F947EF3E3 -:10E8D0008A2D0F947EF32092C6008091C00086FF9F -:10E8E000FCCF8091C00080648093C0009DE2909333 -:10E8F000C6008091C00086FFFCCF8091C00080647C -:10E900008093C0002092C6008091C00086FFFCCF9B -:10E910008091C00080648093C000198286017501D7 -:10E9200088249924A1E03A1651F03A1620F0B2E07A -:10E930003B1661F409C00BBFF701779007C0C70110 -:10E940000F94D5FF782E02C0F7017080872D0F94A9 -:10E950007EF32092C6008091C00086FFFCCF80919C -:10E96000C00080648093C000872D8052F401EF7056 -:10E97000F0708F3520F4E40DF51D708204C0E40DB5 -:10E98000F51D8EE280830894E11CF11C011D111D10 -:10E990000894811C911C90E18916910409F0C2CF62 -:10E9A00080E190E0A0E0B0E0A80EB91ECA1EDB1E18 -:10E9B000198AC2010F946BF30F944DF36A94662089 -:10E9C00009F072CF62960FB6F894DEBF0FBECDBFCE -:10E9D000CF91DF911F910F91FF90EF90DF90CF903B -:10E9E000BF90AF909F908F907F906F905F904F906F -:10E9F0003F902F9008952F923F924F925F926F9287 -:10EA00007F928F929F92AF92BF92CF92DF92EF92BE -:10EA1000FF920F931F93DF93CF93CDB7DEB7CD5304 -:10EA2000D1400FB6F894DEBF0FBECDBF279A2F9A04 -:10EA30008091C00082608093C00080E18093C40018 -:10EA400088E18093C1000000EE24FF248701B4E038 -:10EA5000AB2EB12CCC24DD2424C0C5010197F1F7E5 -:10EA60000894E11CF11C011D111D21E2E2162EE4A7 -:10EA7000F20620E0020720E0120718F0A1E0CA2EFB -:10EA8000D12CC801B70128E53BE140E050E00F94EC -:10EA90009FFF611571058105910519F485B18058B5 -:10EAA00085B98091C00087FD03C0C114D104A9F2CB -:10EAB000A6014F5F5F4FC25EDE4F59834883CE5140 -:10EAC000D140C25EDE4F68817981CE51D140613044 -:10EAD000710511F00D946EFFC05DDE4F1982188232 -:10EAE000C053D14060E0C15DDE4F1882CF52D140AB -:10EAF000AA24BB24C05EDE4F188219821A821B82B0 -:10EB0000C052D140CE5CDE4F188219821A821B821D -:10EB1000C253D14080E090E0A0E0B0E0ABBFFC0188 -:10EB2000A791B691C45CDE4FB983A883CC53D14082 -:10EB30000D9469FFC25EDE4FE881F981CE51D1406C -:10EB4000319709F52091C600C25EDE4F1982188206 -:10EB5000CE51D14022C02F5F3F4F4F4F5F4F2130EA -:10EB6000F2E13F07FAE74F07F0E05F0780F0C45C8F -:10EB7000DE4F08811981CC53D1400F5F1F4F19F030 -:10EB8000EE27FF27099420E030E040E050E080913C -:10EB9000C00087FFE0CF2091C600213209F094C663 -:10EBA0000894A11CB11C33E0A316B10409F08EC671 -:10EBB00000E010E018C041E24093C6008091C00020 -:10EBC00086FFFCCF8091C00080648093C0002F5FDF -:10EBD0003F4F2931310579F70F944DF30F5F1F4FE8 -:10EBE0000530110519F020E030E0E5CF1092080261 -:10EBF0001092090210920A0210920B021092040263 -:10EC00001092050210920602109207021092000262 -:10EC10001092010210920202109203028FEE90EE07 -:10EC200060E00F9466F380E191EE60E00F942FF3C3 -:10EC30008091C00087FFFCCF9091C600903608F00D -:10EC40009F759032B8F09093C6008091C00086FF07 -:10EC5000FCCF8091C00080648093C00080E28093EC -:10EC6000C6008091C00086FFFCCF8091C000806408 -:10EC70008093C000983409F4DBC19934B8F492341D -:10EC800009F45DC1933458F4903319F1903308F4CA -:10EC900018C69F33A1F1903409F013C6BDC0953456 -:10ECA00009F474C1963409F00CC69CC1923509F47C -:10ECB0002FC2933538F49C3409F4F9C1913509F029 -:10ECC00000C61CC2963509F449C2993509F0F9C548 -:10ECD0009CC485E892EE62E00F9466F31092040201 -:10ECE000109205021092060210920702109208027A -:10ECF0001092090210920A0210920B0217C189E9C0 -:10ED000092EE62E00F9466F38FEE90EE60E00F9467 -:10ED100066F381E291EE60E00F942FF381EC91EEC7 -:10ED200060E00F9466F381E391EE60E00F942FF3BF -:10ED300084EE90EE60E00F9466F381E491EE60E083 -:10ED40000F942FF386E090E061E070E00F94A5F35C -:10ED50000F944DF381E691EE60E00F942FF383ED75 -:10ED600091EE60E00F9466F381E591EE60E00F9420 -:10ED70002FF38DEC91EE60E00F9466F381E791EE56 -:10ED800060E00F942FF38EE10F947EF388E90F94E7 -:10ED90007EF381E00F947EF30F944DF381E891EEC2 -:10EDA00060E00F942FF319E0E0E0F0E010935700DB -:10EDB000E4918E2F0F947EF30F944DF381E991EE41 -:10EDC00060E00F942FF3E3E0F0E010935700E4913C -:10EDD0008E2F0F947EF30F944DF381EA91EE60E055 -:10EDE0000F942FF3E2E0F0E010935700E4918E2FA0 -:10EDF0000F947EF30F944DF381EB91EE60E00F944E -:10EE00002FF3E1E0F0E0109357001491812F0F945D -:10EE10007EF30F944DF307CF85EA92EE62E00F94F4 -:10EE200066F385E592EE60E00F9466F30F944DF380 -:10EE300000E010E019C0C8016F2D0F94DDFFFF2026 -:10EE400031F483E592EE60E00F942FF30BC0F09263 -:10EE5000C6008091C00086FFFCCF8091C000806416 -:10EE60008093C0000F5F1F4FC80181519F41AA27A7 -:10EE700097FDA095BA2FABBFFC01F7905AE2F516AB -:10EE800021F062E000301607B1F60F944DF30F94B5 -:10EE90004DF381E692EE60E00F9466F30F944DF32C -:10EEA000CC24DD2400E010E01EC0C8010F94D5FF83 -:10EEB000F82E882331F483E592EE60E00F942FF36F -:10EEC0000BC08093C6008091C00086FFFCCF80916C -:10EED000C00080648093C000FE1419F00894C11C27 -:10EEE000D11C0F5F1F4FC80181519F41AA2797FD79 -:10EEF000A095BA2FABBFFC01E7907AE2E71621F0AC -:10EF000082E00030180789F60F944DF30F944DF30B -:10EF10008CE692EE60E00F942FF3C60161E070E0A2 -:10EF20000F94A5F30F944DF30F944DF3109200023C -:10EF300010920102109202021092030274CE83EB2F -:10EF400092EE62E00F9466F3279A2F9A16C02F98DC -:10EF500080E090E0E0EDF7E03197F1F7019684363C -:10EF60009105C1F72F9A80E090E0E0EDF7E031974E -:10EF7000F1F7019684369105C1F78091C00087FFB3 -:10EF8000E6CF8091C00087FFFCCF95C48FEB92EE57 -:10EF900062E00F9466F3409100025091010260918B -:10EFA00002027091030281E020E10F942CF4809121 -:10EFB000000290910102A0910202B09103028050E0 -:10EFC0009F4FAF4FBF4F8093000290930102A093D9 -:10EFD0000202B093030280509041A040B04008F478 -:10EFE00022CEA4CF8DEC92EE62E00F9466F34091B6 -:10EFF000040250910502609106027091070280E0C0 -:10F0000020E10F942CF48091040290910502A091CC -:10F010000602B091070280509F4FAF4FBF4F8093C1 -:10F02000040290930502A0930602B0930702FBCD61 -:10F030008AED92EE62E00F9466F385E892EE60E06E -:10F040000F9466F389E992EE60E00F9466F385EA27 -:10F0500092EE60E00F9466F383EB92EE60E00F9423 -:10F0600066F38FEB92EE60E00F9466F38DEC92EE18 -:10F0700060E00F9466F38AED92EE60E00F9466F321 -:10F0800081EE92EE60E00F9466F382EF92EE60E024 -:10F090000F9466F38CE093EE60E00F9466F387E1E3 -:10F0A00093EE60E00F9466F380E393EEB9CD81EECA -:10F0B00092EE62E00F9466F381E40F9416F482E41A -:10F0C0000F9416F483E40F9416F484E40F9416F46A -:10F0D00085E40F9416F486E40F9416F487E40F94F5 -:10F0E00016F488E40F9416F48AE40F9416F48BE473 -:10F0F0000F9416F48CE40F9416F495CD82EF92EEF3 -:10F1000062E00F9466F399249394AA24BB2445C427 -:10F110008CE093EE62E00F9466F340910802509108 -:10F12000090260910A0270910B0282E020E10F94C3 -:10F130002CF48091080290910902A0910A02B091EA -:10F140000B0280509F4FAF4FBF4F809308029093A8 -:10F150000902A0930A02B0930B0265CD87E193EEFA -:10F1600062E00F9466F384EE90EE60E00F9466F335 -:10F1700089ED91EE60E00F9466F309E715EECC5D42 -:10F18000DE4F19830883C452D1406624772443019B -:10F19000CA5DDE4F19821882C652D140A401930184 -:10F1A0005695479537952795C85DDE4F2883398357 -:10F1B0004A835B83C852D140CA5DDE4F4881598182 -:10F1C000C652D1404F5F5F4FCA5DDE4F59834883BF -:10F1D000C652D140CA0162E070E00F94A5F350E23C -:10F1E0005093C6008091C00086FFFCCF8091C00084 -:10F1F00080648093C0006DE26093C6008091C0007F -:10F2000086FFFCCF8091C00080648093C00070E2D4 -:10F210007093C6008091C00086FFFCCF8091C00033 -:10F2200080648093C000C85DDE4FE880F9800A8169 -:10F230001B81C852D140BB27A12F902F8F2D0F9437 -:10F240007EF3C85DDE4F8881C852D1400F947EF3B3 -:10F2500070E2F72EF092C6008091C00086FFFCCFCE -:10F260008091C00080648093C0000DE30093C600CD -:10F270008091C00086FFFCCF8091C00080648093A5 -:10F28000C00010E21093C6008091C00086FFFCCF42 -:10F290008091C00080648093C0008BBEF3012791F1 -:10F2A000C45DDE4F2883CC52D140A22EBB24CC2497 -:10F2B000DD240894611C711C811C911C8BBEF30120 -:10F2C0008791282E332444245524142D032DF22C09 -:10F2D000EE24EA0CFB1C0C1D1D1D0894611C711C06 -:10F2E000811C911C8BBEF3013791C35DDE4F3883C7 -:10F2F000CD52D1400894611C711C811C911C8BBEA5 -:10F30000F3014791C25DDE4F4883CE52D1402DEFCD -:10F310003FEF4FEF5FEF620E731E841E951E0F943A -:10F320007EF330E23093C6008091C00086FFFCCFB0 -:10F330008091C00080648093C000C45DDE4F8881EE -:10F34000CC52D1400F947EF340E24093C6008091AE -:10F35000C00086FFFCCF8091C00080648093C00015 -:10F36000C25DDE4F8881CE52D1400F947EF350E2D1 -:10F370005093C6008091C00086FFFCCF8091C000F2 -:10F3800080648093C000C35DDE4F8881CD52D14040 -:10F390000F947EF360E26093C6008091C00086FF08 -:10F3A000FCCF8091C00080648093C0007FEFE7169F -:10F3B0007FEFF70670E0070770E0170731F48EE083 -:10F3C00092EE60E00F942FF3DFC0D801C701807088 -:10F3D000907CA070B0708050904CA040B040D1F5AF -:10F3E0002FEF3FE340E050E0E222F3220423152315 -:10F3F000C85DDE4FA880B980CA80DB80C852D1408A -:10F40000AE0CBF1CC01ED11EAA0CBB1CCC1CDD1C2C -:10F4100088E192EE60E00F942FF3BB27A12F902F8D -:10F420008F2D0F947EF38E2D0F947EF330E2309368 -:10F43000C6008091C00086FFFCCF8091C000806430 -:10F440008093C0004EE34093C6008091C00086FFC9 -:10F45000FCCF87C06EE07EEF80E090E0E622F722EE -:10F46000082319237CE0E71674E9F70670E0070724 -:10F4700070E0170709F088C0C25DDE4F8881CE5268 -:10F48000D140E82EFF2400E010E0102F0F2DFE2CBD -:10F49000EE24C35DDE4F9881CD52D140E90EF11CC0 -:10F4A000011D111DD601C50181709070A070B07052 -:10F4B000DC0199278827E80EF91E0A1F1B1F20EF81 -:10F4C00030E040E050E0A222B322C422D522F1E194 -:10F4D000AA0CBB1CCC1CDD1CFA95D1F7EA0CFB1C5A -:10F4E0000C1D1D1D41E050E060E070E0242235223B -:10F4F00046225722E5E1220C331C441C551CEA9598 -:10F50000D1F7E20CF31C041D151D57016801AA0C6C -:10F51000BB1CCC1CDD1C8FE192EE60E00F942FF33E -:10F52000C801AA27BB270F947EF3BB27A12F902FDA -:10F530008F2D0F947EF38E2D0F947EF350E2509317 -:10F54000C6008091C00086FFFCCF8091C00080641F -:10F550008093C0006EE36093C6008091C00086FF78 -:10F56000FCCF8091C00080648093C000C601AA27B0 -:10F57000BB270F947EF3BB27AD2D9C2D8B2D0F94B5 -:10F580007EF38A2D0F947EF370E27093C600809113 -:10F59000C00086FFFCCF8091C00080648093C000D3 -:10F5A000CC5DDE4FE881F981C452D140CF01AA275A -:10F5B00097FDA095BA2FABBFFC018791969160E0B3 -:10F5C0000F942FF30F944DF3CC5DDE4F088119811A -:10F5D000C452D1400E5F1F4FCC5DDE4F19830883AC -:10F5E000C452D140CA5DDE4F28813981C652D14014 -:10F5F0002933310509F417CB44E050E060E070E0B6 -:10F60000640E751E861E971EC9CD80E393EE62E0E0 -:10F610000F9466F384E292EE60E00F942FF38091F2 -:10F62000C00087FFFCCF1091C6001F751093C60065 -:10F630008091C00086FFFCCF8091C00080648093E1 -:10F64000C0000F944DF3812F81548A3108F036C1E8 -:10F65000163409F495C0173490F4133409F44EC0ED -:10F66000143430F41134F1F0123409F01DC130C0FB -:10F67000143409F459C0153409F016C16BC01A349A -:10F6800009F4C4C01B3438F4173409F48FC018349B -:10F6900009F00AC1A1C01B3409F4D2C01C3409F01E -:10F6A00003C1E8C08FEF81B90DC082B1809582B9E6 -:10F6B00080E090E0E0EDF7E03197F1F70196883CCB -:10F6C0009105C1F78091C00087FFEFCF12B8EFC05E -:10F6D0008FEF84B90DC085B1809585B980E090E049 -:10F6E000E0EDF7E03197F1F70196883C9105C1F71D -:10F6F0008091C00087FFEFCF15B8D9C08FEF87B9D1 -:10F700000DC088B1809588B980E090E0E0EDF7E029 -:10F710003197F1F70196883C9105C1F78091C000BF -:10F7200087FFEFCF18B8C3C08FEF8AB90DC08BB178 -:10F7300080958BB980E090E0E0EDF7E03197F1F74C -:10F740000196883C9105C1F78091C00087FFEFCFFB -:10F750001BB8ADC08FEF8DB90DC08EB180958EB93D -:10F7600080E090E0E0EDF7E03197F1F70196883C1A -:10F770009105C1F78091C00087FFEFCF1EB897C0F9 -:10F780008FEF80BB0DC081B3809581BB80E090E09E -:10F79000E0EDF7E03197F1F70196883C9105C1F76C -:10F7A0008091C00087FFEFCF11BA81C08FEF83BB7C -:10F7B0000DC084B3809584BB80E090E0E0EDF7E07D -:10F7C0003197F1F70196883C9105C1F78091C0000F -:10F7D00087FFEFCF14BA6BC08FEF809301010FC08A -:10F7E0008091020180958093020180E090E0E0ED3D -:10F7F000F7E03197F1F70196883C9105C1F78091C8 -:10F80000C00087FFEDCF1092020151C08FEF8093AF -:10F8100004010FC08091050180958093050180E06F -:10F8200090E0E0EDF7E03197F1F70196883C910523 -:10F83000C1F78091C00087FFEDCF1092050137C05E -:10F840008FEF809307010FC080910801809580930E -:10F85000080180E090E0E0EDF7E03197F1F70196E4 -:10F86000883C9105C1F78091C00087FFEDCF1092D1 -:10F8700008011DC08FEF80930A010FC080910B011A -:10F88000809580930B0180E090E0E0EDF7E0319708 -:10F89000F1F70196883C9105C1F78091C00087FF80 -:10F8A000EDCF10920B0103C08FE292EEB9C98091A7 -:10F8B000C00087FFFCCF8091C600B5C982E492EEFC -:10F8C000AFC98CE191EEACC9AA24BB24933061F19D -:10F8D000943028F4913089F0923008F508C09530C2 -:10F8E000B1F1953040F1963009F053C04EC02B3144 -:10F8F00009F020C991E06BE11DC9213041F0C15DE3 -:10F90000DE4F5881CF52D140251709F002C362273C -:10F91000C15DDE4F2883CF52D14092E00BC9B22F98 -:10F92000A0E0622793E006C9822F90E0A82BB92BB4 -:10F93000622794E0FFC82E3009F0EBC2622795E001 -:10F94000C05DDE4F19821882C053D140F3C8E1E098 -:10F95000F0E0EC0FFD1FC05DDE4FE880F980C05382 -:10F96000D140EE0DFF1D208387010F5F1F4FC05D4B -:10F97000DE4F19830883C053D14062270A171B0743 -:10F9800009F0D8C8D80196E0D5C8261709F0C1C239 -:10F9900003C0973009F0CEC899248981833109F4D6 -:10F9A000FCC08431C8F4863009F4C2C0873050F4FA -:10F9B000823009F4F0C0833009F458C0813009F076 -:10F9C0000AC23EC0813109F462C0823108F0A6C08B -:10F9D000803109F000C2DFC0883109F472C089317A -:10F9E00050F4853109F4D9C0853108F477C18631E6 -:10F9F00009F0F1C173C18A3109F457C08A3108F4A2 -:10FA00007CC08B3109F446C08D3109F0E4C18D8191 -:10FA1000803311F090E00AC08F81882311F49EE1B9 -:10FA200005C0813011F091E001C098E91A821B8273 -:10FA30008D818C831D829E831F8227E030E0CFC1A1 -:10FA40001A8288E08B8381E48C8386E58D8382E54E -:10FA50008E8389E48F8383E5888780E589878FE5B6 -:10FA60008A8782E38B872BE030E0B9C18A818139B4 -:10FA700041F0823941F0803911F48FE005C080E017 -:10FA800003C082E001C08AE01A828B8344C09924BB -:10FA9000939481C08D81882311F48EE12CC0813034 -:10FAA00011F081E028C088E926C01A82E1E0F0E088 -:10FAB00089E08093570084918B831C8224E030E09E -:10FAC0008EC18B81803589F48C81883039F4E2E0F5 -:10FAD000F0E089E08093570084910DC0E0E0F0E011 -:10FAE00089E080935700849106C0E3E0F0E089E06C -:10FAF0008093570084911A82DFCF8D81836C99E0C7 -:10FB0000E1E0F0E0082E90935700E89507B600FC7E -:10FB1000FDCF1A821B8223E030E061C11A82CE5CE5 -:10FB2000DE4F188219821A821B82C253D14055C1FE -:10FB30008A8190E0A0E0B0E0582F442733272227A5 -:10FB40008B8190E0A0E0B0E0DC0199278827282B8A -:10FB5000392B4A2B5B2B8D8190E0A0E0B0E0282B65 -:10FB6000392B4A2B5B2B8C8190E0A0E0B0E0BA2FC0 -:10FB7000A92F982F8827282B392B4A2B5B2B220F54 -:10FB8000331F441F551FC05EDE4F288339834A83CD -:10FB90005B83C052D1401A8220C19A812B8183316C -:10FBA00049F0C05EDE4F488159816A817B81C05235 -:10FBB000D1408AC0CE5CDE4F488159816A817B8109 -:10FBC000C253D140403080EC580783E0680780E0A2 -:10FBD0007807F0F483E0FA0160935B0080935700AC -:10FBE000E89507B600FCFDCFCE5CDE4F4881598119 -:10FBF0006A817B81C253D14040505F4F6F4F7F4F2E -:10FC0000CE5CDE4F488359836A837B83C253D140E5 -:10FC1000C95CDE4F9883C753D140CA5CDE4F18825F -:10FC2000C653D140022F10E0CA5CDE4F6881798153 -:10FC3000C653D140062B172BC05EDE4F4881598139 -:10FC40006A817B81C052D140DE011B9631E08C91EC -:10FC500011962C9111971296C75CDE4F2883C953D9 -:10FC6000D140C85CDE4F1882C853D14090E0C85CD8 -:10FC7000DE4FE881F981C853D1408E2B9F2B0C01B8 -:10FC8000FA0160935B0030935700E89511244E5FB2 -:10FC90005F4F6F4F7F4F02501040C9F685E0C05E46 -:10FCA000DE4FE880F9800A811B81C052D140F70104 -:10FCB00000935B0080935700E89507B600FCFDCFEA -:10FCC00081E180935700E8951A82C05EDE4F488339 -:10FCD00059836A837B83C052D1407FC0FA80C55C60 -:10FCE000DE4FF882CB53D140C65CDE4F1882CA5338 -:10FCF000D1408B81C82EDD24C65CDE4F088119817E -:10FD0000CA53D140C02AD12A1A828981BE016D5FAF -:10FD10007F4F843121F59601C05EDE4FE880F98087 -:10FD20000A811B81C052D1400BBFF7018791969188 -:10FD3000DB018C9311969C936E5F7F4FD801C701B6 -:10FD40000296A11DB11DC05EDE4F88839983AA83F0 -:10FD5000BB83C052D14022503040F1F636C0C05E65 -:10FD6000DE4F288139814A815B81C052D14008949D -:10FD7000C108D108760100E010E00894C11CD11C34 -:10FD80000894E11CF11C011D111DE20EF31E041F5D -:10FD9000151F21BDBB27A52F942F832F82BD2F5F59 -:10FDA0003F4F4F4F5F4FF89A80B5DB018D93BD01F8 -:10FDB0002E153F054007510761F7C05EDE4F2883CF -:10FDC00039834A835B83C052D14096012D5F3F4FF8 -:10FDD000FB01108204C080EC8A8322E030E08BE1DA -:10FDE0008093C6008091C00086FFFCCF8091C00048 -:10FDF00080648093C000C15DDE4FF881CF52D14056 -:10FE0000F093C6008091C00086FFFCCF8091C000B7 -:10FE100080648093C000432F3093C6008091C0005F -:10FE200086FFFCCF8091C00080648093C000922F39 -:10FE30002093C6008091C00086FFFCCF8091C00057 -:10FE400080648093C0008EE08093C6008091C000E3 -:10FE500086FFFCCF8091C00080648093C00065E184 -:10FE6000C15DDE4FE880CF52D1406E2569276427FF -:10FE7000FE01319610C090819093C6008091C00021 -:10FE800086FFFCCF31968091C00080648093C000D3 -:10FE90006927215030402115310569F76093C6006C -:10FEA0008091C00086FFFCCF8091C0008064809369 -:10FEB000C00085B1805885B9992081F4C15DDE4FBD -:10FEC0000881CF52D1400F5FC15DDE4F0883CF5212 -:10FED000D14090E0A0E0B0E00D949AF527982F98DB -:10FEE00080E090E020ED37E0F9013197F1F70196DD -:10FEF00084369105C9F700008091C0008D7F809302 -:10FF0000C00081E180935700E895EE27FF27099410 -:10FF1000FFCF90E00D949AF597FB092E07260AD0A3 -:10FF200077FD04D02ED006D000201AF4709561958C -:10FF30007F4F0895F6F7909581959F4F0895A1E220 -:10FF40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F53 -:10FF5000FF1FA217B307E407F50720F0A21BB30B9E -:10FF6000E40BF50B661F771F881F991F1A9469F71A -:10FF700060957095809590959B01AC01BD01CF0176 -:10FF80000895AA1BBB1B51E107C0AA1FBB1FA617E0 -:10FF9000B70710F0A61BB70B881F991F5A95A9F732 -:10FFA00080959095BC01CD010895F999FECF92BD41 -:10FFB00081BDF89A992780B50895262FF999FECF2B -:10FFC0001FBA92BD81BD20BD0FB6F894FA9AF99A76 -:0AFFD0000FBE01960895F894FFCFCC -:040000033000E000E9 -:00000001FF +:020000023000CC +:10E000000D94F6F20D941FF30D941FF30D941FF36E +:10E010000D941FF30D941FF30D941FF30D941FF334 +:10E020000D941FF30D941FF30D941FF30D941FF324 +:10E030000D941FF30D941FF30D941FF30D941FF314 +:10E040000D941FF30D941FF30D941FF30D941FF304 +:10E050000D941FF30D941FF30D941FF30D941FF3F4 +:10E060000D941FF30D941FF30D941FF30D941FF3E4 +:10E070000D941FF30D941FF30D941FF30D941FF3D4 +:10E080000D941FF30D941FF30D941FF30D941FF3C4 +:10E090000D941FF30D941FF30D941FF30D941FF3B4 +:10E0A0000D941FF30D941FF30D941FF30D941FF3A4 +:10E0B0000D941FF30D941FF30D941FF30D941FF394 +:10E0C0000D941FF30D941FF30D941FF30D941FF384 +:10E0D0000D941FF30D941FF30D941FF30D941FF374 +:10E0E0000D941FF341546D65676132353630004140 +:10E0F000726475696E6F206578706C6F72657220DE +:10E1000073746B3530305632206279204D4C530099 +:10E11000426F6F746C6F616465723E004875683F52 +:10E1200000436F6D70696C6564206F6E20203D2028 +:10E1300000435055205479706520202020203D2038 +:10E14000005F5F4156525F415243485F5F203D2070 +:10E1500000415652204C69624320566572203D2092 +:10E16000004743432056657273696F6E20203D203F +:10E1700000435055207369676E61747572653D2068 +:10E18000004C6F77206675736520202020203D208D +:10E1900000486967682066757365202020203D204F +:10E1A00000457874206675736520202020203D206E +:10E1B000004C6F636B2066757365202020203D2026 +:10E1C00000536570202039203230313000312E3636 +:10E1D0002E3700342E332E33005623202020414486 +:10E1E00044522020206F7020636F6465202020201F +:10E1F00020696E737472756374696F6E20616464F4 +:10E2000072202020496E74657272757074006E6F92 +:10E2100020766563746F7200726A6D702020006AE8 +:10E220006D7020005768617420706F72743A0050EE +:10E230006F7274206E6F7420737570706F72746576 +:10E2400064004D7573742062652061206C65747480 +:10E2500065720020005772697474696E67204545C5 +:10E260000052656164696E6720454500656570729E +:10E270006F6D206572726F7220636F756E743D00F2 +:10E28000504F525400303D5A65726F206164647281 +:10E290006573732063747273003F3D435055207360 +:10E2A0007461747300403D454550524F4D20746574 +:10E2B000737400423D426C696E6B204C45440045CE +:10E2C0003D44756D7020454550524F4D00463D44CC +:10E2D000756D7020464C41534800483D48656C7050 +:10E2E000004C3D4C69737420492F4F20506F72745D +:10E2F0007300513D517569742026206A756D702038 +:10E30000746F20757365722070676D00523D44759F +:10E310006D702052414D00563D73686F7720696ED5 +:10E320007465727275707420566563746F727300D1 +:10E33000593D506F727420626C696E6B002A0052F6 +:10E340004553455400494E543000494E543100491C +:10E350004E543200494E543300494E543400494E15 +:10E36000543500494E543600494E54370050434905 +:10E370004E5430005043494E5431005043494E549E +:10E3800032005744540054494D45523020434F4DBC +:10E3900050410054494D45523020434F4D504200AA +:10E3A00054494D455230204F56460054494D455230 +:10E3B0003120434150540054494D45523120434F80 +:10E3C0004D50410054494D45523120434F4D50422C +:10E3D0000054494D45523120434F4D50430054495C +:10E3E0004D455231204F56460054494D455232203A +:10E3F000434F4D50410054494D45523220434F4DFB +:10E4000050420054494D455232204F56460054491F +:10E410004D45523320434150540054494D455233E9 +:10E4200020434F4D50410054494D45523320434FF6 +:10E430004D50420054494D45523320434F4D5043B7 +:10E440000054494D455233204F56460054494D45DE +:10E45000523420434150540054494D4552342043D6 +:10E460004F4D50410054494D45523420434F4D507B +:10E47000420054494D45523420434F4D50430054BF +:10E48000494D455234204F56460054494D4552356A +:10E4900020434150540054494D45523520434F4D7F +:10E4A00050410054494D45523520434F4D50420094 +:10E4B00054494D45523520434F4D50430054494D2A +:10E4C000455235204F564600555341525430205244 +:10E4D000580055534152543020554452450055532D +:10E4E0004152543020545800555341525431205217 +:10E4F000580055534152543120554452450055530C +:10E5000041525431205458005553415254322052F4 +:10E5100058005553415254322055445245005553EA +:10E5200041525432205458005553415254332052D2 +:10E5300058005553415254332055445245005553C9 +:10E5400041525433205458005350492053544300EF +:10E5500041444300414E414C4F4720434F4D5000F2 +:10E560004545205245414459005457490053504DA8 +:10E57000205245414459002A003FE345E34AE34F16 +:10E58000E354E359E35EE363E368E36DE374E37B41 +:10E59000E382E3E9E3F6E303E4ABE3B7E3C4E3D107 +:10E5A000E3DEE386E393E3A0E348E5C8E4D2E4DEF8 +:10E5B000E454E550E560E50EE41AE427E434E44170 +:10E5C000E4E8E4F2E4FEE469E56DE54CE458E46572 +:10E5D000E472E47FE48AE496E4A3E4B0E4BDE408F2 +:10E5E000E512E51EE528E532E53EE50011241FBEF3 +:10E5F000CFEFD1E2DEBFCDBF01E00CBF12E0A0E063 +:10E60000B2E0EAEDFFEF03E00BBF02C007900D920E +:10E61000A030B107D9F712E0A0E0B2E001C01D922E +:10E62000AC30B107E1F70F94FBF40D94EBFF01E27E +:10E630000EBF0FEF0DBF11241FBE0D94FBF40D9400 +:10E6400000F020E030E040ED57E005C0FA013197DE +:10E65000F1F72F5F3F4F28173907C0F308959C014A +:10E66000442737FD4095542FDA01C901860F911DCB +:10E67000A11DB11DABBFFC018791882369F0809378 +:10E68000C6008091C00086FFFCCF8091C0008064EE +:10E690008093C0006F5FE8CF08958DE08093C6003F +:10E6A0008091C00086FFFCCF8091C0008064809381 +:10E6B000C0008AE08093C6008091C00086FFFCCF36 +:10E6C0008091C00080648093C00008950F942FF360 +:10E6D0000F944DF30895FC019081992359F0909384 +:10E6E000C6008091C00086FFFCCF8091C00080648E +:10E6F0008093C0003196992379F70895282F982F99 +:10E7000092959F70892F805D8A3308F0895F80938E +:10E71000C6008091C00086FFFCCF8091C00080645D +:10E720008093C000822F8F70982F905D9A3308F0ED +:10E73000995F9093C6008091C00086FFFCCF8091C6 +:10E74000C00080648093C00008959C01FB01853661 +:10E7500091051CF46330710594F0C90164E670E022 +:10E760000F948CFF605D7F4F6093C6008091C00066 +:10E7700086FFFCCF8091C00080648093C0002B3066 +:10E78000310514F43297B4F0C90164E670E00F94D7 +:10E790008CFF6AE070E00F948CFF605D7F4F6093A8 +:10E7A000C6008091C00086FFFCCF8091C0008064CD +:10E7B0008093C000C9016AE070E00F948CFFC0969E +:10E7C0008093C6008091C00086FFFCCF8091C0007E +:10E7D00080648093C0000895282F277020642093C0 +:10E7E0007C0020917B0086958695869590E08170CF +:10E7F000907033E0880F991F3A95E1F7277F282B17 +:10E8000020937B0080917A00806480937A008091CD +:10E810007A0086FDFCCF2091780040917900942FFA +:10E8200080E030E0282B392BC90108951F93182F61 +:10E8300080E892EE60E00F942FF31093C600809171 +:10E84000C00086FFFCCF8091C00080648093C00030 +:10E850000F944DF31F9108952F923F924F925F9224 +:10E860006F927F928F929F92AF92BF92CF92DF92E0 +:10E87000EF92FF920F931F93DF93CF93CDB7DEB745 +:10E8800062970FB6F894DEBF0FBECDBF382E622E52 +:10E89000CA01DB015C016D01772460E2262E2E01A6 +:10E8A0000894411C511C8BC081E0A81680E0B8067A +:10E8B00081E0C80680E0D80628F0C601AA27BB2759 +:10E8C0000F947EF3BB27AD2D9C2D8B2D0F947EF3E3 +:10E8D0008A2D0F947EF32092C6008091C00086FF9F +:10E8E000FCCF8091C00080648093C0009DE2909333 +:10E8F000C6008091C00086FFFCCF8091C00080647C +:10E900008093C0002092C6008091C00086FFFCCF9B +:10E910008091C00080648093C000198286017501D7 +:10E9200088249924A1E03A1651F03A1620F0B2E07A +:10E930003B1661F409C00BBFF701779007C0C70110 +:10E940000F94D5FF782E02C0F7017080872D0F94A9 +:10E950007EF32092C6008091C00086FFFCCF80919C +:10E96000C00080648093C000872D8052F401EF7056 +:10E97000F0708F3520F4E40DF51D708204C0E40DB5 +:10E98000F51D8EE280830894E11CF11C011D111D10 +:10E990000894811C911C90E18916910409F0C2CF62 +:10E9A00080E190E0A0E0B0E0A80EB91ECA1EDB1E18 +:10E9B000198AC2010F946BF30F944DF36A94662089 +:10E9C00009F072CF62960FB6F894DEBF0FBECDBFCE +:10E9D000CF91DF911F910F91FF90EF90DF90CF903B +:10E9E000BF90AF909F908F907F906F905F904F906F +:10E9F0003F902F9008952F923F924F925F926F9287 +:10EA00007F928F929F92AF92BF92CF92DF92EF92BE +:10EA1000FF920F931F93DF93CF93CDB7DEB7CD5304 +:10EA2000D1400FB6F894DEBF0FBECDBF279A2F9A04 +:10EA30008091C00082608093C00080E18093C40018 +:10EA400088E18093C1000000EE24FF248701B4E038 +:10EA5000AB2EB12CCC24DD2424C0C5010197F1F7E5 +:10EA60000894E11CF11C011D111D21E2E2162EE4A7 +:10EA7000F20620E0020720E0120718F0A1E0CA2EFB +:10EA8000D12CC801B70128E53BE140E050E00F94EC +:10EA90009FFF611571058105910519F485B18058B5 +:10EAA00085B98091C00087FD03C0C114D104A9F2CB +:10EAB000A6014F5F5F4FC25EDE4F59834883CE5140 +:10EAC000D140C25EDE4F68817981CE51D140613044 +:10EAD000710511F00D946EFFC05DDE4F1982188232 +:10EAE000C053D14060E0C15DDE4F1882CF52D140AB +:10EAF000AA24BB24C05EDE4F188219821A821B82B0 +:10EB0000C052D140CE5CDE4F188219821A821B821D +:10EB1000C253D14080E090E0A0E0B0E0ABBFFC0188 +:10EB2000A791B691C45CDE4FB983A883CC53D14082 +:10EB30000D9469FFC25EDE4FE881F981CE51D1406C +:10EB4000319709F52091C600C25EDE4F1982188206 +:10EB5000CE51D14022C02F5F3F4F4F4F5F4F2130EA +:10EB6000F2E13F07FAE74F07F0E05F0780F0C45C8F +:10EB7000DE4F08811981CC53D1400F5F1F4F19F030 +:10EB8000EE27FF27099420E030E040E050E080913C +:10EB9000C00087FFE0CF2091C600213209F094C663 +:10EBA0000894A11CB11C33E0A316B10409F08EC671 +:10EBB00000E010E018C041E24093C6008091C00020 +:10EBC00086FFFCCF8091C00080648093C0002F5FDF +:10EBD0003F4F2931310579F70F944DF30F5F1F4FE8 +:10EBE0000530110519F020E030E0E5CF1092080261 +:10EBF0001092090210920A0210920B021092040263 +:10EC00001092050210920602109207021092000262 +:10EC10001092010210920202109203028FEE90EE07 +:10EC200060E00F9466F380E191EE60E00F942FF3C3 +:10EC30008091C00087FFFCCF9091C600903608F00D +:10EC40009F759032B8F09093C6008091C00086FF07 +:10EC5000FCCF8091C00080648093C00080E28093EC +:10EC6000C6008091C00086FFFCCF8091C000806408 +:10EC70008093C000983409F4DBC19934B8F492341D +:10EC800009F45DC1933458F4903319F1903308F4CA +:10EC900018C69F33A1F1903409F013C6BDC0953456 +:10ECA00009F474C1963409F00CC69CC1923509F47C +:10ECB0002FC2933538F49C3409F4F9C1913509F029 +:10ECC00000C61CC2963509F449C2993509F0F9C548 +:10ECD0009CC485E892EE62E00F9466F31092040201 +:10ECE000109205021092060210920702109208027A +:10ECF0001092090210920A0210920B0217C189E9C0 +:10ED000092EE62E00F9466F38FEE90EE60E00F9467 +:10ED100066F381E291EE60E00F942FF381EC91EEC7 +:10ED200060E00F9466F381E391EE60E00F942FF3BF +:10ED300084EE90EE60E00F9466F381E491EE60E083 +:10ED40000F942FF386E090E061E070E00F94A5F35C +:10ED50000F944DF381E691EE60E00F942FF383ED75 +:10ED600091EE60E00F9466F381E591EE60E00F9420 +:10ED70002FF38DEC91EE60E00F9466F381E791EE56 +:10ED800060E00F942FF38EE10F947EF388E90F94E7 +:10ED90007EF381E00F947EF30F944DF381E891EEC2 +:10EDA00060E00F942FF319E0E0E0F0E010935700DB +:10EDB000E4918E2F0F947EF30F944DF381E991EE41 +:10EDC00060E00F942FF3E3E0F0E010935700E4913C +:10EDD0008E2F0F947EF30F944DF381EA91EE60E055 +:10EDE0000F942FF3E2E0F0E010935700E4918E2FA0 +:10EDF0000F947EF30F944DF381EB91EE60E00F944E +:10EE00002FF3E1E0F0E0109357001491812F0F945D +:10EE10007EF30F944DF307CF85EA92EE62E00F94F4 +:10EE200066F385E592EE60E00F9466F30F944DF380 +:10EE300000E010E019C0C8016F2D0F94DDFFFF2026 +:10EE400031F483E592EE60E00F942FF30BC0F09263 +:10EE5000C6008091C00086FFFCCF8091C000806416 +:10EE60008093C0000F5F1F4FC80181519F41AA27A7 +:10EE700097FDA095BA2FABBFFC01F7905AE2F516AB +:10EE800021F062E000301607B1F60F944DF30F94B5 +:10EE90004DF381E692EE60E00F9466F30F944DF32C +:10EEA000CC24DD2400E010E01EC0C8010F94D5FF83 +:10EEB000F82E882331F483E592EE60E00F942FF36F +:10EEC0000BC08093C6008091C00086FFFCCF80916C +:10EED000C00080648093C000FE1419F00894C11C27 +:10EEE000D11C0F5F1F4FC80181519F41AA2797FD79 +:10EEF000A095BA2FABBFFC01E7907AE2E71621F0AC +:10EF000082E00030180789F60F944DF30F944DF30B +:10EF10008CE692EE60E00F942FF3C60161E070E0A2 +:10EF20000F94A5F30F944DF30F944DF3109200023C +:10EF300010920102109202021092030274CE83EB2F +:10EF400092EE62E00F9466F3279A2F9A16C02F98DC +:10EF500080E090E0E0EDF7E03197F1F7019684363C +:10EF60009105C1F72F9A80E090E0E0EDF7E031974E +:10EF7000F1F7019684369105C1F78091C00087FFB3 +:10EF8000E6CF8091C00087FFFCCF95C48FEB92EE57 +:10EF900062E00F9466F3409100025091010260918B +:10EFA00002027091030281E020E10F942CF4809121 +:10EFB000000290910102A0910202B09103028050E0 +:10EFC0009F4FAF4FBF4F8093000290930102A093D9 +:10EFD0000202B093030280509041A040B04008F478 +:10EFE00022CEA4CF8DEC92EE62E00F9466F34091B6 +:10EFF000040250910502609106027091070280E0C0 +:10F0000020E10F942CF48091040290910502A091CC +:10F010000602B091070280509F4FAF4FBF4F8093C1 +:10F02000040290930502A0930602B0930702FBCD61 +:10F030008AED92EE62E00F9466F385E892EE60E06E +:10F040000F9466F389E992EE60E00F9466F385EA27 +:10F0500092EE60E00F9466F383EB92EE60E00F9423 +:10F0600066F38FEB92EE60E00F9466F38DEC92EE18 +:10F0700060E00F9466F38AED92EE60E00F9466F321 +:10F0800081EE92EE60E00F9466F382EF92EE60E024 +:10F090000F9466F38CE093EE60E00F9466F387E1E3 +:10F0A00093EE60E00F9466F380E393EEB9CD81EECA +:10F0B00092EE62E00F9466F381E40F9416F482E41A +:10F0C0000F9416F483E40F9416F484E40F9416F46A +:10F0D00085E40F9416F486E40F9416F487E40F94F5 +:10F0E00016F488E40F9416F48AE40F9416F48BE473 +:10F0F0000F9416F48CE40F9416F495CD82EF92EEF3 +:10F1000062E00F9466F399249394AA24BB2445C427 +:10F110008CE093EE62E00F9466F340910802509108 +:10F12000090260910A0270910B0282E020E10F94C3 +:10F130002CF48091080290910902A0910A02B091EA +:10F140000B0280509F4FAF4FBF4F809308029093A8 +:10F150000902A0930A02B0930B0265CD87E193EEFA +:10F1600062E00F9466F384EE90EE60E00F9466F335 +:10F1700089ED91EE60E00F9466F309E715EECC5D42 +:10F18000DE4F19830883C452D1406624772443019B +:10F19000CA5DDE4F19821882C652D140A401930184 +:10F1A0005695479537952795C85DDE4F2883398357 +:10F1B0004A835B83C852D140CA5DDE4F4881598182 +:10F1C000C652D1404F5F5F4FCA5DDE4F59834883BF +:10F1D000C652D140CA0162E070E00F94A5F350E23C +:10F1E0005093C6008091C00086FFFCCF8091C00084 +:10F1F00080648093C0006DE26093C6008091C0007F +:10F2000086FFFCCF8091C00080648093C00070E2D4 +:10F210007093C6008091C00086FFFCCF8091C00033 +:10F2200080648093C000C85DDE4FE880F9800A8169 +:10F230001B81C852D140BB27A12F902F8F2D0F9437 +:10F240007EF3C85DDE4F8881C852D1400F947EF3B3 +:10F2500070E2F72EF092C6008091C00086FFFCCFCE +:10F260008091C00080648093C0000DE30093C600CD +:10F270008091C00086FFFCCF8091C00080648093A5 +:10F28000C00010E21093C6008091C00086FFFCCF42 +:10F290008091C00080648093C0008BBEF3012791F1 +:10F2A000C45DDE4F2883CC52D140A22EBB24CC2497 +:10F2B000DD240894611C711C811C911C8BBEF30120 +:10F2C0008791282E332444245524142D032DF22C09 +:10F2D000EE24EA0CFB1C0C1D1D1D0894611C711C06 +:10F2E000811C911C8BBEF3013791C35DDE4F3883C7 +:10F2F000CD52D1400894611C711C811C911C8BBEA5 +:10F30000F3014791C25DDE4F4883CE52D1402DEFCD +:10F310003FEF4FEF5FEF620E731E841E951E0F943A +:10F320007EF330E23093C6008091C00086FFFCCFB0 +:10F330008091C00080648093C000C45DDE4F8881EE +:10F34000CC52D1400F947EF340E24093C6008091AE +:10F35000C00086FFFCCF8091C00080648093C00015 +:10F36000C25DDE4F8881CE52D1400F947EF350E2D1 +:10F370005093C6008091C00086FFFCCF8091C000F2 +:10F3800080648093C000C35DDE4F8881CD52D14040 +:10F390000F947EF360E26093C6008091C00086FF08 +:10F3A000FCCF8091C00080648093C0007FEFE7169F +:10F3B0007FEFF70670E0070770E0170731F48EE083 +:10F3C00092EE60E00F942FF3DFC0D801C701807088 +:10F3D000907CA070B0708050904CA040B040D1F5AF +:10F3E0002FEF3FE340E050E0E222F3220423152315 +:10F3F000C85DDE4FA880B980CA80DB80C852D1408A +:10F40000AE0CBF1CC01ED11EAA0CBB1CCC1CDD1C2C +:10F4100088E192EE60E00F942FF3BB27A12F902F8D +:10F420008F2D0F947EF38E2D0F947EF330E2309368 +:10F43000C6008091C00086FFFCCF8091C000806430 +:10F440008093C0004EE34093C6008091C00086FFC9 +:10F45000FCCF87C06EE07EEF80E090E0E622F722EE +:10F46000082319237CE0E71674E9F70670E0070724 +:10F4700070E0170709F088C0C25DDE4F8881CE5268 +:10F48000D140E82EFF2400E010E0102F0F2DFE2CBD +:10F49000EE24C35DDE4F9881CD52D140E90EF11CC0 +:10F4A000011D111DD601C50181709070A070B07052 +:10F4B000DC0199278827E80EF91E0A1F1B1F20EF81 +:10F4C00030E040E050E0A222B322C422D522F1E194 +:10F4D000AA0CBB1CCC1CDD1CFA95D1F7EA0CFB1C5A +:10F4E0000C1D1D1D41E050E060E070E0242235223B +:10F4F00046225722E5E1220C331C441C551CEA9598 +:10F50000D1F7E20CF31C041D151D57016801AA0C6C +:10F51000BB1CCC1CDD1C8FE192EE60E00F942FF33E +:10F52000C801AA27BB270F947EF3BB27A12F902FDA +:10F530008F2D0F947EF38E2D0F947EF350E2509317 +:10F54000C6008091C00086FFFCCF8091C00080641F +:10F550008093C0006EE36093C6008091C00086FF78 +:10F56000FCCF8091C00080648093C000C601AA27B0 +:10F57000BB270F947EF3BB27AD2D9C2D8B2D0F94B5 +:10F580007EF38A2D0F947EF370E27093C600809113 +:10F59000C00086FFFCCF8091C00080648093C000D3 +:10F5A000CC5DDE4FE881F981C452D140CF01AA275A +:10F5B00097FDA095BA2FABBFFC018791969160E0B3 +:10F5C0000F942FF30F944DF3CC5DDE4F088119811A +:10F5D000C452D1400E5F1F4FCC5DDE4F19830883AC +:10F5E000C452D140CA5DDE4F28813981C652D14014 +:10F5F0002933310509F417CB44E050E060E070E0B6 +:10F60000640E751E861E971EC9CD80E393EE62E0E0 +:10F610000F9466F384E292EE60E00F942FF38091F2 +:10F62000C00087FFFCCF1091C6001F751093C60065 +:10F630008091C00086FFFCCF8091C00080648093E1 +:10F64000C0000F944DF3812F81548A3108F036C1E8 +:10F65000163409F495C0173490F4133409F44EC0ED +:10F66000143430F41134F1F0123409F01DC130C0FB +:10F67000143409F459C0153409F016C16BC01A349A +:10F6800009F4C4C01B3438F4173409F48FC018349B +:10F6900009F00AC1A1C01B3409F4D2C01C3409F01E +:10F6A00003C1E8C08FEF81B90DC082B1809582B9E6 +:10F6B00080E090E0E0EDF7E03197F1F70196883CCB +:10F6C0009105C1F78091C00087FFEFCF12B8EFC05E +:10F6D0008FEF84B90DC085B1809585B980E090E049 +:10F6E000E0EDF7E03197F1F70196883C9105C1F71D +:10F6F0008091C00087FFEFCF15B8D9C08FEF87B9D1 +:10F700000DC088B1809588B980E090E0E0EDF7E029 +:10F710003197F1F70196883C9105C1F78091C000BF +:10F7200087FFEFCF18B8C3C08FEF8AB90DC08BB178 +:10F7300080958BB980E090E0E0EDF7E03197F1F74C +:10F740000196883C9105C1F78091C00087FFEFCFFB +:10F750001BB8ADC08FEF8DB90DC08EB180958EB93D +:10F7600080E090E0E0EDF7E03197F1F70196883C1A +:10F770009105C1F78091C00087FFEFCF1EB897C0F9 +:10F780008FEF80BB0DC081B3809581BB80E090E09E +:10F79000E0EDF7E03197F1F70196883C9105C1F76C +:10F7A0008091C00087FFEFCF11BA81C08FEF83BB7C +:10F7B0000DC084B3809584BB80E090E0E0EDF7E07D +:10F7C0003197F1F70196883C9105C1F78091C0000F +:10F7D00087FFEFCF14BA6BC08FEF809301010FC08A +:10F7E0008091020180958093020180E090E0E0ED3D +:10F7F000F7E03197F1F70196883C9105C1F78091C8 +:10F80000C00087FFEDCF1092020151C08FEF8093AF +:10F8100004010FC08091050180958093050180E06F +:10F8200090E0E0EDF7E03197F1F70196883C910523 +:10F83000C1F78091C00087FFEDCF1092050137C05E +:10F840008FEF809307010FC080910801809580930E +:10F85000080180E090E0E0EDF7E03197F1F70196E4 +:10F86000883C9105C1F78091C00087FFEDCF1092D1 +:10F8700008011DC08FEF80930A010FC080910B011A +:10F88000809580930B0180E090E0E0EDF7E0319708 +:10F89000F1F70196883C9105C1F78091C00087FF80 +:10F8A000EDCF10920B0103C08FE292EEB9C98091A7 +:10F8B000C00087FFFCCF8091C600B5C982E492EEFC +:10F8C000AFC98CE191EEACC9AA24BB24933061F19D +:10F8D000943028F4913089F0923008F508C09530C2 +:10F8E000B1F1953040F1963009F053C04EC02B3144 +:10F8F00009F020C991E06BE11DC9213041F0C15DE3 +:10F90000DE4F5881CF52D140251709F002C362273C +:10F91000C15DDE4F2883CF52D14092E00BC9B22F98 +:10F92000A0E0622793E006C9822F90E0A82BB92BB4 +:10F93000622794E0FFC82E3009F0EBC2622795E001 +:10F94000C05DDE4F19821882C053D140F3C8E1E098 +:10F95000F0E0EC0FFD1FC05DDE4FE880F980C05382 +:10F96000D140EE0DFF1D208387010F5F1F4FC05D4B +:10F97000DE4F19830883C053D14062270A171B0743 +:10F9800009F0D8C8D80196E0D5C8261709F0C1C239 +:10F9900003C0973009F0CEC899248981833109F4D6 +:10F9A000FCC08431C8F4863009F4C2C0873050F4FA +:10F9B000823009F4F0C0833009F458C0813009F076 +:10F9C0000AC23EC0813109F462C0823108F0A6C08B +:10F9D000803109F000C2DFC0883109F472C089317A +:10F9E00050F4853109F4D9C0853108F477C18631E6 +:10F9F00009F0F1C173C18A3109F457C08A3108F4A2 +:10FA00007CC08B3109F446C08D3109F0E4C18D8191 +:10FA1000803311F090E00AC08F81882311F49EE1B9 +:10FA200005C0813011F091E001C098E91A821B8273 +:10FA30008D818C831D829E831F8227E030E0CFC1A1 +:10FA40001A8288E08B8381E48C8386E58D8382E54E +:10FA50008E8389E48F8383E5888780E589878FE5B6 +:10FA60008A8782E38B872BE030E0B9C18A818139B4 +:10FA700041F0823941F0803911F48FE005C080E017 +:10FA800003C082E001C08AE01A828B8344C09924BB +:10FA9000939481C08D81882311F48EE12CC0813034 +:10FAA00011F081E028C088E926C01A82E1E0F0E088 +:10FAB00089E08093570084918B831C8224E030E09E +:10FAC0008EC18B81803589F48C81883039F4E2E0F5 +:10FAD000F0E089E08093570084910DC0E0E0F0E011 +:10FAE00089E080935700849106C0E3E0F0E089E06C +:10FAF0008093570084911A82DFCF8D81836C99E0C7 +:10FB0000E1E0F0E0082E90935700E89507B600FC7E +:10FB1000FDCF1A821B8223E030E061C11A82CE5CE5 +:10FB2000DE4F188219821A821B82C253D14055C1FE +:10FB30008A8190E0A0E0B0E0582F442733272227A5 +:10FB40008B8190E0A0E0B0E0DC0199278827282B8A +:10FB5000392B4A2B5B2B8D8190E0A0E0B0E0282B65 +:10FB6000392B4A2B5B2B8C8190E0A0E0B0E0BA2FC0 +:10FB7000A92F982F8827282B392B4A2B5B2B220F54 +:10FB8000331F441F551FC05EDE4F288339834A83CD +:10FB90005B83C052D1401A8220C19A812B8183316C +:10FBA00049F0C05EDE4F488159816A817B81C05235 +:10FBB000D1408AC0CE5CDE4F488159816A817B8109 +:10FBC000C253D140403080EC580783E0680780E0A2 +:10FBD0007807F0F483E0FA0160935B0080935700AC +:10FBE000E89507B600FCFDCFCE5CDE4F4881598119 +:10FBF0006A817B81C253D14040505F4F6F4F7F4F2E +:10FC0000CE5CDE4F488359836A837B83C253D140E5 +:10FC1000C95CDE4F9883C753D140CA5CDE4F18825F +:10FC2000C653D140022F10E0CA5CDE4F6881798153 +:10FC3000C653D140062B172BC05EDE4F4881598139 +:10FC40006A817B81C052D140DE011B9631E08C91EC +:10FC500011962C9111971296C75CDE4F2883C953D9 +:10FC6000D140C85CDE4F1882C853D14090E0C85CD8 +:10FC7000DE4FE881F981C853D1408E2B9F2B0C01B8 +:10FC8000FA0160935B0030935700E89511244E5FB2 +:10FC90005F4F6F4F7F4F02501040C9F685E0C05E46 +:10FCA000DE4FE880F9800A811B81C052D140F70104 +:10FCB00000935B0080935700E89507B600FCFDCFEA +:10FCC00081E180935700E8951A82C05EDE4F488339 +:10FCD00059836A837B83C052D1407FC0FA80C55C60 +:10FCE000DE4FF882CB53D140C65CDE4F1882CA5338 +:10FCF000D1408B81C82EDD24C65CDE4F088119817E +:10FD0000CA53D140C02AD12A1A828981BE016D5FAF +:10FD10007F4F843121F59601C05EDE4FE880F98087 +:10FD20000A811B81C052D1400BBFF7018791969188 +:10FD3000DB018C9311969C936E5F7F4FD801C701B6 +:10FD40000296A11DB11DC05EDE4F88839983AA83F0 +:10FD5000BB83C052D14022503040F1F636C0C05E65 +:10FD6000DE4F288139814A815B81C052D14008949D +:10FD7000C108D108760100E010E00894C11CD11C34 +:10FD80000894E11CF11C011D111DE20EF31E041F5D +:10FD9000151F21BDBB27A52F942F832F82BD2F5F59 +:10FDA0003F4F4F4F5F4FF89A80B5DB018D93BD01F8 +:10FDB0002E153F054007510761F7C05EDE4F2883CF +:10FDC00039834A835B83C052D14096012D5F3F4FF8 +:10FDD000FB01108204C080EC8A8322E030E08BE1DA +:10FDE0008093C6008091C00086FFFCCF8091C00048 +:10FDF00080648093C000C15DDE4FF881CF52D14056 +:10FE0000F093C6008091C00086FFFCCF8091C000B7 +:10FE100080648093C000432F3093C6008091C0005F +:10FE200086FFFCCF8091C00080648093C000922F39 +:10FE30002093C6008091C00086FFFCCF8091C00057 +:10FE400080648093C0008EE08093C6008091C000E3 +:10FE500086FFFCCF8091C00080648093C00065E184 +:10FE6000C15DDE4FE880CF52D1406E2569276427FF +:10FE7000FE01319610C090819093C6008091C00021 +:10FE800086FFFCCF31968091C00080648093C000D3 +:10FE90006927215030402115310569F76093C6006C +:10FEA0008091C00086FFFCCF8091C0008064809369 +:10FEB000C00085B1805885B9992081F4C15DDE4FBD +:10FEC0000881CF52D1400F5FC15DDE4F0883CF5212 +:10FED000D14090E0A0E0B0E00D949AF527982F98DB +:10FEE00080E090E020ED37E0F9013197F1F70196DD +:10FEF00084369105C9F700008091C0008D7F809302 +:10FF0000C00081E180935700E895EE27FF27099410 +:10FF1000FFCF90E00D949AF597FB092E07260AD0A3 +:10FF200077FD04D02ED006D000201AF4709561958C +:10FF30007F4F0895F6F7909581959F4F0895A1E220 +:10FF40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F53 +:10FF5000FF1FA217B307E407F50720F0A21BB30B9E +:10FF6000E40BF50B661F771F881F991F1A9469F71A +:10FF700060957095809590959B01AC01BD01CF0176 +:10FF80000895AA1BBB1B51E107C0AA1FBB1FA617E0 +:10FF9000B70710F0A61BB70B881F991F5A95A9F732 +:10FFA00080959095BC01CD010895F999FECF92BD41 +:10FFB00081BDF89A992780B50895262FF999FECF2B +:10FFC0001FBA92BD81BD20BD0FB6F894FA9AF99A76 +:0AFFD0000FBE01960895F894FFCFCC +:040000033000E000E9 +:00000001FF diff --git a/hardware/arduino/avr/bootloaders/stk500v2/stk500boot_v2_mega2560.hex b/hardware/arduino/avr/bootloaders/stk500v2/stk500boot_v2_mega2560.hex index 68d2e18b3b0..c52e690a102 100644 --- a/hardware/arduino/avr/bootloaders/stk500v2/stk500boot_v2_mega2560.hex +++ b/hardware/arduino/avr/bootloaders/stk500v2/stk500boot_v2_mega2560.hex @@ -1,469 +1,469 @@ -:020000023000CC -:10E000000D9489F10D94B2F10D94B2F10D94B2F129 -:10E010000D94B2F10D94B2F10D94B2F10D94B2F1F0 -:10E020000D94B2F10D94B2F10D94B2F10D94B2F1E0 -:10E030000D94B2F10D94B2F10D94B2F10D94B2F1D0 -:10E040000D94B2F10D94B2F10D94B2F10D94B2F1C0 -:10E050000D94B2F10D94B2F10D94B2F10D94B2F1B0 -:10E060000D94B2F10D94B2F10D94B2F10D94B2F1A0 -:10E070000D94B2F10D94B2F10D94B2F10D94B2F190 -:10E080000D94B2F10D94B2F10D94B2F10D94B2F180 -:10E090000D94B2F10D94B2F10D94B2F10D94B2F170 -:10E0A0000D94B2F10D94B2F10D94B2F10D94B2F160 -:10E0B0000D94B2F10D94B2F10D94B2F10D94B2F150 -:10E0C0000D94B2F10D94B2F10D94B2F10D94B2F140 -:10E0D0000D94B2F10D94B2F10D94B2F10D94B2F130 -:10E0E0000D94B2F141546D656761323536300041AF -:10E0F000726475696E6F206578706C6F72657220DE -:10E1000073746B3530305632206279204D4C530099 -:10E11000426F6F746C6F616465723E004875683F52 -:10E1200000436F6D70696C6564206F6E203D200048 -:10E130004350552054797065202020203D20005FF9 -:10E140005F4156525F415243485F5F3D2000415658 -:10E1500052204C696243205665723D20004743437C -:10E160002056657273696F6E203D20004350552024 -:10E1700049442020202020203D20004C6F7720663D -:10E18000757365202020203D20004869676820665F -:10E190007573652020203D200045787420667573D6 -:10E1A00065202020203D20004C6F636B2066757336 -:10E1B000652020203D20004D617220203720323024 -:10E1C000313300312E362E3800342E332E350056A2 -:10E1D00023202020414444522020206F7020636F70 -:10E1E00064652020202020696E73747275637469E1 -:10E1F0006F6E2061646472202020496E74657272B3 -:10E20000757074006E6F20766563746F7200726A49 -:10E210006D702020006A6D70200057686174207056 -:10E220006F72743A00506F7274206E6F7420737541 -:10E2300070706F72746564004D7573742062652030 -:10E2400061206C6574746572002000577269747483 -:10E25000696E672045450052656164696E672045B7 -:10E26000450045452065727220636E743D00504F35 -:10E27000525400303D5A65726F2061646472003FF1 -:10E280003D43505520737461747300403D454550C3 -:10E29000524F4D207465737400423D426C696E6B41 -:10E2A000204C454400453D44756D70204545505215 -:10E2B0004F4D00463D44756D7020464C415348001B -:10E2C000483D48656C70004C3D4C69737420492F83 -:10E2D0004F20506F72747300513D51756974005234 -:10E2E0003D44756D702052414D00563D73686F7707 -:10E2F00020696E7465727275707420566563746FF0 -:10E30000727300593D506F727420626C696E6B00BD -:10E310002A0011241FBECFEFD1E2DEBFCDBF01E046 -:10E320000CBF12E0A0E0B2E0EEE1FDEF03E00BBFB6 -:10E3300002C007900D92A030B107D9F712E0A0E01B -:10E34000B2E001C01D92AE30B107E1F70F9460F367 -:10E350000D948DFE01E20EBF0FEF0DBF11241FBE05 -:10E360000D9460F30D9400F020E030E040ED57E0B4 -:10E3700005C0FA013197F1F72F5F3F4F2817390792 -:10E38000C0F308959C01260F311DC901A0E0B0E043 -:10E390002F5F3F4FABBFFC018791882361F08093D3 -:10E3A000C6008091C00086FFFCCF8091C0008064D1 -:10E3B0008093C000EACF08958DE08093C6008091DD -:10E3C000C00086FFFCCF8091C00080648093C000B5 -:10E3D0008AE08093C6008091C00086FFFCCF8091C8 -:10E3E000C00080648093C00008950F94C2F10F9420 -:10E3F000DCF10895FC019081992359F09093C600B7 -:10E400008091C00086FFFCCF8091C0008064809323 -:10E41000C0003196992379F70895282F982F929567 -:10E420009F70892F805D8A3308F0895F8093C600D2 -:10E430008091C00086FFFCCF8091C00080648093F3 -:10E44000C000822F8F70982F905D9A3308F0995FEB -:10E450009093C6008091C00086FFFCCF8091C000E1 -:10E4600080648093C00008959C01FB01853691056E -:10E470001CF46330710594F0C90164E670E00F94F8 -:10E480002EFE605D7F4F6093C6008091C00086FFC6 -:10E49000FCCF8091C00080648093C0002B30310598 -:10E4A00014F43297B4F0C90164E670E00F942EFEC4 -:10E4B0006AE070E00F942EFE605D7F4F6093C600AF -:10E4C0008091C00086FFFCCF8091C0008064809363 -:10E4D000C000C9016AE070E00F942EFEC0968093E0 -:10E4E000C6008091C00086FFFCCF8091C000806490 -:10E4F0008093C00008951F93182F8EE692EE60E07F -:10E500000F94C2F11093C6008091C00086FFFCCF2B -:10E510008091C00080648093C0000F94DCF11F9153 -:10E5200008952F923F924F925F926F927F928F92B7 -:10E530009F92AF92BF92CF92DF92EF92FF920F9392 -:10E540001F93DF93CF93CDB7DEB762970FB6F894E2 -:10E55000DEBF0FBECDBF382E622ECA01DB015C01CB -:10E560006D01772420E2222E2E010894411C511CBB -:10E570008BC081E0A81680E0B80681E0C80680E084 -:10E58000D80628F0C601AA27BB270F940DF2BB2797 -:10E59000AD2D9C2D8B2D0F940DF28A2D0F940DF225 -:10E5A0002092C6008091C00086FFFCCF8091C00001 -:10E5B00080648093C0009DE29093C6008091C0006B -:10E5C00086FFFCCF8091C00080648093C0002092C1 -:10E5D000C6008091C00086FFFCCF8091C00080649F -:10E5E0008093C00019828601750188249924A1E0D6 -:10E5F0003A1651F03A1620F0B2E03B1661F409C029 -:10E600000BBFF701779007C0C7010F9477FE782EF4 -:10E6100002C0F7017080872D0F940DF22092C60082 -:10E620008091C00086FFFCCF8091C0008064809301 -:10E63000C000872D8052F401EF70F0708F3520F408 -:10E64000E40DF51D708204C0E40DF51D8EE280839B -:10E650000894E11CF11C011D111D0894811C911CE2 -:10E6600090E18916910409F0C2CF80E190E0A0E02A -:10E67000B0E0A80EB91ECA1EDB1E198AC2010F9493 -:10E68000FAF10F94DCF16A94662009F072CF629679 -:10E690000FB6F894DEBF0FBECDBFCF91DF911F91B3 -:10E6A0000F91FF90EF90DF90CF90BF90AF909F9031 -:10E6B0008F907F906F905F904F903F902F90089534 -:10E6C0002F923F924F925F926F927F928F929F9282 -:10E6D000AF92BF92CF92DF92EF92FF920F931F9370 -:10E6E000DF93CF93CDB7DEB7CD53D1400FB6F894BB -:10E6F000DEBF0FBECDBF01E20EBF0FEF0DBF94B75F -:10E70000F894A89514BE80916000886180936000A1 -:10E7100010926000789493FF05C0E0910002F091A0 -:10E7200001021995279A2F9A8091C00082608093E8 -:10E73000C00080E18093C40088E18093C1000000A4 -:10E74000EE24FF24870144E0A42EB12CCC24DD2448 -:10E7500024C0C5010197F1F70894E11CF11C011DCB -:10E76000111D21E2E2162EE4F20620E0020720E06D -:10E77000120718F031E0C32ED12CC801B70127ECE5 -:10E780003BE140E050E00F9441FE611571058105C9 -:10E79000910519F485B1805885B98091C00087FD35 -:10E7A00003C0C114D104A9F2A6014F5F5F4FC25E3E -:10E7B000DE4F59834883CE51D140C25EDE4F8881FF -:10E7C0009981CE51D140019711F00D9410FEC05D9A -:10E7D000DE4F19821882C053D14060E0C15DDE4F28 -:10E7E0001882CF52D14088249924C35DDE4F19820C -:10E7F0001882CD52D140C05EDE4F188219821A8233 -:10E800001B82C052D140CE5CDE4F188219821A8220 -:10E810001B82C253D140EE24FF2487010BBFF701B6 -:10E8200007911691C45CDE4F19830883CC53D14005 -:10E830000D940BFEC25EDE4F28813981CE51D1404E -:10E840002130310509F52091C600C25EDE4F1982E4 -:10E850001882CE51D14022C02F5F3F4F4F4F5F4FA4 -:10E86000213082E138078AE7480780E0580780F0C6 -:10E87000C45CDE4FE881F981CC53D140EF5FFF4F9C -:10E8800019F0EE27FF27099420E030E040E050E047 -:10E890008091C00087FFE0CF2091C600C35DDE4FAE -:10E8A00048815981CD52D1404F5F5F4FC35DDE4FEC -:10E8B00059834883CD52D140213209F063C64A3092 -:10E8C000510508F05FC60894811C911C53E0851621 -:10E8D000910409F059C600E010E018C081E280936D -:10E8E000C6008091C00086FFFCCF8091C00080648C -:10E8F0008093C0002F5F3F4F2931310579F70F9486 -:10E90000DCF10F5F1F4F0530110519F020E030E0FA -:10E91000E5CF10920A0210920B0210920C02109294 -:10E920000D02109206021092070210920802109235 -:10E930000902109202021092030210920402109235 -:10E9400005028FEE90EE60E00F94F5F180E191EE1C -:10E9500060E00F94C2F18091C00087FFFCCF9091DE -:10E96000C600903608F09F759032B8F09093C600BC -:10E970008091C00086FFFCCF8091C00080648093AE -:10E98000C000A0E2A093C6008091C00086FFFCCF2B -:10E990008091C00080648093C000983409F4D7C18E -:10E9A0009934B8F4923409F459C1933458F490333B -:10E9B00019F1903308F4E3C59F33A1F1903409F0C5 -:10E9C000DEC5BDC0953409F470C1963409F0D7C5D1 -:10E9D00098C1923509F42BC2933538F49C3409F46C -:10E9E000F5C1913509F0CBC518C2963509F445C279 -:10E9F000993509F0C4C567C483E792EE62E00F94CD -:10EA0000F5F110920602109207021092080210927D -:10EA1000090210920A0210920B0210920C0210923C -:10EA20000D0213C18FE792EE62E00F94F5F18FEEC5 -:10EA300090EE60E00F94F5F181E291EE60E00F94CA -:10EA4000C2F187EB91EE60E00F94F5F180E391EE77 -:10EA500060E00F94C2F184EE90EE60E00F94F5F167 -:10EA60008FE391EE60E00F94C2F186E090E061E008 -:10EA700070E00F9434F20F94DCF18DE591EE60E0DC -:10EA80000F94C2F189EC91EE60E00F94F5F18EE401 -:10EA900091EE60E00F94C2F183EC91EE60E00F9490 -:10EAA000F5F18CE691EE60E00F94C2F18EE10F94E7 -:10EAB0000DF288E90F940DF281E00F940DF20F949E -:10EAC000DCF18BE791EE60E00F94C2F119E0E0E039 -:10EAD000F0E010935700E4918E2F0F940DF20F94F5 -:10EAE000DCF18AE891EE60E00F94C2F1E3E0F0E03F -:10EAF00010935700E4918E2F0F940DF20F94DCF1D8 -:10EB000089E991EE60E00F94C2F1E2E0F0E0109349 -:10EB10005700E4918E2F0F940DF20F94DCF188EAE8 -:10EB200091EE60E00F94C2F1E1E0F0E01093570045 -:10EB30001491812F0F940DF20F94DCF107CF8BE825 -:10EB400092EE62E00F94F5F18BE492EE60E00F94A8 -:10EB5000F5F10F94DCF100E010E019C0C8016F2D51 -:10EB60000F947FFEFF2031F489E492EE60E00F9471 -:10EB7000C2F10BC0F092C6008091C00086FFFCCFAE -:10EB80008091C00080648093C0000F5F1F4FC80158 -:10EB900081519F41A0E0B0E0ABBFFC01F790BAE229 -:10EBA000FB1621F0E2E000301E07C1F60F94DCF105 -:10EBB0000F94DCF187E592EE60E00F94F5F10F948D -:10EBC000DCF1CC24DD2400E010E01EC0C8010F946D -:10EBD00077FEF82E882331F489E492EE60E00F94FA -:10EBE000C2F10BC08093C6008091C00086FFFCCFAD -:10EBF0008091C00080648093C000FE1419F00894D6 -:10EC0000C11CD11C0F5F1F4FC80181519F41A0E063 -:10EC1000B0E0ABBFFC01E790FAE2EF1621F022E092 -:10EC20000030120799F60F94DCF10F94DCF182E6C4 -:10EC300092EE60E00F94C2F1C60161E070E00F94C3 -:10EC400034F20F94DCF10F94DCF110920202109276 -:10EC50000302109204021092050278CE89E992EE26 -:10EC600062E00F94F5F1279A2F9A16C02F9880E052 -:10EC700090E0E0EDF7E03197F1F7019684369105E9 -:10EC8000C1F72F9A80E090E0E0EDF7E03197F1F7DF -:10EC9000019684369105C1F78091C00087FFE6CFC9 -:10ECA0008091C00087FFFCCF64C485EA92EE62E0E9 -:10ECB0000F94F5F140910202509103026091040219 -:10ECC0007091050281E020E10F9491F2809102029F -:10ECD00090910302A0910402B091050280509F4FD1 -:10ECE000AF4FBF4F8093020290930302A0930402A0 -:10ECF000B093050280509041A040B04008F426CE69 -:10ED0000A4CF83EB92EE62E00F94F5F140910602FE -:10ED100050910702609108027091090280E020E1A1 -:10ED20000F9491F28091060290910702A09108023F -:10ED3000B091090280509F4FAF4FBF4F80930602A2 -:10ED400090930702A0930802B0930902FFCD80ECD4 -:10ED500092EE62E00F94F5F183E792EE60E00F949B -:10ED6000F5F18FE792EE60E00F94F5F18BE892EE0B -:10ED700060E00F94F5F189E992EE60E00F94F5F10F -:10ED800085EA92EE60E00F94F5F183EB92EE60E09D -:10ED90000F94F5F180EC92EE60E00F94F5F187ECC2 -:10EDA00092EE60E00F94F5F188ED92EE60E00F9442 -:10EDB000F5F18FED92EE60E00F94F5F18AEE92EEB0 -:10EDC00060E00F94F5F183E093EEBDCD87EC92EE19 -:10EDD00062E00F94F5F181E40F947BF282E40F94EA -:10EDE0007BF283E40F947BF284E40F947BF285E45E -:10EDF0000F947BF286E40F947BF287E40F947BF20E -:10EE000088E40F947BF28AE40F947BF28BE40F94F6 -:10EE10007BF28CE40F947BF299CD88ED92EE62E068 -:10EE20000F94F5F1772473948824992409C48FED05 -:10EE300092EE62E00F94F5F140910A0250910B02BC -:10EE400060910C0270910D0282E020E10F9491F22A -:10EE500080910A0290910B02A0910C02B0910D02D8 -:10EE600080509F4FAF4FBF4F80930A0290930B0289 -:10EE7000A0930C02B0930D0269CD8AEE92EE62E08F -:10EE80000F94F5F184EE90EE60E00F94F5F18FECC5 -:10EE900091EE60E00F94F5F1662477244301CC5D98 -:10EEA000DE4F19821882C452D140D401C301B695F5 -:10EEB000A79597958795CA5DDE4F88839983AA8326 -:10EEC000BB83C652D140CC5DDE4FA881B981C4520C -:10EED000D1401196CC5DDE4FB983A883C452D14096 -:10EEE000CD0162E070E00F9434F2B0E2B093C6005E -:10EEF0008091C00086FFFCCF8091C0008064809329 -:10EF0000C000EDE2E093C6008091C00086FFFCCF18 -:10EF10008091C00080648093C000F0E2F093C6004E -:10EF20008091C00086FFFCCF8091C00080648093F8 -:10EF3000C000CA5DDE4FE880F9800A811B81C6529D -:10EF4000D140BB27A12F902F8F2D0F940DF2CA5DBA -:10EF5000DE4F8881C652D1400F940DF2B0E2FB2EF5 -:10EF6000F092C6008091C00086FFFCCF8091C00067 -:10EF700080648093C0000DE30093C6008091C000C0 -:10EF800086FFFCCF8091C00080648093C00010E2B7 -:10EF90001093C6008091C00086FFFCCF8091C00016 -:10EFA00080648093C0008BBEF3012791C65DDE4F65 -:10EFB0002883CA52D140A22EBB24CC24DD2408943D -:10EFC000611C711C811C911C8BBEF3018791282E42 -:10EFD0003324442455240894611C711C811C911C09 -:10EFE0008BBEF3013791C55DDE4F3883CB52D140E4 -:10EFF0000894611C711C811C911C8BBEF30147910C -:10F00000C45DDE4F4883CC52D140ADEFEA2EAFEF66 -:10F01000FA2EAFEF0A2FAFEF1A2F6E0C7F1C801E57 -:10F02000911E142D032DF22CEE24EA0CFB1C0C1D5A -:10F030001D1D0F940DF220E22093C6008091C000A8 -:10F0400086FFFCCF8091C00080648093C000C65DC5 -:10F05000DE4F8881CA52D1400F940DF230E23093D6 -:10F06000C6008091C00086FFFCCF8091C000806404 -:10F070008093C000C45DDE4F8881CC52D1400F9494 -:10F080000DF240E24093C6008091C00086FFFCCFA5 -:10F090008091C00080648093C000C55DDE4F888190 -:10F0A000CB52D1400F940DF250E25093C6008091A4 -:10F0B000C00086FFFCCF8091C00080648093C000B8 -:10F0C0008FEFE8168FEFF80680E0080780E018075A -:10F0D00031F484E092EE60E00F94C2F1DFC0D80119 -:10F0E000C7018070907CA070B0708050904CA040A0 -:10F0F000B040D1F52FEF3FE340E050E0E222F322B1 -:10F1000004231523CA5DDE4FA880B980CA80DB8046 -:10F11000C652D140AE0CBF1CC01ED11EAA0CBB1CD7 -:10F12000CC1CDD1C8EE092EE60E00F94C2F1BB2798 -:10F13000A12F902F8F2D0F940DF28E2D0F940DF285 -:10F1400030E23093C6008091C00086FFFCCF8091F2 -:10F15000C00080648093C0004EE34093C60080915D -:10F16000C00086FFFCCF87C08EE09EEFA0E0B0E03D -:10F17000E822F9220A231B239CE0E91694E9F90608 -:10F1800090E0090790E0190709F088C0C45DDE4FE0 -:10F19000A881CC52D140EA2EFF2400E010E0102FCD -:10F1A0000F2DFE2CEE24C55DDE4FB881CB52D14031 -:10F1B000EB0EF11C011D111DD601C501817090706F -:10F1C000A070B070DC0199278827E80EF91E0A1F8D -:10F1D0001B1F20EF30E040E050E0A222B322C42207 -:10F1E000D52241E1AA0CBB1CCC1CDD1C4A95D1F7F1 -:10F1F000EA0CFB1C0C1D1D1D81E090E0A0E0B0E0BE -:10F20000282239224A225B2235E1220C331C441C7D -:10F21000551C3A95D1F7E20CF31C041D151D57013E -:10F220006801AA0CBB1CCC1CDD1C85E192EE60E0E1 -:10F230000F94C2F1C801AA27BB270F940DF2BB2778 -:10F24000A12F902F8F2D0F940DF28E2D0F940DF274 -:10F2500090E29093C6008091C00086FFFCCF809121 -:10F26000C00080648093C000AEE3A093C60080918C -:10F27000C00086FFFCCF8091C00080648093C000F6 -:10F28000C601AA27BB270F940DF2BB27AD2D9C2DDD -:10F290008B2D0F940DF28A2D0F940DF20F94DCF14B -:10F2A000CC5DDE4FE881F981C452D140F99709F471 -:10F2B0004DCBF4E0EF2EF12C012D112D6E0C7F1CA7 -:10F2C000801E911EF2CD83E093EE62E00F94F5F183 -:10F2D0008AE192EE60E00F94C2F18091C00087FF56 -:10F2E000FCCF1091C6001F751093C6008091C0001E -:10F2F00086FFFCCF8091C00080648093C0000F9493 -:10F30000DCF1812F81548A3108F036C1163409F4BA -:10F3100095C0173490F4133409F44EC0143430F40B -:10F320001134F1F0123409F01DC130C0143409F465 -:10F3300059C0153409F016C16BC01A3409F4C4C0A1 -:10F340001B3438F4173409F48FC0183409F00AC19B -:10F35000A1C01B3409F4D2C01C3409F003C1E8C0B9 -:10F360008FEF81B90DC082B1809582B980E090E0C5 -:10F37000E0EDF7E03197F1F70196883C9105C1F790 -:10F380008091C00087FFEFCF12B8EFC08FEF84B934 -:10F390000DC085B1809585B980E090E0E0EDF7E0A3 -:10F3A0003197F1F70196883C9105C1F78091C00033 -:10F3B00087FFEFCF15B8D9C08FEF87B90DC088B1DF -:10F3C000809588B980E090E0E0EDF7E03197F1F7C3 -:10F3D0000196883C9105C1F78091C00087FFEFCF6F -:10F3E00018B8C3C08FEF8AB90DC08BB180958BB9A7 -:10F3F00080E090E0E0EDF7E03197F1F70196883C8E -:10F400009105C1F78091C00087FFEFCF1BB8ADC059 -:10F410008FEF8DB90DC08EB180958EB980E090E0F0 -:10F42000E0EDF7E03197F1F70196883C9105C1F7DF -:10F430008091C00087FFEFCF1EB897C08FEF80BBD1 -:10F440000DC081B3809581BB80E090E0E0EDF7E0F6 -:10F450003197F1F70196883C9105C1F78091C00082 -:10F4600087FFEFCF11BA81C08FEF83BB0DC084B38C -:10F47000809584BB80E090E0E0EDF7E03197F1F714 -:10F480000196883C9105C1F78091C00087FFEFCFBE -:10F4900014BA6BC08FEF809301010FC080910201FD -:10F4A00080958093020180E090E0E0EDF7E03197F5 -:10F4B000F1F70196883C9105C1F78091C00087FF64 -:10F4C000EDCF1092020151C08FEF809304010FC065 -:10F4D0008091050180958093050180E090E0E0ED4A -:10F4E000F7E03197F1F70196883C9105C1F78091DB -:10F4F000C00087FFEDCF1092050137C08FEF8093DA -:10F5000007010FC08091080180958093080180E079 -:10F5100090E0E0EDF7E03197F1F70196883C910536 -:10F52000C1F78091C00087FFEDCF109208011DC088 -:10F530008FEF80930A010FC080910B01809580931B -:10F540000B0180E090E0E0EDF7E03197F1F70196F4 -:10F55000883C9105C1F78091C00087FFEDCF1092E4 -:10F560000B0103C085E292EEEEC98091C00087FFD7 -:10F57000FCCF8091C600EAC988E392EEE4C98CE131 -:10F5800091EEE1C988249924933011F1943028F444 -:10F59000913089F09230B8F408C0953061F195301F -:10F5A000F0F0963009F048C043C02B3109F042C951 -:10F5B00091E06BE13FC96227C15DDE4F2883CF52E6 -:10F5C000D14092E037C9B22FA0E0622793E032C960 -:10F5D000822F90E0A82BB92B622794E02BC92E3004 -:10F5E00009F039C3622795E0C05DDE4F19821882A9 -:10F5F000C053D1401FC9E1E0F0E0EC0FFD1FC05D3A -:10F60000DE4F08811981C053D140E00FF11F2083E4 -:10F610000F5F1F4FC05DDE4F19830883C053D14079 -:10F6200062270A171B0709F005C9D80196E002C92D -:10F63000261709F010C303C0973009F0FBC87724E0 -:10F640009981933109F412C19431C8F4963009F4C8 -:10F65000D8C0973050F4923009F406C1933009F4C1 -:10F660006DC0913009F059C253C0913109F477C08F -:10F67000923108F0BBC0903109F04FC2F5C098310B -:10F6800009F487C0993150F4953109F4EFC09531F0 -:10F6900008F4C6C1963109F040C2C2C19A3109F4DA -:10F6A0006CC09A3108F491C09B3109F45BC09D3164 -:10F6B00009F033C29D81903359F48F81882311F46E -:10F6C0009EE11CC0813011F091E018C098E916C08D -:10F6D000892F807591F0903539F4E0E0F0E089E011 -:10F6E0008093570094910AC0983539F4E3E0F0E034 -:10F6F00089E080935700949101C090E01A821B82A8 -:10F700008D818C831D829E831F8227E030E009C299 -:10F710001A8288E08B8381E48C8386E58D8382E581 -:10F720008E8389E48F8383E5888780E589878FE5E9 -:10F730008A8782E38B872BE030E0F3C18A818139AD -:10F7400041F0823941F0803911F48FE005C080E04A -:10F7500003C082E001C08AE01A828B8344C0772410 -:10F76000739482C08D81882311F48EE12CC0813086 -:10F7700011F081E028C088E926C01A82E1E0F0E0BB -:10F7800089E08093570084918B831C8224E030E0D1 -:10F79000C8C18B81803589F48C81883039F4E2E0EE -:10F7A000F0E089E08093570084910DC0E0E0F0E044 -:10F7B00089E080935700849106C0E3E0F0E089E09F -:10F7C0008093570084911A82DFCF8D81836C99E0FA -:10F7D000E1E0F0E0082E90935700E89507B600FCB2 -:10F7E000FDCF1A821B8223E030E09BC180EC8A832C -:10F7F000CE5CDE4F188219821A821B82C253D1401E -:10F800008EC18A8190E0A0E0B0E0582F44273327D2 -:10F8100022278B8190E0A0E0B0E0DC0199278827C7 -:10F82000282B392B4A2B5B2B8D8190E0A0E0B0E098 -:10F83000282B392B4A2B5B2B8C8190E0A0E0B0E089 -:10F84000BA2FA92F982F8827282B392B4A2B5B2BCF -:10F85000220F331F441F551FC05EDE4F288339839C -:10F860004A835B83C052D1401A8259C13A81C95C34 -:10F87000DE4F3883C753D140CA5CDE4F1882C6536F -:10F88000D1408B81C82EDD24CA5CDE4F488159816E -:10F89000C653D140C42AD52A933109F082C0CE5C28 -:10F8A000DE4F88819981AA81BB81C253D1408050AB -:10F8B000904CA340B04030F583E0CE5CDE4FE88052 -:10F8C000F9800A811B81C253D140F70100935B008C -:10F8D00080935700E89507B600FCFDCFCE5CDE4F65 -:10F8E000088119812A813B81C253D14000501F4FAA -:10F8F0002F4F3F4FCE5CDE4F088319832A833B8313 -:10F90000C253D140C05EDE4F488159816A817B81FC -:10F91000C052D140DE011B9631E08C9111962C91A2 -:10F9200011971296C75CDE4F2883C953D140C85C3B -:10F93000DE4F1882C853D14090E0C85CDE4FE881AA -:10F94000F981C853D1408E2B9F2B0C01FA01609393 -:10F950005B0030935700E89511244E5F5F4F6F4F67 -:10F960007F4F0EEFE02E0FEFF02ECE0CDF1CC114F8 -:10F97000D10499F685E0C05EDE4F088119812A81A5 -:10F980003B81C052D140F80120935B008093570027 -:10F99000E89507B600FCFDCF81E180935700E8951C -:10F9A00035C0C05EDE4F88819981AA81BB81C0527B -:10F9B000D140B695A795979587957C018601ABE0D8 -:10F9C000AA2EB12CAC0EBD1E0BC0D5016D915D01F0 -:10F9D000C7010F947FFE0894E11CF11C01501040F8 -:10F9E0000115110591F7A60160E070E0440F551F65 -:10F9F000661F771FC05EDE4FE880F9800A811B8199 -:10FA0000C052D1404E0D5F1D601F711F1A82C05E33 -:10FA1000DE4F488359836A837B83C052D1407FC0C5 -:10FA2000FA80C55CDE4FF882CB53D140C65CDE4F16 -:10FA30001882CA53D1408B81C82EDD24C65CDE4FAC -:10FA400008811981CA53D140C02AD12A1A828981DA -:10FA5000BE016D5F7F4F843121F59601C05EDE4FA0 -:10FA6000E880F9800A811B81C052D1400BBFF701A9 -:10FA700087919691DB018C9311969C936E5F7F4FDB -:10FA8000D801C7010296A11DB11DC05EDE4F88835B -:10FA90009983AA83BB83C052D14022503040F1F6F3 -:10FAA00036C0C05EDE4F288139814A815B81C052F9 -:10FAB000D1400894C108D108760100E010E0089414 -:10FAC000C11CD11C0894E11CF11C011D111DE20E8A -:10FAD000F31E041F151F21BDBB27A52F942F832FB5 -:10FAE00082BD2F5F3F4F4F4F5F4FF89A80B5DB01CC -:10FAF0008D93BD012E153F054007510761F7C05E8C -:10FB0000DE4F288339834A835B83C052D1409601FC -:10FB10002D5F3F4FFB01108204C080EC8A8322E0FE -:10FB200030E08BE18093C6008091C00086FFFCCF5F -:10FB30008091C00080648093C000C15DDE4FF88179 -:10FB4000CF52D140F093C6008091C00086FFFCCF19 -:10FB50008091C00080648093C000432F3093C60022 -:10FB60008091C00086FFFCCF8091C00080648093AC -:10FB7000C000922F2093C6008091C00086FFFCCF6A -:10FB80008091C00080648093C0008EE08093C600A6 -:10FB90008091C00086FFFCCF8091C000806480937C -:10FBA000C00065E1C15DDE4FE880CF52D1406E25D7 -:10FBB00069276427FE01319610C090819093C6009A -:10FBC0008091C00086FFFCCF31968091C000806498 -:10FBD0008093C0006927215030402115310569F715 -:10FBE0006093C6008091C00086FFFCCF8091C0006A -:10FBF00080648093C00085B1805885B9772081F4F6 -:10FC0000C15DDE4F0881CF52D1400F5FC15DDE4F35 -:10FC10000883CF52D14090E0A0E0B0E00D941AF4F8 -:10FC200027982F9880E090E020ED37E0F901319798 -:10FC3000F1F7019684369105C9F700008091C00064 -:10FC40008D7F8093C00081E180935700E895EE2777 -:10FC5000FF270994FFCF90E00D941AF497FB092E2B -:10FC600007260AD077FD04D02ED006D000201AF443 -:10FC7000709561957F4F0895F6F7909581959F4F08 -:10FC80000895A1E21A2EAA1BBB1BFD010DC0AA1FDD -:10FC9000BB1FEE1FFF1FA217B307E407F50720F0F5 -:10FCA000A21BB30BE40BF50B661F771F881F991F70 -:10FCB0001A9469F760957095809590959B01AC01B9 -:10FCC000BD01CF010895AA1BBB1B51E107C0AA1FAC -:10FCD000BB1FA617B70710F0A61BB70B881F991FED -:10FCE0005A95A9F780959095BC01CD010895F99991 -:10FCF000FECF92BD81BDF89A992780B50895262F31 -:10FD0000F999FECF1FBA92BD81BD20BD0FB6F89400 -:0EFD1000FA9AF99A0FBE01960895F894FFCF63 -:040000033000E000E9 -:00000001FF +:020000023000CC +:10E000000D9489F10D94B2F10D94B2F10D94B2F129 +:10E010000D94B2F10D94B2F10D94B2F10D94B2F1F0 +:10E020000D94B2F10D94B2F10D94B2F10D94B2F1E0 +:10E030000D94B2F10D94B2F10D94B2F10D94B2F1D0 +:10E040000D94B2F10D94B2F10D94B2F10D94B2F1C0 +:10E050000D94B2F10D94B2F10D94B2F10D94B2F1B0 +:10E060000D94B2F10D94B2F10D94B2F10D94B2F1A0 +:10E070000D94B2F10D94B2F10D94B2F10D94B2F190 +:10E080000D94B2F10D94B2F10D94B2F10D94B2F180 +:10E090000D94B2F10D94B2F10D94B2F10D94B2F170 +:10E0A0000D94B2F10D94B2F10D94B2F10D94B2F160 +:10E0B0000D94B2F10D94B2F10D94B2F10D94B2F150 +:10E0C0000D94B2F10D94B2F10D94B2F10D94B2F140 +:10E0D0000D94B2F10D94B2F10D94B2F10D94B2F130 +:10E0E0000D94B2F141546D656761323536300041AF +:10E0F000726475696E6F206578706C6F72657220DE +:10E1000073746B3530305632206279204D4C530099 +:10E11000426F6F746C6F616465723E004875683F52 +:10E1200000436F6D70696C6564206F6E203D200048 +:10E130004350552054797065202020203D20005FF9 +:10E140005F4156525F415243485F5F3D2000415658 +:10E1500052204C696243205665723D20004743437C +:10E160002056657273696F6E203D20004350552024 +:10E1700049442020202020203D20004C6F7720663D +:10E18000757365202020203D20004869676820665F +:10E190007573652020203D200045787420667573D6 +:10E1A00065202020203D20004C6F636B2066757336 +:10E1B000652020203D20004D617220203720323024 +:10E1C000313300312E362E3800342E332E350056A2 +:10E1D00023202020414444522020206F7020636F70 +:10E1E00064652020202020696E73747275637469E1 +:10E1F0006F6E2061646472202020496E74657272B3 +:10E20000757074006E6F20766563746F7200726A49 +:10E210006D702020006A6D70200057686174207056 +:10E220006F72743A00506F7274206E6F7420737541 +:10E2300070706F72746564004D7573742062652030 +:10E2400061206C6574746572002000577269747483 +:10E25000696E672045450052656164696E672045B7 +:10E26000450045452065727220636E743D00504F35 +:10E27000525400303D5A65726F2061646472003FF1 +:10E280003D43505520737461747300403D454550C3 +:10E29000524F4D207465737400423D426C696E6B41 +:10E2A000204C454400453D44756D70204545505215 +:10E2B0004F4D00463D44756D7020464C415348001B +:10E2C000483D48656C70004C3D4C69737420492F83 +:10E2D0004F20506F72747300513D51756974005234 +:10E2E0003D44756D702052414D00563D73686F7707 +:10E2F00020696E7465727275707420566563746FF0 +:10E30000727300593D506F727420626C696E6B00BD +:10E310002A0011241FBECFEFD1E2DEBFCDBF01E046 +:10E320000CBF12E0A0E0B2E0EEE1FDEF03E00BBFB6 +:10E3300002C007900D92A030B107D9F712E0A0E01B +:10E34000B2E001C01D92AE30B107E1F70F9460F367 +:10E350000D948DFE01E20EBF0FEF0DBF11241FBE05 +:10E360000D9460F30D9400F020E030E040ED57E0B4 +:10E3700005C0FA013197F1F72F5F3F4F2817390792 +:10E38000C0F308959C01260F311DC901A0E0B0E043 +:10E390002F5F3F4FABBFFC018791882361F08093D3 +:10E3A000C6008091C00086FFFCCF8091C0008064D1 +:10E3B0008093C000EACF08958DE08093C6008091DD +:10E3C000C00086FFFCCF8091C00080648093C000B5 +:10E3D0008AE08093C6008091C00086FFFCCF8091C8 +:10E3E000C00080648093C00008950F94C2F10F9420 +:10E3F000DCF10895FC019081992359F09093C600B7 +:10E400008091C00086FFFCCF8091C0008064809323 +:10E41000C0003196992379F70895282F982F929567 +:10E420009F70892F805D8A3308F0895F8093C600D2 +:10E430008091C00086FFFCCF8091C00080648093F3 +:10E44000C000822F8F70982F905D9A3308F0995FEB +:10E450009093C6008091C00086FFFCCF8091C000E1 +:10E4600080648093C00008959C01FB01853691056E +:10E470001CF46330710594F0C90164E670E00F94F8 +:10E480002EFE605D7F4F6093C6008091C00086FFC6 +:10E49000FCCF8091C00080648093C0002B30310598 +:10E4A00014F43297B4F0C90164E670E00F942EFEC4 +:10E4B0006AE070E00F942EFE605D7F4F6093C600AF +:10E4C0008091C00086FFFCCF8091C0008064809363 +:10E4D000C000C9016AE070E00F942EFEC0968093E0 +:10E4E000C6008091C00086FFFCCF8091C000806490 +:10E4F0008093C00008951F93182F8EE692EE60E07F +:10E500000F94C2F11093C6008091C00086FFFCCF2B +:10E510008091C00080648093C0000F94DCF11F9153 +:10E5200008952F923F924F925F926F927F928F92B7 +:10E530009F92AF92BF92CF92DF92EF92FF920F9392 +:10E540001F93DF93CF93CDB7DEB762970FB6F894E2 +:10E55000DEBF0FBECDBF382E622ECA01DB015C01CB +:10E560006D01772420E2222E2E010894411C511CBB +:10E570008BC081E0A81680E0B80681E0C80680E084 +:10E58000D80628F0C601AA27BB270F940DF2BB2797 +:10E59000AD2D9C2D8B2D0F940DF28A2D0F940DF225 +:10E5A0002092C6008091C00086FFFCCF8091C00001 +:10E5B00080648093C0009DE29093C6008091C0006B +:10E5C00086FFFCCF8091C00080648093C0002092C1 +:10E5D000C6008091C00086FFFCCF8091C00080649F +:10E5E0008093C00019828601750188249924A1E0D6 +:10E5F0003A1651F03A1620F0B2E03B1661F409C029 +:10E600000BBFF701779007C0C7010F9477FE782EF4 +:10E6100002C0F7017080872D0F940DF22092C60082 +:10E620008091C00086FFFCCF8091C0008064809301 +:10E63000C000872D8052F401EF70F0708F3520F408 +:10E64000E40DF51D708204C0E40DF51D8EE280839B +:10E650000894E11CF11C011D111D0894811C911CE2 +:10E6600090E18916910409F0C2CF80E190E0A0E02A +:10E67000B0E0A80EB91ECA1EDB1E198AC2010F9493 +:10E68000FAF10F94DCF16A94662009F072CF629679 +:10E690000FB6F894DEBF0FBECDBFCF91DF911F91B3 +:10E6A0000F91FF90EF90DF90CF90BF90AF909F9031 +:10E6B0008F907F906F905F904F903F902F90089534 +:10E6C0002F923F924F925F926F927F928F929F9282 +:10E6D000AF92BF92CF92DF92EF92FF920F931F9370 +:10E6E000DF93CF93CDB7DEB7CD53D1400FB6F894BB +:10E6F000DEBF0FBECDBF01E20EBF0FEF0DBF94B75F +:10E70000F894A89514BE80916000886180936000A1 +:10E7100010926000789493FF05C0E0910002F091A0 +:10E7200001021995279A2F9A8091C00082608093E8 +:10E73000C00080E18093C40088E18093C1000000A4 +:10E74000EE24FF24870144E0A42EB12CCC24DD2448 +:10E7500024C0C5010197F1F70894E11CF11C011DCB +:10E76000111D21E2E2162EE4F20620E0020720E06D +:10E77000120718F031E0C32ED12CC801B70127ECE5 +:10E780003BE140E050E00F9441FE611571058105C9 +:10E79000910519F485B1805885B98091C00087FD35 +:10E7A00003C0C114D104A9F2A6014F5F5F4FC25E3E +:10E7B000DE4F59834883CE51D140C25EDE4F8881FF +:10E7C0009981CE51D140019711F00D9410FEC05D9A +:10E7D000DE4F19821882C053D14060E0C15DDE4F28 +:10E7E0001882CF52D14088249924C35DDE4F19820C +:10E7F0001882CD52D140C05EDE4F188219821A8233 +:10E800001B82C052D140CE5CDE4F188219821A8220 +:10E810001B82C253D140EE24FF2487010BBFF701B6 +:10E8200007911691C45CDE4F19830883CC53D14005 +:10E830000D940BFEC25EDE4F28813981CE51D1404E +:10E840002130310509F52091C600C25EDE4F1982E4 +:10E850001882CE51D14022C02F5F3F4F4F4F5F4FA4 +:10E86000213082E138078AE7480780E0580780F0C6 +:10E87000C45CDE4FE881F981CC53D140EF5FFF4F9C +:10E8800019F0EE27FF27099420E030E040E050E047 +:10E890008091C00087FFE0CF2091C600C35DDE4FAE +:10E8A00048815981CD52D1404F5F5F4FC35DDE4FEC +:10E8B00059834883CD52D140213209F063C64A3092 +:10E8C000510508F05FC60894811C911C53E0851621 +:10E8D000910409F059C600E010E018C081E280936D +:10E8E000C6008091C00086FFFCCF8091C00080648C +:10E8F0008093C0002F5F3F4F2931310579F70F9486 +:10E90000DCF10F5F1F4F0530110519F020E030E0FA +:10E91000E5CF10920A0210920B0210920C02109294 +:10E920000D02109206021092070210920802109235 +:10E930000902109202021092030210920402109235 +:10E9400005028FEE90EE60E00F94F5F180E191EE1C +:10E9500060E00F94C2F18091C00087FFFCCF9091DE +:10E96000C600903608F09F759032B8F09093C600BC +:10E970008091C00086FFFCCF8091C00080648093AE +:10E98000C000A0E2A093C6008091C00086FFFCCF2B +:10E990008091C00080648093C000983409F4D7C18E +:10E9A0009934B8F4923409F459C1933458F490333B +:10E9B00019F1903308F4E3C59F33A1F1903409F0C5 +:10E9C000DEC5BDC0953409F470C1963409F0D7C5D1 +:10E9D00098C1923509F42BC2933538F49C3409F46C +:10E9E000F5C1913509F0CBC518C2963509F445C279 +:10E9F000993509F0C4C567C483E792EE62E00F94CD +:10EA0000F5F110920602109207021092080210927D +:10EA1000090210920A0210920B0210920C0210923C +:10EA20000D0213C18FE792EE62E00F94F5F18FEEC5 +:10EA300090EE60E00F94F5F181E291EE60E00F94CA +:10EA4000C2F187EB91EE60E00F94F5F180E391EE77 +:10EA500060E00F94C2F184EE90EE60E00F94F5F167 +:10EA60008FE391EE60E00F94C2F186E090E061E008 +:10EA700070E00F9434F20F94DCF18DE591EE60E0DC +:10EA80000F94C2F189EC91EE60E00F94F5F18EE401 +:10EA900091EE60E00F94C2F183EC91EE60E00F9490 +:10EAA000F5F18CE691EE60E00F94C2F18EE10F94E7 +:10EAB0000DF288E90F940DF281E00F940DF20F949E +:10EAC000DCF18BE791EE60E00F94C2F119E0E0E039 +:10EAD000F0E010935700E4918E2F0F940DF20F94F5 +:10EAE000DCF18AE891EE60E00F94C2F1E3E0F0E03F +:10EAF00010935700E4918E2F0F940DF20F94DCF1D8 +:10EB000089E991EE60E00F94C2F1E2E0F0E0109349 +:10EB10005700E4918E2F0F940DF20F94DCF188EAE8 +:10EB200091EE60E00F94C2F1E1E0F0E01093570045 +:10EB30001491812F0F940DF20F94DCF107CF8BE825 +:10EB400092EE62E00F94F5F18BE492EE60E00F94A8 +:10EB5000F5F10F94DCF100E010E019C0C8016F2D51 +:10EB60000F947FFEFF2031F489E492EE60E00F9471 +:10EB7000C2F10BC0F092C6008091C00086FFFCCFAE +:10EB80008091C00080648093C0000F5F1F4FC80158 +:10EB900081519F41A0E0B0E0ABBFFC01F790BAE229 +:10EBA000FB1621F0E2E000301E07C1F60F94DCF105 +:10EBB0000F94DCF187E592EE60E00F94F5F10F948D +:10EBC000DCF1CC24DD2400E010E01EC0C8010F946D +:10EBD00077FEF82E882331F489E492EE60E00F94FA +:10EBE000C2F10BC08093C6008091C00086FFFCCFAD +:10EBF0008091C00080648093C000FE1419F00894D6 +:10EC0000C11CD11C0F5F1F4FC80181519F41A0E063 +:10EC1000B0E0ABBFFC01E790FAE2EF1621F022E092 +:10EC20000030120799F60F94DCF10F94DCF182E6C4 +:10EC300092EE60E00F94C2F1C60161E070E00F94C3 +:10EC400034F20F94DCF10F94DCF110920202109276 +:10EC50000302109204021092050278CE89E992EE26 +:10EC600062E00F94F5F1279A2F9A16C02F9880E052 +:10EC700090E0E0EDF7E03197F1F7019684369105E9 +:10EC8000C1F72F9A80E090E0E0EDF7E03197F1F7DF +:10EC9000019684369105C1F78091C00087FFE6CFC9 +:10ECA0008091C00087FFFCCF64C485EA92EE62E0E9 +:10ECB0000F94F5F140910202509103026091040219 +:10ECC0007091050281E020E10F9491F2809102029F +:10ECD00090910302A0910402B091050280509F4FD1 +:10ECE000AF4FBF4F8093020290930302A0930402A0 +:10ECF000B093050280509041A040B04008F426CE69 +:10ED0000A4CF83EB92EE62E00F94F5F140910602FE +:10ED100050910702609108027091090280E020E1A1 +:10ED20000F9491F28091060290910702A09108023F +:10ED3000B091090280509F4FAF4FBF4F80930602A2 +:10ED400090930702A0930802B0930902FFCD80ECD4 +:10ED500092EE62E00F94F5F183E792EE60E00F949B +:10ED6000F5F18FE792EE60E00F94F5F18BE892EE0B +:10ED700060E00F94F5F189E992EE60E00F94F5F10F +:10ED800085EA92EE60E00F94F5F183EB92EE60E09D +:10ED90000F94F5F180EC92EE60E00F94F5F187ECC2 +:10EDA00092EE60E00F94F5F188ED92EE60E00F9442 +:10EDB000F5F18FED92EE60E00F94F5F18AEE92EEB0 +:10EDC00060E00F94F5F183E093EEBDCD87EC92EE19 +:10EDD00062E00F94F5F181E40F947BF282E40F94EA +:10EDE0007BF283E40F947BF284E40F947BF285E45E +:10EDF0000F947BF286E40F947BF287E40F947BF20E +:10EE000088E40F947BF28AE40F947BF28BE40F94F6 +:10EE10007BF28CE40F947BF299CD88ED92EE62E068 +:10EE20000F94F5F1772473948824992409C48FED05 +:10EE300092EE62E00F94F5F140910A0250910B02BC +:10EE400060910C0270910D0282E020E10F9491F22A +:10EE500080910A0290910B02A0910C02B0910D02D8 +:10EE600080509F4FAF4FBF4F80930A0290930B0289 +:10EE7000A0930C02B0930D0269CD8AEE92EE62E08F +:10EE80000F94F5F184EE90EE60E00F94F5F18FECC5 +:10EE900091EE60E00F94F5F1662477244301CC5D98 +:10EEA000DE4F19821882C452D140D401C301B695F5 +:10EEB000A79597958795CA5DDE4F88839983AA8326 +:10EEC000BB83C652D140CC5DDE4FA881B981C4520C +:10EED000D1401196CC5DDE4FB983A883C452D14096 +:10EEE000CD0162E070E00F9434F2B0E2B093C6005E +:10EEF0008091C00086FFFCCF8091C0008064809329 +:10EF0000C000EDE2E093C6008091C00086FFFCCF18 +:10EF10008091C00080648093C000F0E2F093C6004E +:10EF20008091C00086FFFCCF8091C00080648093F8 +:10EF3000C000CA5DDE4FE880F9800A811B81C6529D +:10EF4000D140BB27A12F902F8F2D0F940DF2CA5DBA +:10EF5000DE4F8881C652D1400F940DF2B0E2FB2EF5 +:10EF6000F092C6008091C00086FFFCCF8091C00067 +:10EF700080648093C0000DE30093C6008091C000C0 +:10EF800086FFFCCF8091C00080648093C00010E2B7 +:10EF90001093C6008091C00086FFFCCF8091C00016 +:10EFA00080648093C0008BBEF3012791C65DDE4F65 +:10EFB0002883CA52D140A22EBB24CC24DD2408943D +:10EFC000611C711C811C911C8BBEF3018791282E42 +:10EFD0003324442455240894611C711C811C911C09 +:10EFE0008BBEF3013791C55DDE4F3883CB52D140E4 +:10EFF0000894611C711C811C911C8BBEF30147910C +:10F00000C45DDE4F4883CC52D140ADEFEA2EAFEF66 +:10F01000FA2EAFEF0A2FAFEF1A2F6E0C7F1C801E57 +:10F02000911E142D032DF22CEE24EA0CFB1C0C1D5A +:10F030001D1D0F940DF220E22093C6008091C000A8 +:10F0400086FFFCCF8091C00080648093C000C65DC5 +:10F05000DE4F8881CA52D1400F940DF230E23093D6 +:10F06000C6008091C00086FFFCCF8091C000806404 +:10F070008093C000C45DDE4F8881CC52D1400F9494 +:10F080000DF240E24093C6008091C00086FFFCCFA5 +:10F090008091C00080648093C000C55DDE4F888190 +:10F0A000CB52D1400F940DF250E25093C6008091A4 +:10F0B000C00086FFFCCF8091C00080648093C000B8 +:10F0C0008FEFE8168FEFF80680E0080780E018075A +:10F0D00031F484E092EE60E00F94C2F1DFC0D80119 +:10F0E000C7018070907CA070B0708050904CA040A0 +:10F0F000B040D1F52FEF3FE340E050E0E222F322B1 +:10F1000004231523CA5DDE4FA880B980CA80DB8046 +:10F11000C652D140AE0CBF1CC01ED11EAA0CBB1CD7 +:10F12000CC1CDD1C8EE092EE60E00F94C2F1BB2798 +:10F13000A12F902F8F2D0F940DF28E2D0F940DF285 +:10F1400030E23093C6008091C00086FFFCCF8091F2 +:10F15000C00080648093C0004EE34093C60080915D +:10F16000C00086FFFCCF87C08EE09EEFA0E0B0E03D +:10F17000E822F9220A231B239CE0E91694E9F90608 +:10F1800090E0090790E0190709F088C0C45DDE4FE0 +:10F19000A881CC52D140EA2EFF2400E010E0102FCD +:10F1A0000F2DFE2CEE24C55DDE4FB881CB52D14031 +:10F1B000EB0EF11C011D111DD601C501817090706F +:10F1C000A070B070DC0199278827E80EF91E0A1F8D +:10F1D0001B1F20EF30E040E050E0A222B322C42207 +:10F1E000D52241E1AA0CBB1CCC1CDD1C4A95D1F7F1 +:10F1F000EA0CFB1C0C1D1D1D81E090E0A0E0B0E0BE +:10F20000282239224A225B2235E1220C331C441C7D +:10F21000551C3A95D1F7E20CF31C041D151D57013E +:10F220006801AA0CBB1CCC1CDD1C85E192EE60E0E1 +:10F230000F94C2F1C801AA27BB270F940DF2BB2778 +:10F24000A12F902F8F2D0F940DF28E2D0F940DF274 +:10F2500090E29093C6008091C00086FFFCCF809121 +:10F26000C00080648093C000AEE3A093C60080918C +:10F27000C00086FFFCCF8091C00080648093C000F6 +:10F28000C601AA27BB270F940DF2BB27AD2D9C2DDD +:10F290008B2D0F940DF28A2D0F940DF20F94DCF14B +:10F2A000CC5DDE4FE881F981C452D140F99709F471 +:10F2B0004DCBF4E0EF2EF12C012D112D6E0C7F1CA7 +:10F2C000801E911EF2CD83E093EE62E00F94F5F183 +:10F2D0008AE192EE60E00F94C2F18091C00087FF56 +:10F2E000FCCF1091C6001F751093C6008091C0001E +:10F2F00086FFFCCF8091C00080648093C0000F9493 +:10F30000DCF1812F81548A3108F036C1163409F4BA +:10F3100095C0173490F4133409F44EC0143430F40B +:10F320001134F1F0123409F01DC130C0143409F465 +:10F3300059C0153409F016C16BC01A3409F4C4C0A1 +:10F340001B3438F4173409F48FC0183409F00AC19B +:10F35000A1C01B3409F4D2C01C3409F003C1E8C0B9 +:10F360008FEF81B90DC082B1809582B980E090E0C5 +:10F37000E0EDF7E03197F1F70196883C9105C1F790 +:10F380008091C00087FFEFCF12B8EFC08FEF84B934 +:10F390000DC085B1809585B980E090E0E0EDF7E0A3 +:10F3A0003197F1F70196883C9105C1F78091C00033 +:10F3B00087FFEFCF15B8D9C08FEF87B90DC088B1DF +:10F3C000809588B980E090E0E0EDF7E03197F1F7C3 +:10F3D0000196883C9105C1F78091C00087FFEFCF6F +:10F3E00018B8C3C08FEF8AB90DC08BB180958BB9A7 +:10F3F00080E090E0E0EDF7E03197F1F70196883C8E +:10F400009105C1F78091C00087FFEFCF1BB8ADC059 +:10F410008FEF8DB90DC08EB180958EB980E090E0F0 +:10F42000E0EDF7E03197F1F70196883C9105C1F7DF +:10F430008091C00087FFEFCF1EB897C08FEF80BBD1 +:10F440000DC081B3809581BB80E090E0E0EDF7E0F6 +:10F450003197F1F70196883C9105C1F78091C00082 +:10F4600087FFEFCF11BA81C08FEF83BB0DC084B38C +:10F47000809584BB80E090E0E0EDF7E03197F1F714 +:10F480000196883C9105C1F78091C00087FFEFCFBE +:10F4900014BA6BC08FEF809301010FC080910201FD +:10F4A00080958093020180E090E0E0EDF7E03197F5 +:10F4B000F1F70196883C9105C1F78091C00087FF64 +:10F4C000EDCF1092020151C08FEF809304010FC065 +:10F4D0008091050180958093050180E090E0E0ED4A +:10F4E000F7E03197F1F70196883C9105C1F78091DB +:10F4F000C00087FFEDCF1092050137C08FEF8093DA +:10F5000007010FC08091080180958093080180E079 +:10F5100090E0E0EDF7E03197F1F70196883C910536 +:10F52000C1F78091C00087FFEDCF109208011DC088 +:10F530008FEF80930A010FC080910B01809580931B +:10F540000B0180E090E0E0EDF7E03197F1F70196F4 +:10F55000883C9105C1F78091C00087FFEDCF1092E4 +:10F560000B0103C085E292EEEEC98091C00087FFD7 +:10F57000FCCF8091C600EAC988E392EEE4C98CE131 +:10F5800091EEE1C988249924933011F1943028F444 +:10F59000913089F09230B8F408C0953061F195301F +:10F5A000F0F0963009F048C043C02B3109F042C951 +:10F5B00091E06BE13FC96227C15DDE4F2883CF52E6 +:10F5C000D14092E037C9B22FA0E0622793E032C960 +:10F5D000822F90E0A82BB92B622794E02BC92E3004 +:10F5E00009F039C3622795E0C05DDE4F19821882A9 +:10F5F000C053D1401FC9E1E0F0E0EC0FFD1FC05D3A +:10F60000DE4F08811981C053D140E00FF11F2083E4 +:10F610000F5F1F4FC05DDE4F19830883C053D14079 +:10F6200062270A171B0709F005C9D80196E002C92D +:10F63000261709F010C303C0973009F0FBC87724E0 +:10F640009981933109F412C19431C8F4963009F4C8 +:10F65000D8C0973050F4923009F406C1933009F4C1 +:10F660006DC0913009F059C253C0913109F477C08F +:10F67000923108F0BBC0903109F04FC2F5C098310B +:10F6800009F487C0993150F4953109F4EFC09531F0 +:10F6900008F4C6C1963109F040C2C2C19A3109F4DA +:10F6A0006CC09A3108F491C09B3109F45BC09D3164 +:10F6B00009F033C29D81903359F48F81882311F46E +:10F6C0009EE11CC0813011F091E018C098E916C08D +:10F6D000892F807591F0903539F4E0E0F0E089E011 +:10F6E0008093570094910AC0983539F4E3E0F0E034 +:10F6F00089E080935700949101C090E01A821B82A8 +:10F700008D818C831D829E831F8227E030E009C299 +:10F710001A8288E08B8381E48C8386E58D8382E581 +:10F720008E8389E48F8383E5888780E589878FE5E9 +:10F730008A8782E38B872BE030E0F3C18A818139AD +:10F7400041F0823941F0803911F48FE005C080E04A +:10F7500003C082E001C08AE01A828B8344C0772410 +:10F76000739482C08D81882311F48EE12CC0813086 +:10F7700011F081E028C088E926C01A82E1E0F0E0BB +:10F7800089E08093570084918B831C8224E030E0D1 +:10F79000C8C18B81803589F48C81883039F4E2E0EE +:10F7A000F0E089E08093570084910DC0E0E0F0E044 +:10F7B00089E080935700849106C0E3E0F0E089E09F +:10F7C0008093570084911A82DFCF8D81836C99E0FA +:10F7D000E1E0F0E0082E90935700E89507B600FCB2 +:10F7E000FDCF1A821B8223E030E09BC180EC8A832C +:10F7F000CE5CDE4F188219821A821B82C253D1401E +:10F800008EC18A8190E0A0E0B0E0582F44273327D2 +:10F8100022278B8190E0A0E0B0E0DC0199278827C7 +:10F82000282B392B4A2B5B2B8D8190E0A0E0B0E098 +:10F83000282B392B4A2B5B2B8C8190E0A0E0B0E089 +:10F84000BA2FA92F982F8827282B392B4A2B5B2BCF +:10F85000220F331F441F551FC05EDE4F288339839C +:10F860004A835B83C052D1401A8259C13A81C95C34 +:10F87000DE4F3883C753D140CA5CDE4F1882C6536F +:10F88000D1408B81C82EDD24CA5CDE4F488159816E +:10F89000C653D140C42AD52A933109F082C0CE5C28 +:10F8A000DE4F88819981AA81BB81C253D1408050AB +:10F8B000904CA340B04030F583E0CE5CDE4FE88052 +:10F8C000F9800A811B81C253D140F70100935B008C +:10F8D00080935700E89507B600FCFDCFCE5CDE4F65 +:10F8E000088119812A813B81C253D14000501F4FAA +:10F8F0002F4F3F4FCE5CDE4F088319832A833B8313 +:10F90000C253D140C05EDE4F488159816A817B81FC +:10F91000C052D140DE011B9631E08C9111962C91A2 +:10F9200011971296C75CDE4F2883C953D140C85C3B +:10F93000DE4F1882C853D14090E0C85CDE4FE881AA +:10F94000F981C853D1408E2B9F2B0C01FA01609393 +:10F950005B0030935700E89511244E5F5F4F6F4F67 +:10F960007F4F0EEFE02E0FEFF02ECE0CDF1CC114F8 +:10F97000D10499F685E0C05EDE4F088119812A81A5 +:10F980003B81C052D140F80120935B008093570027 +:10F99000E89507B600FCFDCF81E180935700E8951C +:10F9A00035C0C05EDE4F88819981AA81BB81C0527B +:10F9B000D140B695A795979587957C018601ABE0D8 +:10F9C000AA2EB12CAC0EBD1E0BC0D5016D915D01F0 +:10F9D000C7010F947FFE0894E11CF11C01501040F8 +:10F9E0000115110591F7A60160E070E0440F551F65 +:10F9F000661F771FC05EDE4FE880F9800A811B8199 +:10FA0000C052D1404E0D5F1D601F711F1A82C05E33 +:10FA1000DE4F488359836A837B83C052D1407FC0C5 +:10FA2000FA80C55CDE4FF882CB53D140C65CDE4F16 +:10FA30001882CA53D1408B81C82EDD24C65CDE4FAC +:10FA400008811981CA53D140C02AD12A1A828981DA +:10FA5000BE016D5F7F4F843121F59601C05EDE4FA0 +:10FA6000E880F9800A811B81C052D1400BBFF701A9 +:10FA700087919691DB018C9311969C936E5F7F4FDB +:10FA8000D801C7010296A11DB11DC05EDE4F88835B +:10FA90009983AA83BB83C052D14022503040F1F6F3 +:10FAA00036C0C05EDE4F288139814A815B81C052F9 +:10FAB000D1400894C108D108760100E010E0089414 +:10FAC000C11CD11C0894E11CF11C011D111DE20E8A +:10FAD000F31E041F151F21BDBB27A52F942F832FB5 +:10FAE00082BD2F5F3F4F4F4F5F4FF89A80B5DB01CC +:10FAF0008D93BD012E153F054007510761F7C05E8C +:10FB0000DE4F288339834A835B83C052D1409601FC +:10FB10002D5F3F4FFB01108204C080EC8A8322E0FE +:10FB200030E08BE18093C6008091C00086FFFCCF5F +:10FB30008091C00080648093C000C15DDE4FF88179 +:10FB4000CF52D140F093C6008091C00086FFFCCF19 +:10FB50008091C00080648093C000432F3093C60022 +:10FB60008091C00086FFFCCF8091C00080648093AC +:10FB7000C000922F2093C6008091C00086FFFCCF6A +:10FB80008091C00080648093C0008EE08093C600A6 +:10FB90008091C00086FFFCCF8091C000806480937C +:10FBA000C00065E1C15DDE4FE880CF52D1406E25D7 +:10FBB00069276427FE01319610C090819093C6009A +:10FBC0008091C00086FFFCCF31968091C000806498 +:10FBD0008093C0006927215030402115310569F715 +:10FBE0006093C6008091C00086FFFCCF8091C0006A +:10FBF00080648093C00085B1805885B9772081F4F6 +:10FC0000C15DDE4F0881CF52D1400F5FC15DDE4F35 +:10FC10000883CF52D14090E0A0E0B0E00D941AF4F8 +:10FC200027982F9880E090E020ED37E0F901319798 +:10FC3000F1F7019684369105C9F700008091C00064 +:10FC40008D7F8093C00081E180935700E895EE2777 +:10FC5000FF270994FFCF90E00D941AF497FB092E2B +:10FC600007260AD077FD04D02ED006D000201AF443 +:10FC7000709561957F4F0895F6F7909581959F4F08 +:10FC80000895A1E21A2EAA1BBB1BFD010DC0AA1FDD +:10FC9000BB1FEE1FFF1FA217B307E407F50720F0F5 +:10FCA000A21BB30BE40BF50B661F771F881F991F70 +:10FCB0001A9469F760957095809590959B01AC01B9 +:10FCC000BD01CF010895AA1BBB1B51E107C0AA1FAC +:10FCD000BB1FA617B70710F0A61BB70B881F991FED +:10FCE0005A95A9F780959095BC01CD010895F99991 +:10FCF000FECF92BD81BDF89A992780B50895262F31 +:10FD0000F999FECF1FBA92BD81BD20BD0FB6F89400 +:0EFD1000FA9AF99A0FBE01960895F894FFCF63 +:040000033000E000E9 +:00000001FF diff --git a/hardware/arduino/avr/cores/robot/Arduino.h b/hardware/arduino/avr/cores/robot/Arduino.h old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/cores/robot/Print.cpp b/hardware/arduino/avr/cores/robot/Print.cpp old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/cores/robot/Print.h b/hardware/arduino/avr/cores/robot/Print.h old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/cores/robot/Tone.cpp b/hardware/arduino/avr/cores/robot/Tone.cpp old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/cores/robot/wiring_private.h b/hardware/arduino/avr/cores/robot/wiring_private.h old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/cores/robot/wiring_pulse.c b/hardware/arduino/avr/cores/robot/wiring_pulse.c old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/cores/robot/wiring_shift.c b/hardware/arduino/avr/cores/robot/wiring_shift.c old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex index 7720cf41bed..61c5321fcc1 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex @@ -1,467 +1,467 @@ -:1000000090C00000A9C00000A7C00000A5C000006B -:10001000A3C00000A1C000009FC000009DC0000060 -:100020009BC0000099C0000097C0000048C40000B9 -:100030000CC4000091C000008FC000008DC0000003 -:100040008BC0000089C0000087C0000085C0000090 -:1000500083C0000081C000007FC0000002C100001A -:100060007BC0000079C0000077C0000075C00000B0 -:1000700073C0000071C000006FC000006DC00000C0 -:100080006BC0000069C0000067C0000065C00000D0 -:1000900063C0000061C000001201100102000008EE -:1000A0004123420001000102DC0109023E0002017D -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:10012000000011241FBECFEFD2E0DEBFCDBF11E033 -:10013000A0E0B1E0ECEAFFE002C005900D92A6312C -:10014000B107D9F712E0A6E1B1E001C01D92AF32CC -:10015000B107E1F7F1D028C753CF9C01DC01AE57BE -:10016000BF4FED91FC91119741911196FC93EE9345 -:1001700080589F4FE817F90711F42D933C939FB7D0 -:10018000F894F901EC57FF4F8081815080839FBF25 -:10019000842F0895DF92EF92FF920F931F93FC013B -:1001A0008489813019F0823021F405C040E3D42ED7 -:1001B00004C0DD2402C030E2D32E8389823011F4E2 -:1001C00088E0D82A8589873031F0883031F0863050 -:1001D00031F482E003C084E001C086E0D82A1092A6 -:1001E000C9001092C8001092CA00E784F088018903 -:1001F000128980E0E81681EEF80680E0080780E0CA -:10020000180719F420E130E00FC0C801B701969536 -:1002100087957795679560587B47814E9F4FA801DA -:100220009701A0D6215030403093CD002093CC00D0 -:10023000D092CA0080E0E81681EEF80680E0080758 -:1002400080E0180711F082E001C080E08093C800D0 -:1002500088E98093C9001F910F91FF90EF90DF9084 -:1002600008951F920F920FB60F9211242F938F9320 -:100270009F93EF93FF939091CE008EB38430F1F46F -:10028000E0919901F0919A019083E0919901F091A8 -:100290009A01CF01019690939A018093990189590F -:1002A000914021F489E191E0928381839FB7F89492 -:1002B00080919D018F5F80939D019FBFFF91EF9182 -:1002C0009F918F912F910F900FBE0F901F901895B7 -:1002D000FC01858580FF02C05F9808955F9A0895AC -:1002E00080E091E0D5C580E091E088C584B7877F44 -:1002F00084BF28E10FB6F89420936000109260004C -:100300000FBE87E690E09093CD008093CC0086E00E -:100310008093CA001092C8002093C900539A5A9A39 -:100320008AB180638AB98BB180638BB983D284E050 -:1003300085BD5F9A579A08950F931F93CF93DF93CC -:10034000D5DF2FB7F8948EE991E090931F02809348 -:100350001E0290932102809320022FBF2FB7F894A2 -:1003600089E191E090939A018093990190939C0187 -:1003700080939B012FBF7894CEE9D1E003E08FB743 -:10038000F894909122028FBF903809F180E091E0BB -:10039000ABD497FD1CC0E0911E02F0911F02808338 -:1003A000E0911E02F0911F02CF01019690931F026F -:1003B00080931E028E51924011F4D283C1839FB765 -:1003C000F894809122028F5F809322029FBF8FB7A3 -:1003D000F89410919D018FBFA89902C0113678F151 -:1003E000A89A80919D01882361F05D980093160181 -:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 -:1004000011501123B1F780911601882351F080918A -:10041000160181508093160180911601882309F4FA -:100420005D9A80911701882351F0809117018150C6 -:100430008093170180911701882309F45C9A8FB784 -:10044000F894909122028FBF992369F08EE991E090 -:1004500084DE982F8091C80085FFFCCF9093CE005A -:100460005C980093170180E091E095D42AD487CF5F -:10047000DA01923049F0933061F09130F9F4E8E913 -:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 -:1004900019C0813049F0813018F0823079F408C0F9 -:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 -:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 -:1004C00020E030E0ED93FC93C901089528E030E08E -:1004D00040E003C04F5F220F331F28173907D0F3C6 -:1004E000842F8295807F08958093E9008091EB00AE -:1004F00081608093EB001092ED006093EC004093DC -:10050000ED008091EE00881F8827881F08951092C3 -:10051000F40090E09093E9001092F0001092E8004F -:100520001092ED008091EB008E7F8093EB009F5F37 -:10053000953081F708958091270288238CF403C0B9 -:100540008EB38823B1F08091E80082FFF9CF8091CB -:10055000E8008B778093E80008958EB3882349F0F4 -:100560008091E80080FFF9CF8091E8008E7780933A -:10057000E800089594E68091EC0080FF05C080912A -:10058000E80080FF05C023C08091E80082FD1FC005 -:100590008EB3882311F482E008958EB3853011F470 -:1005A00083E008958091EB0085FF02C081E008950B -:1005B0008091E10082FFDFCF8091E1008B7F80930B -:1005C000E100992311F484E008959150D4CF80E0A4 -:1005D00008959C0140912D0250912E024617570715 -:1005E00018F4F90120E038C06115710511F0AB0174 -:1005F000F8CF8091E8008E778093E80040E050E0EB -:10060000F0CF8091E80083FF02C081E008958091DF -:10061000E80082FD2DC08EB3882381F18EB3853032 -:1006200079F18091E80080FF17C09091F20006C038 -:1006300081918093F100415050409F5F41155105D9 -:1006400011F09830A8F320E0983009F421E080916F -:10065000E8008E778093E8004115510591F622233A -:1006600081F606C08EB3882349F08EB3853041F001 -:100670008091E80082FFF6CF80E0089582E008953F -:1006800083E008959C0140912D0250912E0246175F -:10069000570710F490E03BC06115710511F0AB01F4 -:1006A000F9CF8091E8008E778093E80040E050E039 -:1006B000F1CF8091E80083FF02C081E0089580912E -:1006C000E80082FD30C08EB3882399F18EB3853067 -:1006D00091F18091E80080FF1AC08091F20009C07A -:1006E000F9012F5F3F4FE491E093F10041505040FA -:1006F0008F5F4115510511F0883090F390E08830FC -:1007000009F491E08091E8008E778093E80041152C -:10071000510579F6992369F606C08EB3882349F00E -:100720008EB3853041F08091E80082FFF6CF80E003 -:10073000089582E0089583E008959C016115710594 -:1007400029F48091E8008B778093E800F90120C0BC -:100750008091E80083FF02C081E008958EB3882372 -:1007600039F18EB3853031F18091E80082FFF0CF0E -:1007700006C08091F10081936150704021F080911A -:10078000F2008823B1F78091E8008B778093E8002E -:1007900061157105E9F606C08EB3882349F08EB362 -:1007A000853041F08091E80080FFF6CF80E0089529 -:1007B00082E0089583E0089542D044D01EBA10929A -:1007C0002502109224021092230284E089BD89B58B -:1007D000826089BD09B400FEFDCF8091D800982FBA -:1007E0009F779093D80080688093D80080916300B1 -:1007F0008E7F809363008091D8008F7D8093D80096 -:100800008091E0008E7F8093E0008091E1008E7FF8 -:100810008093E1008091E20081608093E20080910A -:10082000E100877F8093E1008091E20088608093FF -:10083000E2000895C1DF81E08093260208951092BE -:10084000E20008951092E10008951F920F920FB6F2 -:100850000F9211241F932F933F934F935F936F93A6 -:100860007F938F939F93AF93BF93EF93FF93E9EEA3 -:10087000F0E0108117701082E0EFF0E08081877F58 -:1008800080837894C3D0F894A9EEB0E01C92E0EF96 -:10089000F0E08081886080831C93FF91EF91BF918D -:1008A000AF919F918F917F916F915F914F913F9108 -:1008B0002F911F910F900FBE0F901F9018951F92B0 -:1008C0000F920FB60F9211242F933F934F935F9384 -:1008D0006F937F938F939F93AF93BF93EF93FF9308 -:1008E0008091E10080FF1BC08091E20080FF17C073 -:1008F0008091E1008E7F8093E1008091E2008E7F05 -:100900008093E2008091E20080618093E200809118 -:10091000D80080628093D80019BC1EBAD1D18091D2 -:10092000E10084FF29C08091E20084FF25C084E0BB -:1009300089BD89B5826089BD09B400FEFDCF809173 -:10094000D8008F7D8093D8008091E1008F7E8093C6 -:10095000E1008091E2008F7E8093E2008091E200CE -:1009600081608093E20080912502882311F481E068 -:1009700001C084E08EBBA4D18091E10083FF27C039 -:100980008091E20083FF23C08091E100877F809304 -:10099000E10082E08EBB109225028091E1008E7F03 -:1009A0008093E1008091E2008E7F8093E20080914D -:1009B000E20080618093E200AADD80E060E042E036 -:1009C00093DD8091F00088608093F00079D1809170 -:1009D000E10082FF0AC08091E20082FF06C08091A0 -:1009E000E1008B7F8093E1006BD1FF91EF91BF918C -:1009F000AF919F918F917F916F915F914F913F91B7 -:100A00002F910F900FBE0F901F9018951F93DF939B -:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D -:100A2000CDBFE7E2F2E08091F100819322E0EF3266 -:100A3000F207C9F78091270230912802353009F476 -:100A400087C0363040F43130C9F1313070F0333086 -:100A500009F01DC133C0383009F4EFC0393009F452 -:100A6000FEC0363009F013C192C0803821F08238C0 -:100A700009F00DC108C090912302809124028823BF -:100A800099F0926011C080912B0287708093E900E9 -:100A90008091EB0090E025E0969587952A95E1F707 -:100AA000982F91701092E9008091E800877F8093E1 -:100AB000E8009093F1001092F100CAC0882319F069 -:100AC000823009F0E4C090E08F719070009721F0BF -:100AD000029709F0DDC00CC080912902813009F035 -:100AE000D7C010922402333069F5809324022AC0C3 -:100AF00080912902882331F520912B02277009F477 -:100B0000C7C02093E9008091EB0080FFC1C0333063 -:100B100021F48091EB00806213C08091EB00806132 -:100B20008093EB0081E090E002C0880F991F2A9526 -:100B3000E2F78093EA001092EA008091EB0088606F -:100B40008093EB001092E9008091E800877F83C0DA -:100B5000882309F09CC0109129028091E800877FCA -:100B60008093E800E8DC04C08EB3882309F490C0C9 -:100B70008091E80080FFF8CF812F8F7711F492E009 -:100B800001C093E09EBB80688093E30081C08058E1 -:100B9000823008F07CC08091290290912A0223E0E3 -:100BA0008C3D920799F55FB7F894DE0115964EE0FB -:100BB00020E030E061E2E42FF0E0609357008491A0 -:100BC00020FF03C082958F704F5F982F9F70892FF1 -:100BD000805D8A3308F0895F8C9311961C9211977F -:100BE0002F5F3F4F12962431310529F75FBF8AE20C -:100BF0008B8383E08C838091E800877F8093E8007B -:100C0000CE0103966AE270E0E4DC11C060912B0231 -:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 -:100C2000E800877F8093E80089819A812BDD80919D -:100C3000E8008B778093E8002BC0803841F58091E5 -:100C4000E800877F8093E800809125028093F1007F -:100C50008091E8008E778093E8006DDC19C08823CE -:100C6000B1F490912902923098F48091E800877F46 -:100C70008093E800909325025EDC80912502882312 -:100C800011F483E001C084E08EBB2DDB01C028DBC2 -:100C90008091E80083FF0AC08091EB00806280931E -:100CA000EB008091E800877F8093E800AC960FB658 -:100CB000F894DEBF0FBECDBFCF91DF911F91089595 -:100CC00008951F938EB3882361F01091E90010926C -:100CD000E9008091E80083FF01C098DE177010934F -:100CE000E9001F9108950895FC018EB3843021F529 -:100CF00087859089A189B2890097A105B105E1F0A6 -:100D000085818093E9008091E80082FF15C0809181 -:100D1000F200882319F42FEF3FEF04C08091F10017 -:100D2000282F30E08091F200882341F48091E80080 -:100D30008B778093E80002C02FEF3FEFC901089541 -:100D4000FC018EB3843011F587859089A189B28921 -:100D50000097A105B105D1F081818093E9008091D0 -:100D6000F2008823A9F09091E8008091E8008E7746 -:100D70008093E80095FD0CC0FDDB982F882349F493 -:100D80008091E8008E778093E80003C092E001C074 -:100D900090E0892F0895FC018EB3843051F487854B -:100DA0009089A189B2890097A105B10511F0CF0101 -:100DB000C7CF08951F93FC01162F8EB38430D9F44A -:100DC00087859089A189B2890097A105B10599F01D -:100DD00081818093E9008091E80085FD08C08091C1 -:100DE000E8008E778093E800C5DB882329F4109310 -:100DF000F10080E001C082E01F9108950F931F93DE -:100E0000CF93DF93EC010D96FC0189E0DF011D9289 -:100E10008A95E9F72A813B8109818C81882311F425 -:100E200010E001C014E0C90151DB182B1260802FC3 -:100E300061E8412F59DB882329F12E813F810D8103 -:100E40008885882311F410E001C014E0C9013EDB5D -:100E5000182B1260802F60E8412F46DB882391F029 -:100E60002A853B8509858C85882311F410E001C013 -:100E700014E0C9012BDB182B1260802F61EC412F8D -:100E800033DB01C080E0DF91CF911F910F91089576 -:100E9000CF93DF93EC018091E80083FF60C08881ED -:100EA00090E020912B0230912C022817390709F08D -:100EB00056C080912802813261F0823220F4803263 -:100EC00009F04DC019C0823269F1833209F047C080 -:100ED00038C080912702813A09F041C08091E80032 -:100EE000877F8093E800CE010F9667E070E071DBAA -:100EF0008091E8008B7713C080912702813279F5C9 -:100F00008091E800877F8093E800CE010F9667E02C -:100F100070E013DCCE013ED98091E8008E7780939B -:100F2000E8001DC0809127028132C9F48091E80059 -:100F3000877F8093E800809129028D87CE01C8D9F0 -:100F40000DC080912702813251F48091E800877FA3 -:100F50008093E800CE0160912902C5DEECDADF91D2 -:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 -:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 -:100F800020F0A21BB30BE40BF50B661F771F881F25 -:100F9000991F1A9469F760957095809590959B01BB -:0C0FA000AC01BD01CF010895F894FFCF13 -:100FAC0000034000000440000002080000000000A4 -:060FBC000000000000002F -:103000004BC0000064C0000062C0000060C000004F -:103010005EC000005CC000005AC0000058C0000044 -:1030200056C0000054C0000052C00000EEC40000B2 -:103030004EC000004CC000004AC0000048C0000064 -:1030400046C0000044C0000042C0000040C0000074 -:103050003EC000003CC000003AC0000038C0000084 -:1030600036C0000034C0000032C0000030C0000094 -:103070002EC000002CC000002AC0000028C00000A4 -:1030800026C0000024C0000022C0000020C00000B4 -:103090001EC000001CC0000011241FBECFEFD2E0F4 -:1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B -:1030B00005900D92AA33B107D9F711E0AAE3B1E068 -:1030C00001C01D92AB35B107E1F772D314C698CF9A -:1030D000982F15C08091F200882371F48091E80048 -:1030E0008B7F8093E80003C08EB3882351F08091DA -:1030F000E80082FFF9CF02C08091F100915099233E -:1031000049F7089520914A01309149018091480181 -:103110009091470180933F0190934001C9018093B2 -:103120004101909342010895DF93CF9300D000D0E6 -:1031300000D0CDB7DEB780914501843009F45AC084 -:10314000853030F4813059F0833009F0D7C01FC08A -:10315000853009F4A0C0863009F0D0C0C3C080918A -:103160004601823008F0CAC0CDDF80914601882335 -:1031700061F480913F019091400123E0FC01209394 -:103180005700E89507B600FCFDCF85E008C08091A8 -:103190004601882311F0823029F4B4DF89E080935E -:1031A0000101ACC0813009F0A9C020E030E040E06E -:1031B00050E0F90184918F3F81F0CA01AA27BB2713 -:1031C00080933E013093400120933F018AE0809339 -:1031D000010185E080933B0191C02F5F3F4F4F4F2E -:1031E0005F4F2030F0E33F07F0E04F07F0E05F076C -:1031F00001F784C080914601833051F581E08093CE -:103200003A0180914B0190914C01892B71F0809192 -:103210004701813009F072C080914A0190914901C3 -:1032200090933D0180933C0169C0809147018823C0 -:1032300061F42CE088E190E00FB6F894A8958093B3 -:1032400060000FBE2093600059C01092000156C06C -:10325000882309F053C0809147018F3F09F04EC089 -:10326000E0E0F0E093E085E090935700E89507B642 -:1032700000FCFDCF80935700E89507B600FCFDCF1A -:10328000E058FF4F20E3E030F20771F781E18093CF -:103290005700E89533C0DE011196E5E0F1E083E0E8 -:1032A00001900D928150E1F7DE011496E2E0F1E029 -:1032B00083E001900D928150E1F790914701809158 -:1032C0004601882329F4FE01E90FF11D818107C021 -:1032D0008130A1F4FE01BC97E90FF11D808180933C -:1032E00050010CC080914601833041F48091470128 -:1032F000882321F48091480180933E0126960FB6E1 -:10330000F894DEBF0FBECDBFCF91DF9108952F920D -:103310003F924F925F926F927F929F92AF92BF9235 -:10332000CF92DF92EF92FF920F931F93CF93DF9391 -:103330008091590190915A0190934C0180934B01D7 -:1033400080914D01882351F080914D0181508093EF -:103350004D0180914D01882309F45D9A80914E01C1 -:10336000882351F080914E01815080934E018091CD -:103370004E01882309F45C9A80915401833009F44A -:10338000B2C1843030F4813071F0823009F0E3C191 -:1033900011C1853009F4C5C1853008F4BAC1863041 -:1033A00009F0D9C1CDC15C9883E080934E01809132 -:1033B000E800877F8093E80080913A01882329F014 -:1033C000B3DE5D9A5C9A10923A0120914B013091E4 -:1033D0004C012115310529F42AC08EB3882309F444 -:1033E000BAC18091E80082FFF8CF8091F10080930C -:1033F00045012150304030934C0120934B01E6E4CD -:10340000F1E00CC08091F10081932150304081E0C7 -:10341000EB34F80719F43183208308C08091F2005F -:10342000882381F730934C0120934B017DDE8091FE -:103430000101853009F0BAC080914B0190914C0197 -:10344000892B21F482E080930101B0C08AE140DE43 -:1034500080913F018F713CDEC0914101D0914201CA -:1034600020913F013091400121968E01021B130BE8 -:10347000219780914601882309F093C01801369462 -:103480002794C901A0913E01B0E09C01AD0162E02A -:10349000E62EF12C012D112DE20EF31E041F151F37 -:1034A00059016A0190E099249394B5E0A3E048C0E3 -:1034B0008091F200882371F48091E8008B7F8093E3 -:1034C000E80004C08EB3882309F445C18091E80068 -:1034D00082FFF8CF0894210831088091F100682F0D -:1034E0008091F100782FF5010B0190925700E8953B -:1034F00011249F5F903419F021143104A1F4F901D3 -:10350000B0935700E89507B600FCFDCF21143104B5 -:1035100051F0F701A0935700E89507B600FCFDCFE6 -:10352000A801970190E042E0442E512C612C712CAF -:10353000E40CF51C061D171DA40CB51CC61CD71CDD -:103540002114310409F0B4CFD0934001C0933F015E -:1035500081E180935700E89527C08091F20088238D -:1035600071F48091E8008B7F8093E80004C08EB3F3 -:10357000882309F4F0C08091E80082FFF8CF6091C1 -:10358000F10080913F0190914001A7D380913F01CC -:103590009091400101969093400180933F0101502A -:1035A000104001151105C9F680E192DD8091E80017 -:1035B0008B7FC3C08091E800877F8093E8005D988F -:1035C00083E080934D0104C08EB3882309F4C3C007 -:1035D0008091E80080FFF8CF80910101893091F05F -:1035E0008A3069F480914601813049F480913F012D -:1035F000909140018093F1009093F1009BC08091E5 -:10360000500196C0609141017091420120913F01AB -:10361000309140016F5F7F4F7B01E21AF30A6150E6 -:10362000704080914601882389F58701169507959A -:10363000C901A0913E01B0E09C01AD011FC0809185 -:10364000F200803271F48091E8008E7F8093E80070 -:1036500004C08EB3882309F47EC08091E80080FF07 -:10366000F8CFF901859194918093F1009093F10046 -:10367000015010402E5F3F4F4F4F5F4F0115110516 -:10368000F1F67093400160933F0129C0823039F513 -:1036900023C08091F200803271F48091E8008E7F27 -:1036A0008093E80004C08EB3882309F454C080914D -:1036B000E80080FFF8CF00913F0110914001C80160 -:1036C00004D38093F1000F5F1F4F109340010093CC -:1036D0003F010894E108F108E114F104D1F682E019 -:1036E0008093010127C08091E800877F8093E800E4 -:1036F00080913B018093F1001092F1001092F10053 -:103700001092F100809101018093F1001092F1007C -:1037100011C08091E800877F8093E80010923B0100 -:1037200019C08091E800877F8093E80080910101B3 -:103730008093F1008091E8008E7F8093E8000AC0BA -:103740008091E800877F8093E8005D9A5C9A82E030 -:103750008093010187D0DF91CF911F910F91FF904E -:10376000EF90DF90CF90BF90AF909F907F906F9041 -:103770005F904F903F902F9008952BD181E085BFAF -:1037800015BE089584B7877F84BF88E10FB6F8948B -:1037900080936000109260000FBE81E085BF82E0E0 -:1037A00085BF8AB180638AB98BB180638BB90CC144 -:1037B000E9DF789401C080D2809100018823D9F795 -:1037C00080913A018823B9F7D8DFE0913C01F0916C -:1037D0003D010995FA01923071F0933089F09130F2 -:1037E00029F488E091E022E130E019C080E090E027 -:1037F00020E030E014C08AE191E02BE130E00FC01E -:10380000882339F480913501282F30E085E391E059 -:1038100006C080914301282F30E083E491E091833A -:103820008083C90108958091EB0081608093EB0053 -:103830001092ED006093EC004093ED008091EE005B -:10384000881F8827881F08951092F4001092F000B6 -:103850001092E8001092ED00EBEEF0E080818E7F98 -:10386000808308958091530188238CF403C08EB324 -:103870008823B1F08091E80082FFF9CF8091E800C1 -:103880008B7F8093E80008958EB3882349F0809160 -:10389000E80080FFF9CF8091E8008E7F8093E800F8 -:1038A00008959C014091590150915A0146175707BC -:1038B00018F4F90120E038C06115710511F0AB0171 -:1038C000F8CF8091E8008E7F8093E80040E050E0E0 -:1038D000F0CF8091E80083FF02C081E008958091DD -:1038E000E80082FD2DC08EB3882381F18EB3853030 -:1038F00079F18091E80080FF17C09091F20006C036 -:1039000081918093F100415050409F5F41155105D6 -:1039100011F09032A8F320E0903209F421E0809178 -:10392000E8008E7F8093E8004115510591F622232F -:1039300081F606C08EB3882349F08EB3853041F0FE -:103940008091E80082FFF6CF80E0089582E008953C -:1039500083E0089554D056D01EBA1092510184E0ED -:1039600089BD89B5826089BD09B400FEFDCF809113 -:10397000D800982F9F779093D80080688093D800C4 -:10398000809163008E7F809363008091D8008F7D4B -:103990008093D8008091E0008E7F8093E00080913A -:1039A000E1008E7F8093E1008091E200816080934E -:1039B000E2008091E100877F8093E1008091E20046 -:1039C00088608093E2000895C5DF81E08093520112 -:1039D0000895C0DFE0EEF0E0808181608083E8ED53 -:1039E000F0E080818F7780830AD00CD019BCE3E6A9 -:1039F000F0E08081816080831092520108951092DE -:103A0000E20008951092E10008951F920F920FB600 -:103A10000F9211242F933F934F935F936F937F9354 -:103A20008F939F93AF93BF93EF93FF938091E100A8 -:103A300080FF1BC08091E20080FF17C08091E100F1 -:103A40008E7F8093E1008091E2008E7F8093E20080 -:103A50008091E20080618093E2008091D8008062D2 -:103A60008093D80019BC1EBA26D18091E10084FF52 -:103A700029C08091E20084FF25C084E089BD89B51A -:103A8000826089BD09B400FEFDCF8091D8008F7D92 -:103A90008093D8008091E1008F7E8093E100809137 -:103AA000E2008F7E8093E2008091E200816080934B -:103AB000E20080915101882311F481E001C084E08B -:103AC0008EBBF9D08091E10083FF22C08091E2009B -:103AD00083FF1EC08091E100877F8093E10082E038 -:103AE0008EBB109251018091E1008E7F8093E100A6 -:103AF0008091E2008E7F8093E2008091E2008061FD -:103B00008093E200A1DE80E060E042E28CDED3D070 -:103B10008091E10082FF0AC08091E20082FF06C02E -:103B20008091E1008B7F8093E100C5D0FF91EF9100 -:103B3000BF91AF919F918F917F916F915F914F91C5 -:103B40003F912F910F900FBE0F901F9018951F93CC -:103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE -:103B6000F100819381E0EB35F807C9F7909153019B -:103B700080915401853011F1863040F48130B9F0E4 -:103B8000813070F0833009F081C011C0883009F4B1 -:103B900053C0893009F462C0863009F077C02DC067 -:103BA000903809F474C0923809F070C070C099233D -:103BB00009F46DC0923009F069C069C0992309F019 -:103BC00065C0109155018091E800877F8093E800DF -:103BD00049DE04C08EB3882309F459C08091E800FF -:103BE00080FFF8CF812F8F7711F492E001C093E02E -:103BF0009EBB80688093E3004AC09058923008F0E2 -:103C000045C0809155019091560160915701AE01D8 -:103C10004F5F5F4FDFDDBC010097C9F18091E80085 -:103C2000877F8093E80089819A813BDE8091E8005C -:103C30008B7F8093E8002BC0903841F58091E8009D -:103C4000877F8093E800809151018093F1008091FB -:103C5000E8008E7F8093E80005DE19C09923B1F457 -:103C600090915501923098F48091E800877F80937D -:103C7000E80090935101F6DD80915101882311F401 -:103C800083E001C084E08EBB16D001C040DB809190 -:103C9000E80083FF0AC08091EB0080628093EB0014 -:103CA0008091E800877F8093E8000F900F90CF917C -:103CB000DF911F91089508958EB3882329F0809194 -:103CC000E80083FF01C043CF0895F999FECF92BD6C -:103CD00081BDF89A992780B50895262FF999FECFCE -:103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 -:0A3CF0000FBE01960895F894FFCF6F -:103CFA0001021E948920DCFB120110010000002041 -:103D0A00EB03EF2F00000001000109021B00010173 -:103D1A000080320904000000FE01020009210300AC -:0A3D2A0000000C000104030904006E -:0400000300003000C9 -:00000001FF +:1000000090C00000A9C00000A7C00000A5C000006B +:10001000A3C00000A1C000009FC000009DC0000060 +:100020009BC0000099C0000097C0000048C40000B9 +:100030000CC4000091C000008FC000008DC0000003 +:100040008BC0000089C0000087C0000085C0000090 +:1000500083C0000081C000007FC0000002C100001A +:100060007BC0000079C0000077C0000075C00000B0 +:1000700073C0000071C000006FC000006DC00000C0 +:100080006BC0000069C0000067C0000065C00000D0 +:1000900063C0000061C000001201100102000008EE +:1000A0004123420001000102DC0109023E0002017D +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:10012000000011241FBECFEFD2E0DEBFCDBF11E033 +:10013000A0E0B1E0ECEAFFE002C005900D92A6312C +:10014000B107D9F712E0A6E1B1E001C01D92AF32CC +:10015000B107E1F7F1D028C753CF9C01DC01AE57BE +:10016000BF4FED91FC91119741911196FC93EE9345 +:1001700080589F4FE817F90711F42D933C939FB7D0 +:10018000F894F901EC57FF4F8081815080839FBF25 +:10019000842F0895DF92EF92FF920F931F93FC013B +:1001A0008489813019F0823021F405C040E3D42ED7 +:1001B00004C0DD2402C030E2D32E8389823011F4E2 +:1001C00088E0D82A8589873031F0883031F0863050 +:1001D00031F482E003C084E001C086E0D82A1092A6 +:1001E000C9001092C8001092CA00E784F088018903 +:1001F000128980E0E81681EEF80680E0080780E0CA +:10020000180719F420E130E00FC0C801B701969536 +:1002100087957795679560587B47814E9F4FA801DA +:100220009701A0D6215030403093CD002093CC00D0 +:10023000D092CA0080E0E81681EEF80680E0080758 +:1002400080E0180711F082E001C080E08093C800D0 +:1002500088E98093C9001F910F91FF90EF90DF9084 +:1002600008951F920F920FB60F9211242F938F9320 +:100270009F93EF93FF939091CE008EB38430F1F46F +:10028000E0919901F0919A019083E0919901F091A8 +:100290009A01CF01019690939A018093990189590F +:1002A000914021F489E191E0928381839FB7F89492 +:1002B00080919D018F5F80939D019FBFFF91EF9182 +:1002C0009F918F912F910F900FBE0F901F901895B7 +:1002D000FC01858580FF02C05F9808955F9A0895AC +:1002E00080E091E0D5C580E091E088C584B7877F44 +:1002F00084BF28E10FB6F89420936000109260004C +:100300000FBE87E690E09093CD008093CC0086E00E +:100310008093CA001092C8002093C900539A5A9A39 +:100320008AB180638AB98BB180638BB983D284E050 +:1003300085BD5F9A579A08950F931F93CF93DF93CC +:10034000D5DF2FB7F8948EE991E090931F02809348 +:100350001E0290932102809320022FBF2FB7F894A2 +:1003600089E191E090939A018093990190939C0187 +:1003700080939B012FBF7894CEE9D1E003E08FB743 +:10038000F894909122028FBF903809F180E091E0BB +:10039000ABD497FD1CC0E0911E02F0911F02808338 +:1003A000E0911E02F0911F02CF01019690931F026F +:1003B00080931E028E51924011F4D283C1839FB765 +:1003C000F894809122028F5F809322029FBF8FB7A3 +:1003D000F89410919D018FBFA89902C0113678F151 +:1003E000A89A80919D01882361F05D980093160181 +:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 +:1004000011501123B1F780911601882351F080918A +:10041000160181508093160180911601882309F4FA +:100420005D9A80911701882351F0809117018150C6 +:100430008093170180911701882309F45C9A8FB784 +:10044000F894909122028FBF992369F08EE991E090 +:1004500084DE982F8091C80085FFFCCF9093CE005A +:100460005C980093170180E091E095D42AD487CF5F +:10047000DA01923049F0933061F09130F9F4E8E913 +:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 +:1004900019C0813049F0813018F0823079F408C0F9 +:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 +:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 +:1004C00020E030E0ED93FC93C901089528E030E08E +:1004D00040E003C04F5F220F331F28173907D0F3C6 +:1004E000842F8295807F08958093E9008091EB00AE +:1004F00081608093EB001092ED006093EC004093DC +:10050000ED008091EE00881F8827881F08951092C3 +:10051000F40090E09093E9001092F0001092E8004F +:100520001092ED008091EB008E7F8093EB009F5F37 +:10053000953081F708958091270288238CF403C0B9 +:100540008EB38823B1F08091E80082FFF9CF8091CB +:10055000E8008B778093E80008958EB3882349F0F4 +:100560008091E80080FFF9CF8091E8008E7780933A +:10057000E800089594E68091EC0080FF05C080912A +:10058000E80080FF05C023C08091E80082FD1FC005 +:100590008EB3882311F482E008958EB3853011F470 +:1005A00083E008958091EB0085FF02C081E008950B +:1005B0008091E10082FFDFCF8091E1008B7F80930B +:1005C000E100992311F484E008959150D4CF80E0A4 +:1005D00008959C0140912D0250912E024617570715 +:1005E00018F4F90120E038C06115710511F0AB0174 +:1005F000F8CF8091E8008E778093E80040E050E0EB +:10060000F0CF8091E80083FF02C081E008958091DF +:10061000E80082FD2DC08EB3882381F18EB3853032 +:1006200079F18091E80080FF17C09091F20006C038 +:1006300081918093F100415050409F5F41155105D9 +:1006400011F09830A8F320E0983009F421E080916F +:10065000E8008E778093E8004115510591F622233A +:1006600081F606C08EB3882349F08EB3853041F001 +:100670008091E80082FFF6CF80E0089582E008953F +:1006800083E008959C0140912D0250912E0246175F +:10069000570710F490E03BC06115710511F0AB01F4 +:1006A000F9CF8091E8008E778093E80040E050E039 +:1006B000F1CF8091E80083FF02C081E0089580912E +:1006C000E80082FD30C08EB3882399F18EB3853067 +:1006D00091F18091E80080FF1AC08091F20009C07A +:1006E000F9012F5F3F4FE491E093F10041505040FA +:1006F0008F5F4115510511F0883090F390E08830FC +:1007000009F491E08091E8008E778093E80041152C +:10071000510579F6992369F606C08EB3882349F00E +:100720008EB3853041F08091E80082FFF6CF80E003 +:10073000089582E0089583E008959C016115710594 +:1007400029F48091E8008B778093E800F90120C0BC +:100750008091E80083FF02C081E008958EB3882372 +:1007600039F18EB3853031F18091E80082FFF0CF0E +:1007700006C08091F10081936150704021F080911A +:10078000F2008823B1F78091E8008B778093E8002E +:1007900061157105E9F606C08EB3882349F08EB362 +:1007A000853041F08091E80080FFF6CF80E0089529 +:1007B00082E0089583E0089542D044D01EBA10929A +:1007C0002502109224021092230284E089BD89B58B +:1007D000826089BD09B400FEFDCF8091D800982FBA +:1007E0009F779093D80080688093D80080916300B1 +:1007F0008E7F809363008091D8008F7D8093D80096 +:100800008091E0008E7F8093E0008091E1008E7FF8 +:100810008093E1008091E20081608093E20080910A +:10082000E100877F8093E1008091E20088608093FF +:10083000E2000895C1DF81E08093260208951092BE +:10084000E20008951092E10008951F920F920FB6F2 +:100850000F9211241F932F933F934F935F936F93A6 +:100860007F938F939F93AF93BF93EF93FF93E9EEA3 +:10087000F0E0108117701082E0EFF0E08081877F58 +:1008800080837894C3D0F894A9EEB0E01C92E0EF96 +:10089000F0E08081886080831C93FF91EF91BF918D +:1008A000AF919F918F917F916F915F914F913F9108 +:1008B0002F911F910F900FBE0F901F9018951F92B0 +:1008C0000F920FB60F9211242F933F934F935F9384 +:1008D0006F937F938F939F93AF93BF93EF93FF9308 +:1008E0008091E10080FF1BC08091E20080FF17C073 +:1008F0008091E1008E7F8093E1008091E2008E7F05 +:100900008093E2008091E20080618093E200809118 +:10091000D80080628093D80019BC1EBAD1D18091D2 +:10092000E10084FF29C08091E20084FF25C084E0BB +:1009300089BD89B5826089BD09B400FEFDCF809173 +:10094000D8008F7D8093D8008091E1008F7E8093C6 +:10095000E1008091E2008F7E8093E2008091E200CE +:1009600081608093E20080912502882311F481E068 +:1009700001C084E08EBBA4D18091E10083FF27C039 +:100980008091E20083FF23C08091E100877F809304 +:10099000E10082E08EBB109225028091E1008E7F03 +:1009A0008093E1008091E2008E7F8093E20080914D +:1009B000E20080618093E200AADD80E060E042E036 +:1009C00093DD8091F00088608093F00079D1809170 +:1009D000E10082FF0AC08091E20082FF06C08091A0 +:1009E000E1008B7F8093E1006BD1FF91EF91BF918C +:1009F000AF919F918F917F916F915F914F913F91B7 +:100A00002F910F900FBE0F901F9018951F93DF939B +:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D +:100A2000CDBFE7E2F2E08091F100819322E0EF3266 +:100A3000F207C9F78091270230912802353009F476 +:100A400087C0363040F43130C9F1313070F0333086 +:100A500009F01DC133C0383009F4EFC0393009F452 +:100A6000FEC0363009F013C192C0803821F08238C0 +:100A700009F00DC108C090912302809124028823BF +:100A800099F0926011C080912B0287708093E900E9 +:100A90008091EB0090E025E0969587952A95E1F707 +:100AA000982F91701092E9008091E800877F8093E1 +:100AB000E8009093F1001092F100CAC0882319F069 +:100AC000823009F0E4C090E08F719070009721F0BF +:100AD000029709F0DDC00CC080912902813009F035 +:100AE000D7C010922402333069F5809324022AC0C3 +:100AF00080912902882331F520912B02277009F477 +:100B0000C7C02093E9008091EB0080FFC1C0333063 +:100B100021F48091EB00806213C08091EB00806132 +:100B20008093EB0081E090E002C0880F991F2A9526 +:100B3000E2F78093EA001092EA008091EB0088606F +:100B40008093EB001092E9008091E800877F83C0DA +:100B5000882309F09CC0109129028091E800877FCA +:100B60008093E800E8DC04C08EB3882309F490C0C9 +:100B70008091E80080FFF8CF812F8F7711F492E009 +:100B800001C093E09EBB80688093E30081C08058E1 +:100B9000823008F07CC08091290290912A0223E0E3 +:100BA0008C3D920799F55FB7F894DE0115964EE0FB +:100BB00020E030E061E2E42FF0E0609357008491A0 +:100BC00020FF03C082958F704F5F982F9F70892FF1 +:100BD000805D8A3308F0895F8C9311961C9211977F +:100BE0002F5F3F4F12962431310529F75FBF8AE20C +:100BF0008B8383E08C838091E800877F8093E8007B +:100C0000CE0103966AE270E0E4DC11C060912B0231 +:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 +:100C2000E800877F8093E80089819A812BDD80919D +:100C3000E8008B778093E8002BC0803841F58091E5 +:100C4000E800877F8093E800809125028093F1007F +:100C50008091E8008E778093E8006DDC19C08823CE +:100C6000B1F490912902923098F48091E800877F46 +:100C70008093E800909325025EDC80912502882312 +:100C800011F483E001C084E08EBB2DDB01C028DBC2 +:100C90008091E80083FF0AC08091EB00806280931E +:100CA000EB008091E800877F8093E800AC960FB658 +:100CB000F894DEBF0FBECDBFCF91DF911F91089595 +:100CC00008951F938EB3882361F01091E90010926C +:100CD000E9008091E80083FF01C098DE177010934F +:100CE000E9001F9108950895FC018EB3843021F529 +:100CF00087859089A189B2890097A105B105E1F0A6 +:100D000085818093E9008091E80082FF15C0809181 +:100D1000F200882319F42FEF3FEF04C08091F10017 +:100D2000282F30E08091F200882341F48091E80080 +:100D30008B778093E80002C02FEF3FEFC901089541 +:100D4000FC018EB3843011F587859089A189B28921 +:100D50000097A105B105D1F081818093E9008091D0 +:100D6000F2008823A9F09091E8008091E8008E7746 +:100D70008093E80095FD0CC0FDDB982F882349F493 +:100D80008091E8008E778093E80003C092E001C074 +:100D900090E0892F0895FC018EB3843051F487854B +:100DA0009089A189B2890097A105B10511F0CF0101 +:100DB000C7CF08951F93FC01162F8EB38430D9F44A +:100DC00087859089A189B2890097A105B10599F01D +:100DD00081818093E9008091E80085FD08C08091C1 +:100DE000E8008E778093E800C5DB882329F4109310 +:100DF000F10080E001C082E01F9108950F931F93DE +:100E0000CF93DF93EC010D96FC0189E0DF011D9289 +:100E10008A95E9F72A813B8109818C81882311F425 +:100E200010E001C014E0C90151DB182B1260802FC3 +:100E300061E8412F59DB882329F12E813F810D8103 +:100E40008885882311F410E001C014E0C9013EDB5D +:100E5000182B1260802F60E8412F46DB882391F029 +:100E60002A853B8509858C85882311F410E001C013 +:100E700014E0C9012BDB182B1260802F61EC412F8D +:100E800033DB01C080E0DF91CF911F910F91089576 +:100E9000CF93DF93EC018091E80083FF60C08881ED +:100EA00090E020912B0230912C022817390709F08D +:100EB00056C080912802813261F0823220F4803263 +:100EC00009F04DC019C0823269F1833209F047C080 +:100ED00038C080912702813A09F041C08091E80032 +:100EE000877F8093E800CE010F9667E070E071DBAA +:100EF0008091E8008B7713C080912702813279F5C9 +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E013DCCE013ED98091E8008E7780939B +:100F2000E8001DC0809127028132C9F48091E80059 +:100F3000877F8093E800809129028D87CE01C8D9F0 +:100F40000DC080912702813251F48091E800877FA3 +:100F50008093E800CE0160912902C5DEECDADF91D2 +:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 +:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 +:100F800020F0A21BB30BE40BF50B661F771F881F25 +:100F9000991F1A9469F760957095809590959B01BB +:0C0FA000AC01BD01CF010895F894FFCF13 +:100FAC0000034000000440000002080000000000A4 +:060FBC000000000000002F +:103000004BC0000064C0000062C0000060C000004F +:103010005EC000005CC000005AC0000058C0000044 +:1030200056C0000054C0000052C00000EEC40000B2 +:103030004EC000004CC000004AC0000048C0000064 +:1030400046C0000044C0000042C0000040C0000074 +:103050003EC000003CC000003AC0000038C0000084 +:1030600036C0000034C0000032C0000030C0000094 +:103070002EC000002CC000002AC0000028C00000A4 +:1030800026C0000024C0000022C0000020C00000B4 +:103090001EC000001CC0000011241FBECFEFD2E0F4 +:1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B +:1030B00005900D92AA33B107D9F711E0AAE3B1E068 +:1030C00001C01D92AB35B107E1F772D314C698CF9A +:1030D000982F15C08091F200882371F48091E80048 +:1030E0008B7F8093E80003C08EB3882351F08091DA +:1030F000E80082FFF9CF02C08091F100915099233E +:1031000049F7089520914A01309149018091480181 +:103110009091470180933F0190934001C9018093B2 +:103120004101909342010895DF93CF9300D000D0E6 +:1031300000D0CDB7DEB780914501843009F45AC084 +:10314000853030F4813059F0833009F0D7C01FC08A +:10315000853009F4A0C0863009F0D0C0C3C080918A +:103160004601823008F0CAC0CDDF80914601882335 +:1031700061F480913F019091400123E0FC01209394 +:103180005700E89507B600FCFDCF85E008C08091A8 +:103190004601882311F0823029F4B4DF89E080935E +:1031A0000101ACC0813009F0A9C020E030E040E06E +:1031B00050E0F90184918F3F81F0CA01AA27BB2713 +:1031C00080933E013093400120933F018AE0809339 +:1031D000010185E080933B0191C02F5F3F4F4F4F2E +:1031E0005F4F2030F0E33F07F0E04F07F0E05F076C +:1031F00001F784C080914601833051F581E08093CE +:103200003A0180914B0190914C01892B71F0809192 +:103210004701813009F072C080914A0190914901C3 +:1032200090933D0180933C0169C0809147018823C0 +:1032300061F42CE088E190E00FB6F894A8958093B3 +:1032400060000FBE2093600059C01092000156C06C +:10325000882309F053C0809147018F3F09F04EC089 +:10326000E0E0F0E093E085E090935700E89507B642 +:1032700000FCFDCF80935700E89507B600FCFDCF1A +:10328000E058FF4F20E3E030F20771F781E18093CF +:103290005700E89533C0DE011196E5E0F1E083E0E8 +:1032A00001900D928150E1F7DE011496E2E0F1E029 +:1032B00083E001900D928150E1F790914701809158 +:1032C0004601882329F4FE01E90FF11D818107C021 +:1032D0008130A1F4FE01BC97E90FF11D808180933C +:1032E00050010CC080914601833041F48091470128 +:1032F000882321F48091480180933E0126960FB6E1 +:10330000F894DEBF0FBECDBFCF91DF9108952F920D +:103310003F924F925F926F927F929F92AF92BF9235 +:10332000CF92DF92EF92FF920F931F93CF93DF9391 +:103330008091590190915A0190934C0180934B01D7 +:1033400080914D01882351F080914D0181508093EF +:103350004D0180914D01882309F45D9A80914E01C1 +:10336000882351F080914E01815080934E018091CD +:103370004E01882309F45C9A80915401833009F44A +:10338000B2C1843030F4813071F0823009F0E3C191 +:1033900011C1853009F4C5C1853008F4BAC1863041 +:1033A00009F0D9C1CDC15C9883E080934E01809132 +:1033B000E800877F8093E80080913A01882329F014 +:1033C000B3DE5D9A5C9A10923A0120914B013091E4 +:1033D0004C012115310529F42AC08EB3882309F444 +:1033E000BAC18091E80082FFF8CF8091F10080930C +:1033F00045012150304030934C0120934B01E6E4CD +:10340000F1E00CC08091F10081932150304081E0C7 +:10341000EB34F80719F43183208308C08091F2005F +:10342000882381F730934C0120934B017DDE8091FE +:103430000101853009F0BAC080914B0190914C0197 +:10344000892B21F482E080930101B0C08AE140DE43 +:1034500080913F018F713CDEC0914101D0914201CA +:1034600020913F013091400121968E01021B130BE8 +:10347000219780914601882309F093C01801369462 +:103480002794C901A0913E01B0E09C01AD0162E02A +:10349000E62EF12C012D112DE20EF31E041F151F37 +:1034A00059016A0190E099249394B5E0A3E048C0E3 +:1034B0008091F200882371F48091E8008B7F8093E3 +:1034C000E80004C08EB3882309F445C18091E80068 +:1034D00082FFF8CF0894210831088091F100682F0D +:1034E0008091F100782FF5010B0190925700E8953B +:1034F00011249F5F903419F021143104A1F4F901D3 +:10350000B0935700E89507B600FCFDCF21143104B5 +:1035100051F0F701A0935700E89507B600FCFDCFE6 +:10352000A801970190E042E0442E512C612C712CAF +:10353000E40CF51C061D171DA40CB51CC61CD71CDD +:103540002114310409F0B4CFD0934001C0933F015E +:1035500081E180935700E89527C08091F20088238D +:1035600071F48091E8008B7F8093E80004C08EB3F3 +:10357000882309F4F0C08091E80082FFF8CF6091C1 +:10358000F10080913F0190914001A7D380913F01CC +:103590009091400101969093400180933F0101502A +:1035A000104001151105C9F680E192DD8091E80017 +:1035B0008B7FC3C08091E800877F8093E8005D988F +:1035C00083E080934D0104C08EB3882309F4C3C007 +:1035D0008091E80080FFF8CF80910101893091F05F +:1035E0008A3069F480914601813049F480913F012D +:1035F000909140018093F1009093F1009BC08091E5 +:10360000500196C0609141017091420120913F01AB +:10361000309140016F5F7F4F7B01E21AF30A6150E6 +:10362000704080914601882389F58701169507959A +:10363000C901A0913E01B0E09C01AD011FC0809185 +:10364000F200803271F48091E8008E7F8093E80070 +:1036500004C08EB3882309F47EC08091E80080FF07 +:10366000F8CFF901859194918093F1009093F10046 +:10367000015010402E5F3F4F4F4F5F4F0115110516 +:10368000F1F67093400160933F0129C0823039F513 +:1036900023C08091F200803271F48091E8008E7F27 +:1036A0008093E80004C08EB3882309F454C080914D +:1036B000E80080FFF8CF00913F0110914001C80160 +:1036C00004D38093F1000F5F1F4F109340010093CC +:1036D0003F010894E108F108E114F104D1F682E019 +:1036E0008093010127C08091E800877F8093E800E4 +:1036F00080913B018093F1001092F1001092F10053 +:103700001092F100809101018093F1001092F1007C +:1037100011C08091E800877F8093E80010923B0100 +:1037200019C08091E800877F8093E80080910101B3 +:103730008093F1008091E8008E7F8093E8000AC0BA +:103740008091E800877F8093E8005D9A5C9A82E030 +:103750008093010187D0DF91CF911F910F91FF904E +:10376000EF90DF90CF90BF90AF909F907F906F9041 +:103770005F904F903F902F9008952BD181E085BFAF +:1037800015BE089584B7877F84BF88E10FB6F8948B +:1037900080936000109260000FBE81E085BF82E0E0 +:1037A00085BF8AB180638AB98BB180638BB90CC144 +:1037B000E9DF789401C080D2809100018823D9F795 +:1037C00080913A018823B9F7D8DFE0913C01F0916C +:1037D0003D010995FA01923071F0933089F09130F2 +:1037E00029F488E091E022E130E019C080E090E027 +:1037F00020E030E014C08AE191E02BE130E00FC01E +:10380000882339F480913501282F30E085E391E059 +:1038100006C080914301282F30E083E491E091833A +:103820008083C90108958091EB0081608093EB0053 +:103830001092ED006093EC004093ED008091EE005B +:10384000881F8827881F08951092F4001092F000B6 +:103850001092E8001092ED00EBEEF0E080818E7F98 +:10386000808308958091530188238CF403C08EB324 +:103870008823B1F08091E80082FFF9CF8091E800C1 +:103880008B7F8093E80008958EB3882349F0809160 +:10389000E80080FFF9CF8091E8008E7F8093E800F8 +:1038A00008959C014091590150915A0146175707BC +:1038B00018F4F90120E038C06115710511F0AB0171 +:1038C000F8CF8091E8008E7F8093E80040E050E0E0 +:1038D000F0CF8091E80083FF02C081E008958091DD +:1038E000E80082FD2DC08EB3882381F18EB3853030 +:1038F00079F18091E80080FF17C09091F20006C036 +:1039000081918093F100415050409F5F41155105D6 +:1039100011F09032A8F320E0903209F421E0809178 +:10392000E8008E7F8093E8004115510591F622232F +:1039300081F606C08EB3882349F08EB3853041F0FE +:103940008091E80082FFF6CF80E0089582E008953C +:1039500083E0089554D056D01EBA1092510184E0ED +:1039600089BD89B5826089BD09B400FEFDCF809113 +:10397000D800982F9F779093D80080688093D800C4 +:10398000809163008E7F809363008091D8008F7D4B +:103990008093D8008091E0008E7F8093E00080913A +:1039A000E1008E7F8093E1008091E200816080934E +:1039B000E2008091E100877F8093E1008091E20046 +:1039C00088608093E2000895C5DF81E08093520112 +:1039D0000895C0DFE0EEF0E0808181608083E8ED53 +:1039E000F0E080818F7780830AD00CD019BCE3E6A9 +:1039F000F0E08081816080831092520108951092DE +:103A0000E20008951092E10008951F920F920FB600 +:103A10000F9211242F933F934F935F936F937F9354 +:103A20008F939F93AF93BF93EF93FF938091E100A8 +:103A300080FF1BC08091E20080FF17C08091E100F1 +:103A40008E7F8093E1008091E2008E7F8093E20080 +:103A50008091E20080618093E2008091D8008062D2 +:103A60008093D80019BC1EBA26D18091E10084FF52 +:103A700029C08091E20084FF25C084E089BD89B51A +:103A8000826089BD09B400FEFDCF8091D8008F7D92 +:103A90008093D8008091E1008F7E8093E100809137 +:103AA000E2008F7E8093E2008091E200816080934B +:103AB000E20080915101882311F481E001C084E08B +:103AC0008EBBF9D08091E10083FF22C08091E2009B +:103AD00083FF1EC08091E100877F8093E10082E038 +:103AE0008EBB109251018091E1008E7F8093E100A6 +:103AF0008091E2008E7F8093E2008091E2008061FD +:103B00008093E200A1DE80E060E042E28CDED3D070 +:103B10008091E10082FF0AC08091E20082FF06C02E +:103B20008091E1008B7F8093E100C5D0FF91EF9100 +:103B3000BF91AF919F918F917F916F915F914F91C5 +:103B40003F912F910F900FBE0F901F9018951F93CC +:103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE +:103B6000F100819381E0EB35F807C9F7909153019B +:103B700080915401853011F1863040F48130B9F0E4 +:103B8000813070F0833009F081C011C0883009F4B1 +:103B900053C0893009F462C0863009F077C02DC067 +:103BA000903809F474C0923809F070C070C099233D +:103BB00009F46DC0923009F069C069C0992309F019 +:103BC00065C0109155018091E800877F8093E800DF +:103BD00049DE04C08EB3882309F459C08091E800FF +:103BE00080FFF8CF812F8F7711F492E001C093E02E +:103BF0009EBB80688093E3004AC09058923008F0E2 +:103C000045C0809155019091560160915701AE01D8 +:103C10004F5F5F4FDFDDBC010097C9F18091E80085 +:103C2000877F8093E80089819A813BDE8091E8005C +:103C30008B7F8093E8002BC0903841F58091E8009D +:103C4000877F8093E800809151018093F1008091FB +:103C5000E8008E7F8093E80005DE19C09923B1F457 +:103C600090915501923098F48091E800877F80937D +:103C7000E80090935101F6DD80915101882311F401 +:103C800083E001C084E08EBB16D001C040DB809190 +:103C9000E80083FF0AC08091EB0080628093EB0014 +:103CA0008091E800877F8093E8000F900F90CF917C +:103CB000DF911F91089508958EB3882329F0809194 +:103CC000E80083FF01C043CF0895F999FECF92BD6C +:103CD00081BDF89A992780B50895262FF999FECFCE +:103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 +:0A3CF0000FBE01960895F894FFCF6F +:103CFA0001021E948920DCFB120110010000002041 +:103D0A00EB03EF2F00000001000109021B00010173 +:103D1A000080320904000000FE01020009210300AC +:0A3D2A0000000C000104030904006E +:0400000300003000C9 +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-MegaADK-Rev3.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-MegaADK-Rev3.hex index b47bdf66c9a..8b087b984fb 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-MegaADK-Rev3.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-MegaADK-Rev3.hex @@ -1,467 +1,467 @@ -:1000000090C00000A9C00000A7C00000A5C000006B -:10001000A3C00000A1C000009FC000009DC0000060 -:100020009BC0000099C0000097C0000048C40000B9 -:100030000CC4000091C000008FC000008DC0000003 -:100040008BC0000089C0000087C0000085C0000090 -:1000500083C0000081C000007FC0000002C100001A -:100060007BC0000079C0000077C0000075C00000B0 -:1000700073C0000071C000006FC000006DC00000C0 -:100080006BC0000069C0000067C0000065C00000D0 -:1000900063C0000061C000001201100102000008EE -:1000A0004123440001000102DC0109023E0002017B -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:10012000000011241FBECFEFD2E0DEBFCDBF11E033 -:10013000A0E0B1E0ECEAFFE002C005900D92A6312C -:10014000B107D9F712E0A6E1B1E001C01D92AF32CC -:10015000B107E1F7F1D028C753CF9C01DC01AE57BE -:10016000BF4FED91FC91119741911196FC93EE9345 -:1001700080589F4FE817F90711F42D933C939FB7D0 -:10018000F894F901EC57FF4F8081815080839FBF25 -:10019000842F0895DF92EF92FF920F931F93FC013B -:1001A0008489813019F0823021F405C040E3D42ED7 -:1001B00004C0DD2402C030E2D32E8389823011F4E2 -:1001C00088E0D82A8589873031F0883031F0863050 -:1001D00031F482E003C084E001C086E0D82A1092A6 -:1001E000C9001092C8001092CA00E784F088018903 -:1001F000128980E0E81681EEF80680E0080780E0CA -:10020000180719F420E130E00FC0C801B701969536 -:1002100087957795679560587B47814E9F4FA801DA -:100220009701A0D6215030403093CD002093CC00D0 -:10023000D092CA0080E0E81681EEF80680E0080758 -:1002400080E0180711F082E001C080E08093C800D0 -:1002500088E98093C9001F910F91FF90EF90DF9084 -:1002600008951F920F920FB60F9211242F938F9320 -:100270009F93EF93FF939091CE008EB38430F1F46F -:10028000E0919901F0919A019083E0919901F091A8 -:100290009A01CF01019690939A018093990189590F -:1002A000914021F489E191E0928381839FB7F89492 -:1002B00080919D018F5F80939D019FBFFF91EF9182 -:1002C0009F918F912F910F900FBE0F901F901895B7 -:1002D000FC01858580FF02C05F9808955F9A0895AC -:1002E00080E091E0D5C580E091E088C584B7877F44 -:1002F00084BF28E10FB6F89420936000109260004C -:100300000FBE87E690E09093CD008093CC0086E00E -:100310008093CA001092C8002093C900539A5A9A39 -:100320008AB180638AB98BB180638BB983D284E050 -:1003300085BD5F9A579A08950F931F93CF93DF93CC -:10034000D5DF2FB7F8948EE991E090931F02809348 -:100350001E0290932102809320022FBF2FB7F894A2 -:1003600089E191E090939A018093990190939C0187 -:1003700080939B012FBF7894CEE9D1E003E08FB743 -:10038000F894909122028FBF903809F180E091E0BB -:10039000ABD497FD1CC0E0911E02F0911F02808338 -:1003A000E0911E02F0911F02CF01019690931F026F -:1003B00080931E028E51924011F4D283C1839FB765 -:1003C000F894809122028F5F809322029FBF8FB7A3 -:1003D000F89410919D018FBFA89902C0113678F151 -:1003E000A89A80919D01882361F05D980093160181 -:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 -:1004000011501123B1F780911601882351F080918A -:10041000160181508093160180911601882309F4FA -:100420005D9A80911701882351F0809117018150C6 -:100430008093170180911701882309F45C9A8FB784 -:10044000F894909122028FBF992369F08EE991E090 -:1004500084DE982F8091C80085FFFCCF9093CE005A -:100460005C980093170180E091E095D42AD487CF5F -:10047000DA01923049F0933061F09130F9F4E8E913 -:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 -:1004900019C0813049F0813018F0823079F408C0F9 -:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 -:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 -:1004C00020E030E0ED93FC93C901089528E030E08E -:1004D00040E003C04F5F220F331F28173907D0F3C6 -:1004E000842F8295807F08958093E9008091EB00AE -:1004F00081608093EB001092ED006093EC004093DC -:10050000ED008091EE00881F8827881F08951092C3 -:10051000F40090E09093E9001092F0001092E8004F -:100520001092ED008091EB008E7F8093EB009F5F37 -:10053000953081F708958091270288238CF403C0B9 -:100540008EB38823B1F08091E80082FFF9CF8091CB -:10055000E8008B778093E80008958EB3882349F0F4 -:100560008091E80080FFF9CF8091E8008E7780933A -:10057000E800089594E68091EC0080FF05C080912A -:10058000E80080FF05C023C08091E80082FD1FC005 -:100590008EB3882311F482E008958EB3853011F470 -:1005A00083E008958091EB0085FF02C081E008950B -:1005B0008091E10082FFDFCF8091E1008B7F80930B -:1005C000E100992311F484E008959150D4CF80E0A4 -:1005D00008959C0140912D0250912E024617570715 -:1005E00018F4F90120E038C06115710511F0AB0174 -:1005F000F8CF8091E8008E778093E80040E050E0EB -:10060000F0CF8091E80083FF02C081E008958091DF -:10061000E80082FD2DC08EB3882381F18EB3853032 -:1006200079F18091E80080FF17C09091F20006C038 -:1006300081918093F100415050409F5F41155105D9 -:1006400011F09830A8F320E0983009F421E080916F -:10065000E8008E778093E8004115510591F622233A -:1006600081F606C08EB3882349F08EB3853041F001 -:100670008091E80082FFF6CF80E0089582E008953F -:1006800083E008959C0140912D0250912E0246175F -:10069000570710F490E03BC06115710511F0AB01F4 -:1006A000F9CF8091E8008E778093E80040E050E039 -:1006B000F1CF8091E80083FF02C081E0089580912E -:1006C000E80082FD30C08EB3882399F18EB3853067 -:1006D00091F18091E80080FF1AC08091F20009C07A -:1006E000F9012F5F3F4FE491E093F10041505040FA -:1006F0008F5F4115510511F0883090F390E08830FC -:1007000009F491E08091E8008E778093E80041152C -:10071000510579F6992369F606C08EB3882349F00E -:100720008EB3853041F08091E80082FFF6CF80E003 -:10073000089582E0089583E008959C016115710594 -:1007400029F48091E8008B778093E800F90120C0BC -:100750008091E80083FF02C081E008958EB3882372 -:1007600039F18EB3853031F18091E80082FFF0CF0E -:1007700006C08091F10081936150704021F080911A -:10078000F2008823B1F78091E8008B778093E8002E -:1007900061157105E9F606C08EB3882349F08EB362 -:1007A000853041F08091E80080FFF6CF80E0089529 -:1007B00082E0089583E0089542D044D01EBA10929A -:1007C0002502109224021092230284E089BD89B58B -:1007D000826089BD09B400FEFDCF8091D800982FBA -:1007E0009F779093D80080688093D80080916300B1 -:1007F0008E7F809363008091D8008F7D8093D80096 -:100800008091E0008E7F8093E0008091E1008E7FF8 -:100810008093E1008091E20081608093E20080910A -:10082000E100877F8093E1008091E20088608093FF -:10083000E2000895C1DF81E08093260208951092BE -:10084000E20008951092E10008951F920F920FB6F2 -:100850000F9211241F932F933F934F935F936F93A6 -:100860007F938F939F93AF93BF93EF93FF93E9EEA3 -:10087000F0E0108117701082E0EFF0E08081877F58 -:1008800080837894C3D0F894A9EEB0E01C92E0EF96 -:10089000F0E08081886080831C93FF91EF91BF918D -:1008A000AF919F918F917F916F915F914F913F9108 -:1008B0002F911F910F900FBE0F901F9018951F92B0 -:1008C0000F920FB60F9211242F933F934F935F9384 -:1008D0006F937F938F939F93AF93BF93EF93FF9308 -:1008E0008091E10080FF1BC08091E20080FF17C073 -:1008F0008091E1008E7F8093E1008091E2008E7F05 -:100900008093E2008091E20080618093E200809118 -:10091000D80080628093D80019BC1EBAD1D18091D2 -:10092000E10084FF29C08091E20084FF25C084E0BB -:1009300089BD89B5826089BD09B400FEFDCF809173 -:10094000D8008F7D8093D8008091E1008F7E8093C6 -:10095000E1008091E2008F7E8093E2008091E200CE -:1009600081608093E20080912502882311F481E068 -:1009700001C084E08EBBA4D18091E10083FF27C039 -:100980008091E20083FF23C08091E100877F809304 -:10099000E10082E08EBB109225028091E1008E7F03 -:1009A0008093E1008091E2008E7F8093E20080914D -:1009B000E20080618093E200AADD80E060E042E036 -:1009C00093DD8091F00088608093F00079D1809170 -:1009D000E10082FF0AC08091E20082FF06C08091A0 -:1009E000E1008B7F8093E1006BD1FF91EF91BF918C -:1009F000AF919F918F917F916F915F914F913F91B7 -:100A00002F910F900FBE0F901F9018951F93DF939B -:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D -:100A2000CDBFE7E2F2E08091F100819322E0EF3266 -:100A3000F207C9F78091270230912802353009F476 -:100A400087C0363040F43130C9F1313070F0333086 -:100A500009F01DC133C0383009F4EFC0393009F452 -:100A6000FEC0363009F013C192C0803821F08238C0 -:100A700009F00DC108C090912302809124028823BF -:100A800099F0926011C080912B0287708093E900E9 -:100A90008091EB0090E025E0969587952A95E1F707 -:100AA000982F91701092E9008091E800877F8093E1 -:100AB000E8009093F1001092F100CAC0882319F069 -:100AC000823009F0E4C090E08F719070009721F0BF -:100AD000029709F0DDC00CC080912902813009F035 -:100AE000D7C010922402333069F5809324022AC0C3 -:100AF00080912902882331F520912B02277009F477 -:100B0000C7C02093E9008091EB0080FFC1C0333063 -:100B100021F48091EB00806213C08091EB00806132 -:100B20008093EB0081E090E002C0880F991F2A9526 -:100B3000E2F78093EA001092EA008091EB0088606F -:100B40008093EB001092E9008091E800877F83C0DA -:100B5000882309F09CC0109129028091E800877FCA -:100B60008093E800E8DC04C08EB3882309F490C0C9 -:100B70008091E80080FFF8CF812F8F7711F492E009 -:100B800001C093E09EBB80688093E30081C08058E1 -:100B9000823008F07CC08091290290912A0223E0E3 -:100BA0008C3D920799F55FB7F894DE0115964EE0FB -:100BB00020E030E061E2E42FF0E0609357008491A0 -:100BC00020FF03C082958F704F5F982F9F70892FF1 -:100BD000805D8A3308F0895F8C9311961C9211977F -:100BE0002F5F3F4F12962431310529F75FBF8AE20C -:100BF0008B8383E08C838091E800877F8093E8007B -:100C0000CE0103966AE270E0E4DC11C060912B0231 -:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 -:100C2000E800877F8093E80089819A812BDD80919D -:100C3000E8008B778093E8002BC0803841F58091E5 -:100C4000E800877F8093E800809125028093F1007F -:100C50008091E8008E778093E8006DDC19C08823CE -:100C6000B1F490912902923098F48091E800877F46 -:100C70008093E800909325025EDC80912502882312 -:100C800011F483E001C084E08EBB2DDB01C028DBC2 -:100C90008091E80083FF0AC08091EB00806280931E -:100CA000EB008091E800877F8093E800AC960FB658 -:100CB000F894DEBF0FBECDBFCF91DF911F91089595 -:100CC00008951F938EB3882361F01091E90010926C -:100CD000E9008091E80083FF01C098DE177010934F -:100CE000E9001F9108950895FC018EB3843021F529 -:100CF00087859089A189B2890097A105B105E1F0A6 -:100D000085818093E9008091E80082FF15C0809181 -:100D1000F200882319F42FEF3FEF04C08091F10017 -:100D2000282F30E08091F200882341F48091E80080 -:100D30008B778093E80002C02FEF3FEFC901089541 -:100D4000FC018EB3843011F587859089A189B28921 -:100D50000097A105B105D1F081818093E9008091D0 -:100D6000F2008823A9F09091E8008091E8008E7746 -:100D70008093E80095FD0CC0FDDB982F882349F493 -:100D80008091E8008E778093E80003C092E001C074 -:100D900090E0892F0895FC018EB3843051F487854B -:100DA0009089A189B2890097A105B10511F0CF0101 -:100DB000C7CF08951F93FC01162F8EB38430D9F44A -:100DC00087859089A189B2890097A105B10599F01D -:100DD00081818093E9008091E80085FD08C08091C1 -:100DE000E8008E778093E800C5DB882329F4109310 -:100DF000F10080E001C082E01F9108950F931F93DE -:100E0000CF93DF93EC010D96FC0189E0DF011D9289 -:100E10008A95E9F72A813B8109818C81882311F425 -:100E200010E001C014E0C90151DB182B1260802FC3 -:100E300061E8412F59DB882329F12E813F810D8103 -:100E40008885882311F410E001C014E0C9013EDB5D -:100E5000182B1260802F60E8412F46DB882391F029 -:100E60002A853B8509858C85882311F410E001C013 -:100E700014E0C9012BDB182B1260802F61EC412F8D -:100E800033DB01C080E0DF91CF911F910F91089576 -:100E9000CF93DF93EC018091E80083FF60C08881ED -:100EA00090E020912B0230912C022817390709F08D -:100EB00056C080912802813261F0823220F4803263 -:100EC00009F04DC019C0823269F1833209F047C080 -:100ED00038C080912702813A09F041C08091E80032 -:100EE000877F8093E800CE010F9667E070E071DBAA -:100EF0008091E8008B7713C080912702813279F5C9 -:100F00008091E800877F8093E800CE010F9667E02C -:100F100070E013DCCE013ED98091E8008E7780939B -:100F2000E8001DC0809127028132C9F48091E80059 -:100F3000877F8093E800809129028D87CE01C8D9F0 -:100F40000DC080912702813251F48091E800877FA3 -:100F50008093E800CE0160912902C5DEECDADF91D2 -:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 -:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 -:100F800020F0A21BB30BE40BF50B661F771F881F25 -:100F9000991F1A9469F760957095809590959B01BB -:0C0FA000AC01BD01CF010895F894FFCF13 -:100FAC0000034000000440000002080000000000A4 -:060FBC000000000000002F -:103000004BC0000064C0000062C0000060C000004F -:103010005EC000005CC000005AC0000058C0000044 -:1030200056C0000054C0000052C00000EEC40000B2 -:103030004EC000004CC000004AC0000048C0000064 -:1030400046C0000044C0000042C0000040C0000074 -:103050003EC000003CC000003AC0000038C0000084 -:1030600036C0000034C0000032C0000030C0000094 -:103070002EC000002CC000002AC0000028C00000A4 -:1030800026C0000024C0000022C0000020C00000B4 -:103090001EC000001CC0000011241FBECFEFD2E0F4 -:1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B -:1030B00005900D92AA33B107D9F711E0AAE3B1E068 -:1030C00001C01D92AB35B107E1F772D314C698CF9A -:1030D000982F15C08091F200882371F48091E80048 -:1030E0008B7F8093E80003C08EB3882351F08091DA -:1030F000E80082FFF9CF02C08091F100915099233E -:1031000049F7089520914A01309149018091480181 -:103110009091470180933F0190934001C9018093B2 -:103120004101909342010895DF93CF9300D000D0E6 -:1031300000D0CDB7DEB780914501843009F45AC084 -:10314000853030F4813059F0833009F0D7C01FC08A -:10315000853009F4A0C0863009F0D0C0C3C080918A -:103160004601823008F0CAC0CDDF80914601882335 -:1031700061F480913F019091400123E0FC01209394 -:103180005700E89507B600FCFDCF85E008C08091A8 -:103190004601882311F0823029F4B4DF89E080935E -:1031A0000101ACC0813009F0A9C020E030E040E06E -:1031B00050E0F90184918F3F81F0CA01AA27BB2713 -:1031C00080933E013093400120933F018AE0809339 -:1031D000010185E080933B0191C02F5F3F4F4F4F2E -:1031E0005F4F2030F0E33F07F0E04F07F0E05F076C -:1031F00001F784C080914601833051F581E08093CE -:103200003A0180914B0190914C01892B71F0809192 -:103210004701813009F072C080914A0190914901C3 -:1032200090933D0180933C0169C0809147018823C0 -:1032300061F42CE088E190E00FB6F894A8958093B3 -:1032400060000FBE2093600059C01092000156C06C -:10325000882309F053C0809147018F3F09F04EC089 -:10326000E0E0F0E093E085E090935700E89507B642 -:1032700000FCFDCF80935700E89507B600FCFDCF1A -:10328000E058FF4F20E3E030F20771F781E18093CF -:103290005700E89533C0DE011196E5E0F1E083E0E8 -:1032A00001900D928150E1F7DE011496E2E0F1E029 -:1032B00083E001900D928150E1F790914701809158 -:1032C0004601882329F4FE01E90FF11D818107C021 -:1032D0008130A1F4FE01BC97E90FF11D808180933C -:1032E00050010CC080914601833041F48091470128 -:1032F000882321F48091480180933E0126960FB6E1 -:10330000F894DEBF0FBECDBFCF91DF9108952F920D -:103310003F924F925F926F927F929F92AF92BF9235 -:10332000CF92DF92EF92FF920F931F93CF93DF9391 -:103330008091590190915A0190934C0180934B01D7 -:1033400080914D01882351F080914D0181508093EF -:103350004D0180914D01882309F45D9A80914E01C1 -:10336000882351F080914E01815080934E018091CD -:103370004E01882309F45C9A80915401833009F44A -:10338000B2C1843030F4813071F0823009F0E3C191 -:1033900011C1853009F4C5C1853008F4BAC1863041 -:1033A00009F0D9C1CDC15C9883E080934E01809132 -:1033B000E800877F8093E80080913A01882329F014 -:1033C000B3DE5D9A5C9A10923A0120914B013091E4 -:1033D0004C012115310529F42AC08EB3882309F444 -:1033E000BAC18091E80082FFF8CF8091F10080930C -:1033F00045012150304030934C0120934B01E6E4CD -:10340000F1E00CC08091F10081932150304081E0C7 -:10341000EB34F80719F43183208308C08091F2005F -:10342000882381F730934C0120934B017DDE8091FE -:103430000101853009F0BAC080914B0190914C0197 -:10344000892B21F482E080930101B0C08AE140DE43 -:1034500080913F018F713CDEC0914101D0914201CA -:1034600020913F013091400121968E01021B130BE8 -:10347000219780914601882309F093C01801369462 -:103480002794C901A0913E01B0E09C01AD0162E02A -:10349000E62EF12C012D112DE20EF31E041F151F37 -:1034A00059016A0190E099249394B5E0A3E048C0E3 -:1034B0008091F200882371F48091E8008B7F8093E3 -:1034C000E80004C08EB3882309F445C18091E80068 -:1034D00082FFF8CF0894210831088091F100682F0D -:1034E0008091F100782FF5010B0190925700E8953B -:1034F00011249F5F903419F021143104A1F4F901D3 -:10350000B0935700E89507B600FCFDCF21143104B5 -:1035100051F0F701A0935700E89507B600FCFDCFE6 -:10352000A801970190E042E0442E512C612C712CAF -:10353000E40CF51C061D171DA40CB51CC61CD71CDD -:103540002114310409F0B4CFD0934001C0933F015E -:1035500081E180935700E89527C08091F20088238D -:1035600071F48091E8008B7F8093E80004C08EB3F3 -:10357000882309F4F0C08091E80082FFF8CF6091C1 -:10358000F10080913F0190914001A7D380913F01CC -:103590009091400101969093400180933F0101502A -:1035A000104001151105C9F680E192DD8091E80017 -:1035B0008B7FC3C08091E800877F8093E8005D988F -:1035C00083E080934D0104C08EB3882309F4C3C007 -:1035D0008091E80080FFF8CF80910101893091F05F -:1035E0008A3069F480914601813049F480913F012D -:1035F000909140018093F1009093F1009BC08091E5 -:10360000500196C0609141017091420120913F01AB -:10361000309140016F5F7F4F7B01E21AF30A6150E6 -:10362000704080914601882389F58701169507959A -:10363000C901A0913E01B0E09C01AD011FC0809185 -:10364000F200803271F48091E8008E7F8093E80070 -:1036500004C08EB3882309F47EC08091E80080FF07 -:10366000F8CFF901859194918093F1009093F10046 -:10367000015010402E5F3F4F4F4F5F4F0115110516 -:10368000F1F67093400160933F0129C0823039F513 -:1036900023C08091F200803271F48091E8008E7F27 -:1036A0008093E80004C08EB3882309F454C080914D -:1036B000E80080FFF8CF00913F0110914001C80160 -:1036C00004D38093F1000F5F1F4F109340010093CC -:1036D0003F010894E108F108E114F104D1F682E019 -:1036E0008093010127C08091E800877F8093E800E4 -:1036F00080913B018093F1001092F1001092F10053 -:103700001092F100809101018093F1001092F1007C -:1037100011C08091E800877F8093E80010923B0100 -:1037200019C08091E800877F8093E80080910101B3 -:103730008093F1008091E8008E7F8093E8000AC0BA -:103740008091E800877F8093E8005D9A5C9A82E030 -:103750008093010187D0DF91CF911F910F91FF904E -:10376000EF90DF90CF90BF90AF909F907F906F9041 -:103770005F904F903F902F9008952BD181E085BFAF -:1037800015BE089584B7877F84BF88E10FB6F8948B -:1037900080936000109260000FBE81E085BF82E0E0 -:1037A00085BF8AB180638AB98BB180638BB90CC144 -:1037B000E9DF789401C080D2809100018823D9F795 -:1037C00080913A018823B9F7D8DFE0913C01F0916C -:1037D0003D010995FA01923071F0933089F09130F2 -:1037E00029F488E091E022E130E019C080E090E027 -:1037F00020E030E014C08AE191E02BE130E00FC01E -:10380000882339F480913501282F30E085E391E059 -:1038100006C080914301282F30E083E491E091833A -:103820008083C90108958091EB0081608093EB0053 -:103830001092ED006093EC004093ED008091EE005B -:10384000881F8827881F08951092F4001092F000B6 -:103850001092E8001092ED00EBEEF0E080818E7F98 -:10386000808308958091530188238CF403C08EB324 -:103870008823B1F08091E80082FFF9CF8091E800C1 -:103880008B7F8093E80008958EB3882349F0809160 -:10389000E80080FFF9CF8091E8008E7F8093E800F8 -:1038A00008959C014091590150915A0146175707BC -:1038B00018F4F90120E038C06115710511F0AB0171 -:1038C000F8CF8091E8008E7F8093E80040E050E0E0 -:1038D000F0CF8091E80083FF02C081E008958091DD -:1038E000E80082FD2DC08EB3882381F18EB3853030 -:1038F00079F18091E80080FF17C09091F20006C036 -:1039000081918093F100415050409F5F41155105D6 -:1039100011F09032A8F320E0903209F421E0809178 -:10392000E8008E7F8093E8004115510591F622232F -:1039300081F606C08EB3882349F08EB3853041F0FE -:103940008091E80082FFF6CF80E0089582E008953C -:1039500083E0089554D056D01EBA1092510184E0ED -:1039600089BD89B5826089BD09B400FEFDCF809113 -:10397000D800982F9F779093D80080688093D800C4 -:10398000809163008E7F809363008091D8008F7D4B -:103990008093D8008091E0008E7F8093E00080913A -:1039A000E1008E7F8093E1008091E200816080934E -:1039B000E2008091E100877F8093E1008091E20046 -:1039C00088608093E2000895C5DF81E08093520112 -:1039D0000895C0DFE0EEF0E0808181608083E8ED53 -:1039E000F0E080818F7780830AD00CD019BCE3E6A9 -:1039F000F0E08081816080831092520108951092DE -:103A0000E20008951092E10008951F920F920FB600 -:103A10000F9211242F933F934F935F936F937F9354 -:103A20008F939F93AF93BF93EF93FF938091E100A8 -:103A300080FF1BC08091E20080FF17C08091E100F1 -:103A40008E7F8093E1008091E2008E7F8093E20080 -:103A50008091E20080618093E2008091D8008062D2 -:103A60008093D80019BC1EBA26D18091E10084FF52 -:103A700029C08091E20084FF25C084E089BD89B51A -:103A8000826089BD09B400FEFDCF8091D8008F7D92 -:103A90008093D8008091E1008F7E8093E100809137 -:103AA000E2008F7E8093E2008091E200816080934B -:103AB000E20080915101882311F481E001C084E08B -:103AC0008EBBF9D08091E10083FF22C08091E2009B -:103AD00083FF1EC08091E100877F8093E10082E038 -:103AE0008EBB109251018091E1008E7F8093E100A6 -:103AF0008091E2008E7F8093E2008091E2008061FD -:103B00008093E200A1DE80E060E042E28CDED3D070 -:103B10008091E10082FF0AC08091E20082FF06C02E -:103B20008091E1008B7F8093E100C5D0FF91EF9100 -:103B3000BF91AF919F918F917F916F915F914F91C5 -:103B40003F912F910F900FBE0F901F9018951F93CC -:103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE -:103B6000F100819381E0EB35F807C9F7909153019B -:103B700080915401853011F1863040F48130B9F0E4 -:103B8000813070F0833009F081C011C0883009F4B1 -:103B900053C0893009F462C0863009F077C02DC067 -:103BA000903809F474C0923809F070C070C099233D -:103BB00009F46DC0923009F069C069C0992309F019 -:103BC00065C0109155018091E800877F8093E800DF -:103BD00049DE04C08EB3882309F459C08091E800FF -:103BE00080FFF8CF812F8F7711F492E001C093E02E -:103BF0009EBB80688093E3004AC09058923008F0E2 -:103C000045C0809155019091560160915701AE01D8 -:103C10004F5F5F4FDFDDBC010097C9F18091E80085 -:103C2000877F8093E80089819A813BDE8091E8005C -:103C30008B7F8093E8002BC0903841F58091E8009D -:103C4000877F8093E800809151018093F1008091FB -:103C5000E8008E7F8093E80005DE19C09923B1F457 -:103C600090915501923098F48091E800877F80937D -:103C7000E80090935101F6DD80915101882311F401 -:103C800083E001C084E08EBB16D001C040DB809190 -:103C9000E80083FF0AC08091EB0080628093EB0014 -:103CA0008091E800877F8093E8000F900F90CF917C -:103CB000DF911F91089508958EB3882329F0809194 -:103CC000E80083FF01C043CF0895F999FECF92BD6C -:103CD00081BDF89A992780B50895262FF999FECFCE -:103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 -:0A3CF0000FBE01960895F894FFCF6F -:103CFA0001021E948920DCFB120110010000002041 -:103D0A00EB03EF2F00000001000109021B00010173 -:103D1A000080320904000000FE01020009210300AC -:0A3D2A0000000C000104030904006E -:0400000300003000C9 -:00000001FF +:1000000090C00000A9C00000A7C00000A5C000006B +:10001000A3C00000A1C000009FC000009DC0000060 +:100020009BC0000099C0000097C0000048C40000B9 +:100030000CC4000091C000008FC000008DC0000003 +:100040008BC0000089C0000087C0000085C0000090 +:1000500083C0000081C000007FC0000002C100001A +:100060007BC0000079C0000077C0000075C00000B0 +:1000700073C0000071C000006FC000006DC00000C0 +:100080006BC0000069C0000067C0000065C00000D0 +:1000900063C0000061C000001201100102000008EE +:1000A0004123440001000102DC0109023E0002017B +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:10012000000011241FBECFEFD2E0DEBFCDBF11E033 +:10013000A0E0B1E0ECEAFFE002C005900D92A6312C +:10014000B107D9F712E0A6E1B1E001C01D92AF32CC +:10015000B107E1F7F1D028C753CF9C01DC01AE57BE +:10016000BF4FED91FC91119741911196FC93EE9345 +:1001700080589F4FE817F90711F42D933C939FB7D0 +:10018000F894F901EC57FF4F8081815080839FBF25 +:10019000842F0895DF92EF92FF920F931F93FC013B +:1001A0008489813019F0823021F405C040E3D42ED7 +:1001B00004C0DD2402C030E2D32E8389823011F4E2 +:1001C00088E0D82A8589873031F0883031F0863050 +:1001D00031F482E003C084E001C086E0D82A1092A6 +:1001E000C9001092C8001092CA00E784F088018903 +:1001F000128980E0E81681EEF80680E0080780E0CA +:10020000180719F420E130E00FC0C801B701969536 +:1002100087957795679560587B47814E9F4FA801DA +:100220009701A0D6215030403093CD002093CC00D0 +:10023000D092CA0080E0E81681EEF80680E0080758 +:1002400080E0180711F082E001C080E08093C800D0 +:1002500088E98093C9001F910F91FF90EF90DF9084 +:1002600008951F920F920FB60F9211242F938F9320 +:100270009F93EF93FF939091CE008EB38430F1F46F +:10028000E0919901F0919A019083E0919901F091A8 +:100290009A01CF01019690939A018093990189590F +:1002A000914021F489E191E0928381839FB7F89492 +:1002B00080919D018F5F80939D019FBFFF91EF9182 +:1002C0009F918F912F910F900FBE0F901F901895B7 +:1002D000FC01858580FF02C05F9808955F9A0895AC +:1002E00080E091E0D5C580E091E088C584B7877F44 +:1002F00084BF28E10FB6F89420936000109260004C +:100300000FBE87E690E09093CD008093CC0086E00E +:100310008093CA001092C8002093C900539A5A9A39 +:100320008AB180638AB98BB180638BB983D284E050 +:1003300085BD5F9A579A08950F931F93CF93DF93CC +:10034000D5DF2FB7F8948EE991E090931F02809348 +:100350001E0290932102809320022FBF2FB7F894A2 +:1003600089E191E090939A018093990190939C0187 +:1003700080939B012FBF7894CEE9D1E003E08FB743 +:10038000F894909122028FBF903809F180E091E0BB +:10039000ABD497FD1CC0E0911E02F0911F02808338 +:1003A000E0911E02F0911F02CF01019690931F026F +:1003B00080931E028E51924011F4D283C1839FB765 +:1003C000F894809122028F5F809322029FBF8FB7A3 +:1003D000F89410919D018FBFA89902C0113678F151 +:1003E000A89A80919D01882361F05D980093160181 +:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 +:1004000011501123B1F780911601882351F080918A +:10041000160181508093160180911601882309F4FA +:100420005D9A80911701882351F0809117018150C6 +:100430008093170180911701882309F45C9A8FB784 +:10044000F894909122028FBF992369F08EE991E090 +:1004500084DE982F8091C80085FFFCCF9093CE005A +:100460005C980093170180E091E095D42AD487CF5F +:10047000DA01923049F0933061F09130F9F4E8E913 +:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 +:1004900019C0813049F0813018F0823079F408C0F9 +:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 +:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 +:1004C00020E030E0ED93FC93C901089528E030E08E +:1004D00040E003C04F5F220F331F28173907D0F3C6 +:1004E000842F8295807F08958093E9008091EB00AE +:1004F00081608093EB001092ED006093EC004093DC +:10050000ED008091EE00881F8827881F08951092C3 +:10051000F40090E09093E9001092F0001092E8004F +:100520001092ED008091EB008E7F8093EB009F5F37 +:10053000953081F708958091270288238CF403C0B9 +:100540008EB38823B1F08091E80082FFF9CF8091CB +:10055000E8008B778093E80008958EB3882349F0F4 +:100560008091E80080FFF9CF8091E8008E7780933A +:10057000E800089594E68091EC0080FF05C080912A +:10058000E80080FF05C023C08091E80082FD1FC005 +:100590008EB3882311F482E008958EB3853011F470 +:1005A00083E008958091EB0085FF02C081E008950B +:1005B0008091E10082FFDFCF8091E1008B7F80930B +:1005C000E100992311F484E008959150D4CF80E0A4 +:1005D00008959C0140912D0250912E024617570715 +:1005E00018F4F90120E038C06115710511F0AB0174 +:1005F000F8CF8091E8008E778093E80040E050E0EB +:10060000F0CF8091E80083FF02C081E008958091DF +:10061000E80082FD2DC08EB3882381F18EB3853032 +:1006200079F18091E80080FF17C09091F20006C038 +:1006300081918093F100415050409F5F41155105D9 +:1006400011F09830A8F320E0983009F421E080916F +:10065000E8008E778093E8004115510591F622233A +:1006600081F606C08EB3882349F08EB3853041F001 +:100670008091E80082FFF6CF80E0089582E008953F +:1006800083E008959C0140912D0250912E0246175F +:10069000570710F490E03BC06115710511F0AB01F4 +:1006A000F9CF8091E8008E778093E80040E050E039 +:1006B000F1CF8091E80083FF02C081E0089580912E +:1006C000E80082FD30C08EB3882399F18EB3853067 +:1006D00091F18091E80080FF1AC08091F20009C07A +:1006E000F9012F5F3F4FE491E093F10041505040FA +:1006F0008F5F4115510511F0883090F390E08830FC +:1007000009F491E08091E8008E778093E80041152C +:10071000510579F6992369F606C08EB3882349F00E +:100720008EB3853041F08091E80082FFF6CF80E003 +:10073000089582E0089583E008959C016115710594 +:1007400029F48091E8008B778093E800F90120C0BC +:100750008091E80083FF02C081E008958EB3882372 +:1007600039F18EB3853031F18091E80082FFF0CF0E +:1007700006C08091F10081936150704021F080911A +:10078000F2008823B1F78091E8008B778093E8002E +:1007900061157105E9F606C08EB3882349F08EB362 +:1007A000853041F08091E80080FFF6CF80E0089529 +:1007B00082E0089583E0089542D044D01EBA10929A +:1007C0002502109224021092230284E089BD89B58B +:1007D000826089BD09B400FEFDCF8091D800982FBA +:1007E0009F779093D80080688093D80080916300B1 +:1007F0008E7F809363008091D8008F7D8093D80096 +:100800008091E0008E7F8093E0008091E1008E7FF8 +:100810008093E1008091E20081608093E20080910A +:10082000E100877F8093E1008091E20088608093FF +:10083000E2000895C1DF81E08093260208951092BE +:10084000E20008951092E10008951F920F920FB6F2 +:100850000F9211241F932F933F934F935F936F93A6 +:100860007F938F939F93AF93BF93EF93FF93E9EEA3 +:10087000F0E0108117701082E0EFF0E08081877F58 +:1008800080837894C3D0F894A9EEB0E01C92E0EF96 +:10089000F0E08081886080831C93FF91EF91BF918D +:1008A000AF919F918F917F916F915F914F913F9108 +:1008B0002F911F910F900FBE0F901F9018951F92B0 +:1008C0000F920FB60F9211242F933F934F935F9384 +:1008D0006F937F938F939F93AF93BF93EF93FF9308 +:1008E0008091E10080FF1BC08091E20080FF17C073 +:1008F0008091E1008E7F8093E1008091E2008E7F05 +:100900008093E2008091E20080618093E200809118 +:10091000D80080628093D80019BC1EBAD1D18091D2 +:10092000E10084FF29C08091E20084FF25C084E0BB +:1009300089BD89B5826089BD09B400FEFDCF809173 +:10094000D8008F7D8093D8008091E1008F7E8093C6 +:10095000E1008091E2008F7E8093E2008091E200CE +:1009600081608093E20080912502882311F481E068 +:1009700001C084E08EBBA4D18091E10083FF27C039 +:100980008091E20083FF23C08091E100877F809304 +:10099000E10082E08EBB109225028091E1008E7F03 +:1009A0008093E1008091E2008E7F8093E20080914D +:1009B000E20080618093E200AADD80E060E042E036 +:1009C00093DD8091F00088608093F00079D1809170 +:1009D000E10082FF0AC08091E20082FF06C08091A0 +:1009E000E1008B7F8093E1006BD1FF91EF91BF918C +:1009F000AF919F918F917F916F915F914F913F91B7 +:100A00002F910F900FBE0F901F9018951F93DF939B +:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D +:100A2000CDBFE7E2F2E08091F100819322E0EF3266 +:100A3000F207C9F78091270230912802353009F476 +:100A400087C0363040F43130C9F1313070F0333086 +:100A500009F01DC133C0383009F4EFC0393009F452 +:100A6000FEC0363009F013C192C0803821F08238C0 +:100A700009F00DC108C090912302809124028823BF +:100A800099F0926011C080912B0287708093E900E9 +:100A90008091EB0090E025E0969587952A95E1F707 +:100AA000982F91701092E9008091E800877F8093E1 +:100AB000E8009093F1001092F100CAC0882319F069 +:100AC000823009F0E4C090E08F719070009721F0BF +:100AD000029709F0DDC00CC080912902813009F035 +:100AE000D7C010922402333069F5809324022AC0C3 +:100AF00080912902882331F520912B02277009F477 +:100B0000C7C02093E9008091EB0080FFC1C0333063 +:100B100021F48091EB00806213C08091EB00806132 +:100B20008093EB0081E090E002C0880F991F2A9526 +:100B3000E2F78093EA001092EA008091EB0088606F +:100B40008093EB001092E9008091E800877F83C0DA +:100B5000882309F09CC0109129028091E800877FCA +:100B60008093E800E8DC04C08EB3882309F490C0C9 +:100B70008091E80080FFF8CF812F8F7711F492E009 +:100B800001C093E09EBB80688093E30081C08058E1 +:100B9000823008F07CC08091290290912A0223E0E3 +:100BA0008C3D920799F55FB7F894DE0115964EE0FB +:100BB00020E030E061E2E42FF0E0609357008491A0 +:100BC00020FF03C082958F704F5F982F9F70892FF1 +:100BD000805D8A3308F0895F8C9311961C9211977F +:100BE0002F5F3F4F12962431310529F75FBF8AE20C +:100BF0008B8383E08C838091E800877F8093E8007B +:100C0000CE0103966AE270E0E4DC11C060912B0231 +:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 +:100C2000E800877F8093E80089819A812BDD80919D +:100C3000E8008B778093E8002BC0803841F58091E5 +:100C4000E800877F8093E800809125028093F1007F +:100C50008091E8008E778093E8006DDC19C08823CE +:100C6000B1F490912902923098F48091E800877F46 +:100C70008093E800909325025EDC80912502882312 +:100C800011F483E001C084E08EBB2DDB01C028DBC2 +:100C90008091E80083FF0AC08091EB00806280931E +:100CA000EB008091E800877F8093E800AC960FB658 +:100CB000F894DEBF0FBECDBFCF91DF911F91089595 +:100CC00008951F938EB3882361F01091E90010926C +:100CD000E9008091E80083FF01C098DE177010934F +:100CE000E9001F9108950895FC018EB3843021F529 +:100CF00087859089A189B2890097A105B105E1F0A6 +:100D000085818093E9008091E80082FF15C0809181 +:100D1000F200882319F42FEF3FEF04C08091F10017 +:100D2000282F30E08091F200882341F48091E80080 +:100D30008B778093E80002C02FEF3FEFC901089541 +:100D4000FC018EB3843011F587859089A189B28921 +:100D50000097A105B105D1F081818093E9008091D0 +:100D6000F2008823A9F09091E8008091E8008E7746 +:100D70008093E80095FD0CC0FDDB982F882349F493 +:100D80008091E8008E778093E80003C092E001C074 +:100D900090E0892F0895FC018EB3843051F487854B +:100DA0009089A189B2890097A105B10511F0CF0101 +:100DB000C7CF08951F93FC01162F8EB38430D9F44A +:100DC00087859089A189B2890097A105B10599F01D +:100DD00081818093E9008091E80085FD08C08091C1 +:100DE000E8008E778093E800C5DB882329F4109310 +:100DF000F10080E001C082E01F9108950F931F93DE +:100E0000CF93DF93EC010D96FC0189E0DF011D9289 +:100E10008A95E9F72A813B8109818C81882311F425 +:100E200010E001C014E0C90151DB182B1260802FC3 +:100E300061E8412F59DB882329F12E813F810D8103 +:100E40008885882311F410E001C014E0C9013EDB5D +:100E5000182B1260802F60E8412F46DB882391F029 +:100E60002A853B8509858C85882311F410E001C013 +:100E700014E0C9012BDB182B1260802F61EC412F8D +:100E800033DB01C080E0DF91CF911F910F91089576 +:100E9000CF93DF93EC018091E80083FF60C08881ED +:100EA00090E020912B0230912C022817390709F08D +:100EB00056C080912802813261F0823220F4803263 +:100EC00009F04DC019C0823269F1833209F047C080 +:100ED00038C080912702813A09F041C08091E80032 +:100EE000877F8093E800CE010F9667E070E071DBAA +:100EF0008091E8008B7713C080912702813279F5C9 +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E013DCCE013ED98091E8008E7780939B +:100F2000E8001DC0809127028132C9F48091E80059 +:100F3000877F8093E800809129028D87CE01C8D9F0 +:100F40000DC080912702813251F48091E800877FA3 +:100F50008093E800CE0160912902C5DEECDADF91D2 +:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 +:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 +:100F800020F0A21BB30BE40BF50B661F771F881F25 +:100F9000991F1A9469F760957095809590959B01BB +:0C0FA000AC01BD01CF010895F894FFCF13 +:100FAC0000034000000440000002080000000000A4 +:060FBC000000000000002F +:103000004BC0000064C0000062C0000060C000004F +:103010005EC000005CC000005AC0000058C0000044 +:1030200056C0000054C0000052C00000EEC40000B2 +:103030004EC000004CC000004AC0000048C0000064 +:1030400046C0000044C0000042C0000040C0000074 +:103050003EC000003CC000003AC0000038C0000084 +:1030600036C0000034C0000032C0000030C0000094 +:103070002EC000002CC000002AC0000028C00000A4 +:1030800026C0000024C0000022C0000020C00000B4 +:103090001EC000001CC0000011241FBECFEFD2E0F4 +:1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B +:1030B00005900D92AA33B107D9F711E0AAE3B1E068 +:1030C00001C01D92AB35B107E1F772D314C698CF9A +:1030D000982F15C08091F200882371F48091E80048 +:1030E0008B7F8093E80003C08EB3882351F08091DA +:1030F000E80082FFF9CF02C08091F100915099233E +:1031000049F7089520914A01309149018091480181 +:103110009091470180933F0190934001C9018093B2 +:103120004101909342010895DF93CF9300D000D0E6 +:1031300000D0CDB7DEB780914501843009F45AC084 +:10314000853030F4813059F0833009F0D7C01FC08A +:10315000853009F4A0C0863009F0D0C0C3C080918A +:103160004601823008F0CAC0CDDF80914601882335 +:1031700061F480913F019091400123E0FC01209394 +:103180005700E89507B600FCFDCF85E008C08091A8 +:103190004601882311F0823029F4B4DF89E080935E +:1031A0000101ACC0813009F0A9C020E030E040E06E +:1031B00050E0F90184918F3F81F0CA01AA27BB2713 +:1031C00080933E013093400120933F018AE0809339 +:1031D000010185E080933B0191C02F5F3F4F4F4F2E +:1031E0005F4F2030F0E33F07F0E04F07F0E05F076C +:1031F00001F784C080914601833051F581E08093CE +:103200003A0180914B0190914C01892B71F0809192 +:103210004701813009F072C080914A0190914901C3 +:1032200090933D0180933C0169C0809147018823C0 +:1032300061F42CE088E190E00FB6F894A8958093B3 +:1032400060000FBE2093600059C01092000156C06C +:10325000882309F053C0809147018F3F09F04EC089 +:10326000E0E0F0E093E085E090935700E89507B642 +:1032700000FCFDCF80935700E89507B600FCFDCF1A +:10328000E058FF4F20E3E030F20771F781E18093CF +:103290005700E89533C0DE011196E5E0F1E083E0E8 +:1032A00001900D928150E1F7DE011496E2E0F1E029 +:1032B00083E001900D928150E1F790914701809158 +:1032C0004601882329F4FE01E90FF11D818107C021 +:1032D0008130A1F4FE01BC97E90FF11D808180933C +:1032E00050010CC080914601833041F48091470128 +:1032F000882321F48091480180933E0126960FB6E1 +:10330000F894DEBF0FBECDBFCF91DF9108952F920D +:103310003F924F925F926F927F929F92AF92BF9235 +:10332000CF92DF92EF92FF920F931F93CF93DF9391 +:103330008091590190915A0190934C0180934B01D7 +:1033400080914D01882351F080914D0181508093EF +:103350004D0180914D01882309F45D9A80914E01C1 +:10336000882351F080914E01815080934E018091CD +:103370004E01882309F45C9A80915401833009F44A +:10338000B2C1843030F4813071F0823009F0E3C191 +:1033900011C1853009F4C5C1853008F4BAC1863041 +:1033A00009F0D9C1CDC15C9883E080934E01809132 +:1033B000E800877F8093E80080913A01882329F014 +:1033C000B3DE5D9A5C9A10923A0120914B013091E4 +:1033D0004C012115310529F42AC08EB3882309F444 +:1033E000BAC18091E80082FFF8CF8091F10080930C +:1033F00045012150304030934C0120934B01E6E4CD +:10340000F1E00CC08091F10081932150304081E0C7 +:10341000EB34F80719F43183208308C08091F2005F +:10342000882381F730934C0120934B017DDE8091FE +:103430000101853009F0BAC080914B0190914C0197 +:10344000892B21F482E080930101B0C08AE140DE43 +:1034500080913F018F713CDEC0914101D0914201CA +:1034600020913F013091400121968E01021B130BE8 +:10347000219780914601882309F093C01801369462 +:103480002794C901A0913E01B0E09C01AD0162E02A +:10349000E62EF12C012D112DE20EF31E041F151F37 +:1034A00059016A0190E099249394B5E0A3E048C0E3 +:1034B0008091F200882371F48091E8008B7F8093E3 +:1034C000E80004C08EB3882309F445C18091E80068 +:1034D00082FFF8CF0894210831088091F100682F0D +:1034E0008091F100782FF5010B0190925700E8953B +:1034F00011249F5F903419F021143104A1F4F901D3 +:10350000B0935700E89507B600FCFDCF21143104B5 +:1035100051F0F701A0935700E89507B600FCFDCFE6 +:10352000A801970190E042E0442E512C612C712CAF +:10353000E40CF51C061D171DA40CB51CC61CD71CDD +:103540002114310409F0B4CFD0934001C0933F015E +:1035500081E180935700E89527C08091F20088238D +:1035600071F48091E8008B7F8093E80004C08EB3F3 +:10357000882309F4F0C08091E80082FFF8CF6091C1 +:10358000F10080913F0190914001A7D380913F01CC +:103590009091400101969093400180933F0101502A +:1035A000104001151105C9F680E192DD8091E80017 +:1035B0008B7FC3C08091E800877F8093E8005D988F +:1035C00083E080934D0104C08EB3882309F4C3C007 +:1035D0008091E80080FFF8CF80910101893091F05F +:1035E0008A3069F480914601813049F480913F012D +:1035F000909140018093F1009093F1009BC08091E5 +:10360000500196C0609141017091420120913F01AB +:10361000309140016F5F7F4F7B01E21AF30A6150E6 +:10362000704080914601882389F58701169507959A +:10363000C901A0913E01B0E09C01AD011FC0809185 +:10364000F200803271F48091E8008E7F8093E80070 +:1036500004C08EB3882309F47EC08091E80080FF07 +:10366000F8CFF901859194918093F1009093F10046 +:10367000015010402E5F3F4F4F4F5F4F0115110516 +:10368000F1F67093400160933F0129C0823039F513 +:1036900023C08091F200803271F48091E8008E7F27 +:1036A0008093E80004C08EB3882309F454C080914D +:1036B000E80080FFF8CF00913F0110914001C80160 +:1036C00004D38093F1000F5F1F4F109340010093CC +:1036D0003F010894E108F108E114F104D1F682E019 +:1036E0008093010127C08091E800877F8093E800E4 +:1036F00080913B018093F1001092F1001092F10053 +:103700001092F100809101018093F1001092F1007C +:1037100011C08091E800877F8093E80010923B0100 +:1037200019C08091E800877F8093E80080910101B3 +:103730008093F1008091E8008E7F8093E8000AC0BA +:103740008091E800877F8093E8005D9A5C9A82E030 +:103750008093010187D0DF91CF911F910F91FF904E +:10376000EF90DF90CF90BF90AF909F907F906F9041 +:103770005F904F903F902F9008952BD181E085BFAF +:1037800015BE089584B7877F84BF88E10FB6F8948B +:1037900080936000109260000FBE81E085BF82E0E0 +:1037A00085BF8AB180638AB98BB180638BB90CC144 +:1037B000E9DF789401C080D2809100018823D9F795 +:1037C00080913A018823B9F7D8DFE0913C01F0916C +:1037D0003D010995FA01923071F0933089F09130F2 +:1037E00029F488E091E022E130E019C080E090E027 +:1037F00020E030E014C08AE191E02BE130E00FC01E +:10380000882339F480913501282F30E085E391E059 +:1038100006C080914301282F30E083E491E091833A +:103820008083C90108958091EB0081608093EB0053 +:103830001092ED006093EC004093ED008091EE005B +:10384000881F8827881F08951092F4001092F000B6 +:103850001092E8001092ED00EBEEF0E080818E7F98 +:10386000808308958091530188238CF403C08EB324 +:103870008823B1F08091E80082FFF9CF8091E800C1 +:103880008B7F8093E80008958EB3882349F0809160 +:10389000E80080FFF9CF8091E8008E7F8093E800F8 +:1038A00008959C014091590150915A0146175707BC +:1038B00018F4F90120E038C06115710511F0AB0171 +:1038C000F8CF8091E8008E7F8093E80040E050E0E0 +:1038D000F0CF8091E80083FF02C081E008958091DD +:1038E000E80082FD2DC08EB3882381F18EB3853030 +:1038F00079F18091E80080FF17C09091F20006C036 +:1039000081918093F100415050409F5F41155105D6 +:1039100011F09032A8F320E0903209F421E0809178 +:10392000E8008E7F8093E8004115510591F622232F +:1039300081F606C08EB3882349F08EB3853041F0FE +:103940008091E80082FFF6CF80E0089582E008953C +:1039500083E0089554D056D01EBA1092510184E0ED +:1039600089BD89B5826089BD09B400FEFDCF809113 +:10397000D800982F9F779093D80080688093D800C4 +:10398000809163008E7F809363008091D8008F7D4B +:103990008093D8008091E0008E7F8093E00080913A +:1039A000E1008E7F8093E1008091E200816080934E +:1039B000E2008091E100877F8093E1008091E20046 +:1039C00088608093E2000895C5DF81E08093520112 +:1039D0000895C0DFE0EEF0E0808181608083E8ED53 +:1039E000F0E080818F7780830AD00CD019BCE3E6A9 +:1039F000F0E08081816080831092520108951092DE +:103A0000E20008951092E10008951F920F920FB600 +:103A10000F9211242F933F934F935F936F937F9354 +:103A20008F939F93AF93BF93EF93FF938091E100A8 +:103A300080FF1BC08091E20080FF17C08091E100F1 +:103A40008E7F8093E1008091E2008E7F8093E20080 +:103A50008091E20080618093E2008091D8008062D2 +:103A60008093D80019BC1EBA26D18091E10084FF52 +:103A700029C08091E20084FF25C084E089BD89B51A +:103A8000826089BD09B400FEFDCF8091D8008F7D92 +:103A90008093D8008091E1008F7E8093E100809137 +:103AA000E2008F7E8093E2008091E200816080934B +:103AB000E20080915101882311F481E001C084E08B +:103AC0008EBBF9D08091E10083FF22C08091E2009B +:103AD00083FF1EC08091E100877F8093E10082E038 +:103AE0008EBB109251018091E1008E7F8093E100A6 +:103AF0008091E2008E7F8093E2008091E2008061FD +:103B00008093E200A1DE80E060E042E28CDED3D070 +:103B10008091E10082FF0AC08091E20082FF06C02E +:103B20008091E1008B7F8093E100C5D0FF91EF9100 +:103B3000BF91AF919F918F917F916F915F914F91C5 +:103B40003F912F910F900FBE0F901F9018951F93CC +:103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE +:103B6000F100819381E0EB35F807C9F7909153019B +:103B700080915401853011F1863040F48130B9F0E4 +:103B8000813070F0833009F081C011C0883009F4B1 +:103B900053C0893009F462C0863009F077C02DC067 +:103BA000903809F474C0923809F070C070C099233D +:103BB00009F46DC0923009F069C069C0992309F019 +:103BC00065C0109155018091E800877F8093E800DF +:103BD00049DE04C08EB3882309F459C08091E800FF +:103BE00080FFF8CF812F8F7711F492E001C093E02E +:103BF0009EBB80688093E3004AC09058923008F0E2 +:103C000045C0809155019091560160915701AE01D8 +:103C10004F5F5F4FDFDDBC010097C9F18091E80085 +:103C2000877F8093E80089819A813BDE8091E8005C +:103C30008B7F8093E8002BC0903841F58091E8009D +:103C4000877F8093E800809151018093F1008091FB +:103C5000E8008E7F8093E80005DE19C09923B1F457 +:103C600090915501923098F48091E800877F80937D +:103C7000E80090935101F6DD80915101882311F401 +:103C800083E001C084E08EBB16D001C040DB809190 +:103C9000E80083FF0AC08091EB0080628093EB0014 +:103CA0008091E800877F8093E8000F900F90CF917C +:103CB000DF911F91089508958EB3882329F0809194 +:103CC000E80083FF01C043CF0895F999FECF92BD6C +:103CD00081BDF89A992780B50895262FF999FECFCE +:103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 +:0A3CF0000FBE01960895F894FFCF6F +:103CFA0001021E948920DCFB120110010000002041 +:103D0A00EB03EF2F00000001000109021B00010173 +:103D1A000080320904000000FE01020009210300AC +:0A3D2A0000000C000104030904006E +:0400000300003000C9 +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex index c2c7b2d1b0a..441dd20a7bf 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex @@ -1,467 +1,467 @@ -:1000000090C00000A9C00000A7C00000A5C000006B -:10001000A3C00000A1C000009FC000009DC0000060 -:100020009BC0000099C0000097C0000048C40000B9 -:100030000CC4000091C000008FC000008DC0000003 -:100040008BC0000089C0000087C0000085C0000090 -:1000500083C0000081C000007FC0000002C100001A -:100060007BC0000079C0000077C0000075C00000B0 -:1000700073C0000071C000006FC000006DC00000C0 -:100080006BC0000069C0000067C0000065C00000D0 -:1000900063C0000061C000001201100102000008EE -:1000A0004123430001000102DC0109023E0002017C -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:10012000000011241FBECFEFD2E0DEBFCDBF11E033 -:10013000A0E0B1E0ECEAFFE002C005900D92A6312C -:10014000B107D9F712E0A6E1B1E001C01D92AF32CC -:10015000B107E1F7F1D028C753CF9C01DC01AE57BE -:10016000BF4FED91FC91119741911196FC93EE9345 -:1001700080589F4FE817F90711F42D933C939FB7D0 -:10018000F894F901EC57FF4F8081815080839FBF25 -:10019000842F0895DF92EF92FF920F931F93FC013B -:1001A0008489813019F0823021F405C040E3D42ED7 -:1001B00004C0DD2402C030E2D32E8389823011F4E2 -:1001C00088E0D82A8589873031F0883031F0863050 -:1001D00031F482E003C084E001C086E0D82A1092A6 -:1001E000C9001092C8001092CA00E784F088018903 -:1001F000128980E0E81681EEF80680E0080780E0CA -:10020000180719F420E130E00FC0C801B701969536 -:1002100087957795679560587B47814E9F4FA801DA -:100220009701A0D6215030403093CD002093CC00D0 -:10023000D092CA0080E0E81681EEF80680E0080758 -:1002400080E0180711F082E001C080E08093C800D0 -:1002500088E98093C9001F910F91FF90EF90DF9084 -:1002600008951F920F920FB60F9211242F938F9320 -:100270009F93EF93FF939091CE008EB38430F1F46F -:10028000E0919901F0919A019083E0919901F091A8 -:100290009A01CF01019690939A018093990189590F -:1002A000914021F489E191E0928381839FB7F89492 -:1002B00080919D018F5F80939D019FBFFF91EF9182 -:1002C0009F918F912F910F900FBE0F901F901895B7 -:1002D000FC01858580FF02C05F9808955F9A0895AC -:1002E00080E091E0D5C580E091E088C584B7877F44 -:1002F00084BF28E10FB6F89420936000109260004C -:100300000FBE87E690E09093CD008093CC0086E00E -:100310008093CA001092C8002093C900539A5A9A39 -:100320008AB180638AB98BB180638BB983D284E050 -:1003300085BD5F9A579A08950F931F93CF93DF93CC -:10034000D5DF2FB7F8948EE991E090931F02809348 -:100350001E0290932102809320022FBF2FB7F894A2 -:1003600089E191E090939A018093990190939C0187 -:1003700080939B012FBF7894CEE9D1E003E08FB743 -:10038000F894909122028FBF903809F180E091E0BB -:10039000ABD497FD1CC0E0911E02F0911F02808338 -:1003A000E0911E02F0911F02CF01019690931F026F -:1003B00080931E028E51924011F4D283C1839FB765 -:1003C000F894809122028F5F809322029FBF8FB7A3 -:1003D000F89410919D018FBFA89902C0113678F151 -:1003E000A89A80919D01882361F05D980093160181 -:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 -:1004000011501123B1F780911601882351F080918A -:10041000160181508093160180911601882309F4FA -:100420005D9A80911701882351F0809117018150C6 -:100430008093170180911701882309F45C9A8FB784 -:10044000F894909122028FBF992369F08EE991E090 -:1004500084DE982F8091C80085FFFCCF9093CE005A -:100460005C980093170180E091E095D42AD487CF5F -:10047000DA01923049F0933061F09130F9F4E8E913 -:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 -:1004900019C0813049F0813018F0823079F408C0F9 -:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 -:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 -:1004C00020E030E0ED93FC93C901089528E030E08E -:1004D00040E003C04F5F220F331F28173907D0F3C6 -:1004E000842F8295807F08958093E9008091EB00AE -:1004F00081608093EB001092ED006093EC004093DC -:10050000ED008091EE00881F8827881F08951092C3 -:10051000F40090E09093E9001092F0001092E8004F -:100520001092ED008091EB008E7F8093EB009F5F37 -:10053000953081F708958091270288238CF403C0B9 -:100540008EB38823B1F08091E80082FFF9CF8091CB -:10055000E8008B778093E80008958EB3882349F0F4 -:100560008091E80080FFF9CF8091E8008E7780933A -:10057000E800089594E68091EC0080FF05C080912A -:10058000E80080FF05C023C08091E80082FD1FC005 -:100590008EB3882311F482E008958EB3853011F470 -:1005A00083E008958091EB0085FF02C081E008950B -:1005B0008091E10082FFDFCF8091E1008B7F80930B -:1005C000E100992311F484E008959150D4CF80E0A4 -:1005D00008959C0140912D0250912E024617570715 -:1005E00018F4F90120E038C06115710511F0AB0174 -:1005F000F8CF8091E8008E778093E80040E050E0EB -:10060000F0CF8091E80083FF02C081E008958091DF -:10061000E80082FD2DC08EB3882381F18EB3853032 -:1006200079F18091E80080FF17C09091F20006C038 -:1006300081918093F100415050409F5F41155105D9 -:1006400011F09830A8F320E0983009F421E080916F -:10065000E8008E778093E8004115510591F622233A -:1006600081F606C08EB3882349F08EB3853041F001 -:100670008091E80082FFF6CF80E0089582E008953F -:1006800083E008959C0140912D0250912E0246175F -:10069000570710F490E03BC06115710511F0AB01F4 -:1006A000F9CF8091E8008E778093E80040E050E039 -:1006B000F1CF8091E80083FF02C081E0089580912E -:1006C000E80082FD30C08EB3882399F18EB3853067 -:1006D00091F18091E80080FF1AC08091F20009C07A -:1006E000F9012F5F3F4FE491E093F10041505040FA -:1006F0008F5F4115510511F0883090F390E08830FC -:1007000009F491E08091E8008E778093E80041152C -:10071000510579F6992369F606C08EB3882349F00E -:100720008EB3853041F08091E80082FFF6CF80E003 -:10073000089582E0089583E008959C016115710594 -:1007400029F48091E8008B778093E800F90120C0BC -:100750008091E80083FF02C081E008958EB3882372 -:1007600039F18EB3853031F18091E80082FFF0CF0E -:1007700006C08091F10081936150704021F080911A -:10078000F2008823B1F78091E8008B778093E8002E -:1007900061157105E9F606C08EB3882349F08EB362 -:1007A000853041F08091E80080FFF6CF80E0089529 -:1007B00082E0089583E0089542D044D01EBA10929A -:1007C0002502109224021092230284E089BD89B58B -:1007D000826089BD09B400FEFDCF8091D800982FBA -:1007E0009F779093D80080688093D80080916300B1 -:1007F0008E7F809363008091D8008F7D8093D80096 -:100800008091E0008E7F8093E0008091E1008E7FF8 -:100810008093E1008091E20081608093E20080910A -:10082000E100877F8093E1008091E20088608093FF -:10083000E2000895C1DF81E08093260208951092BE -:10084000E20008951092E10008951F920F920FB6F2 -:100850000F9211241F932F933F934F935F936F93A6 -:100860007F938F939F93AF93BF93EF93FF93E9EEA3 -:10087000F0E0108117701082E0EFF0E08081877F58 -:1008800080837894C3D0F894A9EEB0E01C92E0EF96 -:10089000F0E08081886080831C93FF91EF91BF918D -:1008A000AF919F918F917F916F915F914F913F9108 -:1008B0002F911F910F900FBE0F901F9018951F92B0 -:1008C0000F920FB60F9211242F933F934F935F9384 -:1008D0006F937F938F939F93AF93BF93EF93FF9308 -:1008E0008091E10080FF1BC08091E20080FF17C073 -:1008F0008091E1008E7F8093E1008091E2008E7F05 -:100900008093E2008091E20080618093E200809118 -:10091000D80080628093D80019BC1EBAD1D18091D2 -:10092000E10084FF29C08091E20084FF25C084E0BB -:1009300089BD89B5826089BD09B400FEFDCF809173 -:10094000D8008F7D8093D8008091E1008F7E8093C6 -:10095000E1008091E2008F7E8093E2008091E200CE -:1009600081608093E20080912502882311F481E068 -:1009700001C084E08EBBA4D18091E10083FF27C039 -:100980008091E20083FF23C08091E100877F809304 -:10099000E10082E08EBB109225028091E1008E7F03 -:1009A0008093E1008091E2008E7F8093E20080914D -:1009B000E20080618093E200AADD80E060E042E036 -:1009C00093DD8091F00088608093F00079D1809170 -:1009D000E10082FF0AC08091E20082FF06C08091A0 -:1009E000E1008B7F8093E1006BD1FF91EF91BF918C -:1009F000AF919F918F917F916F915F914F913F91B7 -:100A00002F910F900FBE0F901F9018951F93DF939B -:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D -:100A2000CDBFE7E2F2E08091F100819322E0EF3266 -:100A3000F207C9F78091270230912802353009F476 -:100A400087C0363040F43130C9F1313070F0333086 -:100A500009F01DC133C0383009F4EFC0393009F452 -:100A6000FEC0363009F013C192C0803821F08238C0 -:100A700009F00DC108C090912302809124028823BF -:100A800099F0926011C080912B0287708093E900E9 -:100A90008091EB0090E025E0969587952A95E1F707 -:100AA000982F91701092E9008091E800877F8093E1 -:100AB000E8009093F1001092F100CAC0882319F069 -:100AC000823009F0E4C090E08F719070009721F0BF -:100AD000029709F0DDC00CC080912902813009F035 -:100AE000D7C010922402333069F5809324022AC0C3 -:100AF00080912902882331F520912B02277009F477 -:100B0000C7C02093E9008091EB0080FFC1C0333063 -:100B100021F48091EB00806213C08091EB00806132 -:100B20008093EB0081E090E002C0880F991F2A9526 -:100B3000E2F78093EA001092EA008091EB0088606F -:100B40008093EB001092E9008091E800877F83C0DA -:100B5000882309F09CC0109129028091E800877FCA -:100B60008093E800E8DC04C08EB3882309F490C0C9 -:100B70008091E80080FFF8CF812F8F7711F492E009 -:100B800001C093E09EBB80688093E30081C08058E1 -:100B9000823008F07CC08091290290912A0223E0E3 -:100BA0008C3D920799F55FB7F894DE0115964EE0FB -:100BB00020E030E061E2E42FF0E0609357008491A0 -:100BC00020FF03C082958F704F5F982F9F70892FF1 -:100BD000805D8A3308F0895F8C9311961C9211977F -:100BE0002F5F3F4F12962431310529F75FBF8AE20C -:100BF0008B8383E08C838091E800877F8093E8007B -:100C0000CE0103966AE270E0E4DC11C060912B0231 -:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 -:100C2000E800877F8093E80089819A812BDD80919D -:100C3000E8008B778093E8002BC0803841F58091E5 -:100C4000E800877F8093E800809125028093F1007F -:100C50008091E8008E778093E8006DDC19C08823CE -:100C6000B1F490912902923098F48091E800877F46 -:100C70008093E800909325025EDC80912502882312 -:100C800011F483E001C084E08EBB2DDB01C028DBC2 -:100C90008091E80083FF0AC08091EB00806280931E -:100CA000EB008091E800877F8093E800AC960FB658 -:100CB000F894DEBF0FBECDBFCF91DF911F91089595 -:100CC00008951F938EB3882361F01091E90010926C -:100CD000E9008091E80083FF01C098DE177010934F -:100CE000E9001F9108950895FC018EB3843021F529 -:100CF00087859089A189B2890097A105B105E1F0A6 -:100D000085818093E9008091E80082FF15C0809181 -:100D1000F200882319F42FEF3FEF04C08091F10017 -:100D2000282F30E08091F200882341F48091E80080 -:100D30008B778093E80002C02FEF3FEFC901089541 -:100D4000FC018EB3843011F587859089A189B28921 -:100D50000097A105B105D1F081818093E9008091D0 -:100D6000F2008823A9F09091E8008091E8008E7746 -:100D70008093E80095FD0CC0FDDB982F882349F493 -:100D80008091E8008E778093E80003C092E001C074 -:100D900090E0892F0895FC018EB3843051F487854B -:100DA0009089A189B2890097A105B10511F0CF0101 -:100DB000C7CF08951F93FC01162F8EB38430D9F44A -:100DC00087859089A189B2890097A105B10599F01D -:100DD00081818093E9008091E80085FD08C08091C1 -:100DE000E8008E778093E800C5DB882329F4109310 -:100DF000F10080E001C082E01F9108950F931F93DE -:100E0000CF93DF93EC010D96FC0189E0DF011D9289 -:100E10008A95E9F72A813B8109818C81882311F425 -:100E200010E001C014E0C90151DB182B1260802FC3 -:100E300061E8412F59DB882329F12E813F810D8103 -:100E40008885882311F410E001C014E0C9013EDB5D -:100E5000182B1260802F60E8412F46DB882391F029 -:100E60002A853B8509858C85882311F410E001C013 -:100E700014E0C9012BDB182B1260802F61EC412F8D -:100E800033DB01C080E0DF91CF911F910F91089576 -:100E9000CF93DF93EC018091E80083FF60C08881ED -:100EA00090E020912B0230912C022817390709F08D -:100EB00056C080912802813261F0823220F4803263 -:100EC00009F04DC019C0823269F1833209F047C080 -:100ED00038C080912702813A09F041C08091E80032 -:100EE000877F8093E800CE010F9667E070E071DBAA -:100EF0008091E8008B7713C080912702813279F5C9 -:100F00008091E800877F8093E800CE010F9667E02C -:100F100070E013DCCE013ED98091E8008E7780939B -:100F2000E8001DC0809127028132C9F48091E80059 -:100F3000877F8093E800809129028D87CE01C8D9F0 -:100F40000DC080912702813251F48091E800877FA3 -:100F50008093E800CE0160912902C5DEECDADF91D2 -:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 -:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 -:100F800020F0A21BB30BE40BF50B661F771F881F25 -:100F9000991F1A9469F760957095809590959B01BB -:0C0FA000AC01BD01CF010895F894FFCF13 -:100FAC0000034000000440000002080000000000A4 -:060FBC000000000000002F -:103000004BC0000064C0000062C0000060C000004F -:103010005EC000005CC000005AC0000058C0000044 -:1030200056C0000054C0000052C00000EEC40000B2 -:103030004EC000004CC000004AC0000048C0000064 -:1030400046C0000044C0000042C0000040C0000074 -:103050003EC000003CC000003AC0000038C0000084 -:1030600036C0000034C0000032C0000030C0000094 -:103070002EC000002CC000002AC0000028C00000A4 -:1030800026C0000024C0000022C0000020C00000B4 -:103090001EC000001CC0000011241FBECFEFD2E0F4 -:1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B -:1030B00005900D92AA33B107D9F711E0AAE3B1E068 -:1030C00001C01D92AB35B107E1F772D314C698CF9A -:1030D000982F15C08091F200882371F48091E80048 -:1030E0008B7F8093E80003C08EB3882351F08091DA -:1030F000E80082FFF9CF02C08091F100915099233E -:1031000049F7089520914A01309149018091480181 -:103110009091470180933F0190934001C9018093B2 -:103120004101909342010895DF93CF9300D000D0E6 -:1031300000D0CDB7DEB780914501843009F45AC084 -:10314000853030F4813059F0833009F0D7C01FC08A -:10315000853009F4A0C0863009F0D0C0C3C080918A -:103160004601823008F0CAC0CDDF80914601882335 -:1031700061F480913F019091400123E0FC01209394 -:103180005700E89507B600FCFDCF85E008C08091A8 -:103190004601882311F0823029F4B4DF89E080935E -:1031A0000101ACC0813009F0A9C020E030E040E06E -:1031B00050E0F90184918F3F81F0CA01AA27BB2713 -:1031C00080933E013093400120933F018AE0809339 -:1031D000010185E080933B0191C02F5F3F4F4F4F2E -:1031E0005F4F2030F0E33F07F0E04F07F0E05F076C -:1031F00001F784C080914601833051F581E08093CE -:103200003A0180914B0190914C01892B71F0809192 -:103210004701813009F072C080914A0190914901C3 -:1032200090933D0180933C0169C0809147018823C0 -:1032300061F42CE088E190E00FB6F894A8958093B3 -:1032400060000FBE2093600059C01092000156C06C -:10325000882309F053C0809147018F3F09F04EC089 -:10326000E0E0F0E093E085E090935700E89507B642 -:1032700000FCFDCF80935700E89507B600FCFDCF1A -:10328000E058FF4F20E3E030F20771F781E18093CF -:103290005700E89533C0DE011196E5E0F1E083E0E8 -:1032A00001900D928150E1F7DE011496E2E0F1E029 -:1032B00083E001900D928150E1F790914701809158 -:1032C0004601882329F4FE01E90FF11D818107C021 -:1032D0008130A1F4FE01BC97E90FF11D808180933C -:1032E00050010CC080914601833041F48091470128 -:1032F000882321F48091480180933E0126960FB6E1 -:10330000F894DEBF0FBECDBFCF91DF9108952F920D -:103310003F924F925F926F927F929F92AF92BF9235 -:10332000CF92DF92EF92FF920F931F93CF93DF9391 -:103330008091590190915A0190934C0180934B01D7 -:1033400080914D01882351F080914D0181508093EF -:103350004D0180914D01882309F45D9A80914E01C1 -:10336000882351F080914E01815080934E018091CD -:103370004E01882309F45C9A80915401833009F44A -:10338000B2C1843030F4813071F0823009F0E3C191 -:1033900011C1853009F4C5C1853008F4BAC1863041 -:1033A00009F0D9C1CDC15C9883E080934E01809132 -:1033B000E800877F8093E80080913A01882329F014 -:1033C000B3DE5D9A5C9A10923A0120914B013091E4 -:1033D0004C012115310529F42AC08EB3882309F444 -:1033E000BAC18091E80082FFF8CF8091F10080930C -:1033F00045012150304030934C0120934B01E6E4CD -:10340000F1E00CC08091F10081932150304081E0C7 -:10341000EB34F80719F43183208308C08091F2005F -:10342000882381F730934C0120934B017DDE8091FE -:103430000101853009F0BAC080914B0190914C0197 -:10344000892B21F482E080930101B0C08AE140DE43 -:1034500080913F018F713CDEC0914101D0914201CA -:1034600020913F013091400121968E01021B130BE8 -:10347000219780914601882309F093C01801369462 -:103480002794C901A0913E01B0E09C01AD0162E02A -:10349000E62EF12C012D112DE20EF31E041F151F37 -:1034A00059016A0190E099249394B5E0A3E048C0E3 -:1034B0008091F200882371F48091E8008B7F8093E3 -:1034C000E80004C08EB3882309F445C18091E80068 -:1034D00082FFF8CF0894210831088091F100682F0D -:1034E0008091F100782FF5010B0190925700E8953B -:1034F00011249F5F903419F021143104A1F4F901D3 -:10350000B0935700E89507B600FCFDCF21143104B5 -:1035100051F0F701A0935700E89507B600FCFDCFE6 -:10352000A801970190E042E0442E512C612C712CAF -:10353000E40CF51C061D171DA40CB51CC61CD71CDD -:103540002114310409F0B4CFD0934001C0933F015E -:1035500081E180935700E89527C08091F20088238D -:1035600071F48091E8008B7F8093E80004C08EB3F3 -:10357000882309F4F0C08091E80082FFF8CF6091C1 -:10358000F10080913F0190914001A7D380913F01CC -:103590009091400101969093400180933F0101502A -:1035A000104001151105C9F680E192DD8091E80017 -:1035B0008B7FC3C08091E800877F8093E8005D988F -:1035C00083E080934D0104C08EB3882309F4C3C007 -:1035D0008091E80080FFF8CF80910101893091F05F -:1035E0008A3069F480914601813049F480913F012D -:1035F000909140018093F1009093F1009BC08091E5 -:10360000500196C0609141017091420120913F01AB -:10361000309140016F5F7F4F7B01E21AF30A6150E6 -:10362000704080914601882389F58701169507959A -:10363000C901A0913E01B0E09C01AD011FC0809185 -:10364000F200803271F48091E8008E7F8093E80070 -:1036500004C08EB3882309F47EC08091E80080FF07 -:10366000F8CFF901859194918093F1009093F10046 -:10367000015010402E5F3F4F4F4F5F4F0115110516 -:10368000F1F67093400160933F0129C0823039F513 -:1036900023C08091F200803271F48091E8008E7F27 -:1036A0008093E80004C08EB3882309F454C080914D -:1036B000E80080FFF8CF00913F0110914001C80160 -:1036C00004D38093F1000F5F1F4F109340010093CC -:1036D0003F010894E108F108E114F104D1F682E019 -:1036E0008093010127C08091E800877F8093E800E4 -:1036F00080913B018093F1001092F1001092F10053 -:103700001092F100809101018093F1001092F1007C -:1037100011C08091E800877F8093E80010923B0100 -:1037200019C08091E800877F8093E80080910101B3 -:103730008093F1008091E8008E7F8093E8000AC0BA -:103740008091E800877F8093E8005D9A5C9A82E030 -:103750008093010187D0DF91CF911F910F91FF904E -:10376000EF90DF90CF90BF90AF909F907F906F9041 -:103770005F904F903F902F9008952BD181E085BFAF -:1037800015BE089584B7877F84BF88E10FB6F8948B -:1037900080936000109260000FBE81E085BF82E0E0 -:1037A00085BF8AB180638AB98BB180638BB90CC144 -:1037B000E9DF789401C080D2809100018823D9F795 -:1037C00080913A018823B9F7D8DFE0913C01F0916C -:1037D0003D010995FA01923071F0933089F09130F2 -:1037E00029F488E091E022E130E019C080E090E027 -:1037F00020E030E014C08AE191E02BE130E00FC01E -:10380000882339F480913501282F30E085E391E059 -:1038100006C080914301282F30E083E491E091833A -:103820008083C90108958091EB0081608093EB0053 -:103830001092ED006093EC004093ED008091EE005B -:10384000881F8827881F08951092F4001092F000B6 -:103850001092E8001092ED00EBEEF0E080818E7F98 -:10386000808308958091530188238CF403C08EB324 -:103870008823B1F08091E80082FFF9CF8091E800C1 -:103880008B7F8093E80008958EB3882349F0809160 -:10389000E80080FFF9CF8091E8008E7F8093E800F8 -:1038A00008959C014091590150915A0146175707BC -:1038B00018F4F90120E038C06115710511F0AB0171 -:1038C000F8CF8091E8008E7F8093E80040E050E0E0 -:1038D000F0CF8091E80083FF02C081E008958091DD -:1038E000E80082FD2DC08EB3882381F18EB3853030 -:1038F00079F18091E80080FF17C09091F20006C036 -:1039000081918093F100415050409F5F41155105D6 -:1039100011F09032A8F320E0903209F421E0809178 -:10392000E8008E7F8093E8004115510591F622232F -:1039300081F606C08EB3882349F08EB3853041F0FE -:103940008091E80082FFF6CF80E0089582E008953C -:1039500083E0089554D056D01EBA1092510184E0ED -:1039600089BD89B5826089BD09B400FEFDCF809113 -:10397000D800982F9F779093D80080688093D800C4 -:10398000809163008E7F809363008091D8008F7D4B -:103990008093D8008091E0008E7F8093E00080913A -:1039A000E1008E7F8093E1008091E200816080934E -:1039B000E2008091E100877F8093E1008091E20046 -:1039C00088608093E2000895C5DF81E08093520112 -:1039D0000895C0DFE0EEF0E0808181608083E8ED53 -:1039E000F0E080818F7780830AD00CD019BCE3E6A9 -:1039F000F0E08081816080831092520108951092DE -:103A0000E20008951092E10008951F920F920FB600 -:103A10000F9211242F933F934F935F936F937F9354 -:103A20008F939F93AF93BF93EF93FF938091E100A8 -:103A300080FF1BC08091E20080FF17C08091E100F1 -:103A40008E7F8093E1008091E2008E7F8093E20080 -:103A50008091E20080618093E2008091D8008062D2 -:103A60008093D80019BC1EBA26D18091E10084FF52 -:103A700029C08091E20084FF25C084E089BD89B51A -:103A8000826089BD09B400FEFDCF8091D8008F7D92 -:103A90008093D8008091E1008F7E8093E100809137 -:103AA000E2008F7E8093E2008091E200816080934B -:103AB000E20080915101882311F481E001C084E08B -:103AC0008EBBF9D08091E10083FF22C08091E2009B -:103AD00083FF1EC08091E100877F8093E10082E038 -:103AE0008EBB109251018091E1008E7F8093E100A6 -:103AF0008091E2008E7F8093E2008091E2008061FD -:103B00008093E200A1DE80E060E042E28CDED3D070 -:103B10008091E10082FF0AC08091E20082FF06C02E -:103B20008091E1008B7F8093E100C5D0FF91EF9100 -:103B3000BF91AF919F918F917F916F915F914F91C5 -:103B40003F912F910F900FBE0F901F9018951F93CC -:103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE -:103B6000F100819381E0EB35F807C9F7909153019B -:103B700080915401853011F1863040F48130B9F0E4 -:103B8000813070F0833009F081C011C0883009F4B1 -:103B900053C0893009F462C0863009F077C02DC067 -:103BA000903809F474C0923809F070C070C099233D -:103BB00009F46DC0923009F069C069C0992309F019 -:103BC00065C0109155018091E800877F8093E800DF -:103BD00049DE04C08EB3882309F459C08091E800FF -:103BE00080FFF8CF812F8F7711F492E001C093E02E -:103BF0009EBB80688093E3004AC09058923008F0E2 -:103C000045C0809155019091560160915701AE01D8 -:103C10004F5F5F4FDFDDBC010097C9F18091E80085 -:103C2000877F8093E80089819A813BDE8091E8005C -:103C30008B7F8093E8002BC0903841F58091E8009D -:103C4000877F8093E800809151018093F1008091FB -:103C5000E8008E7F8093E80005DE19C09923B1F457 -:103C600090915501923098F48091E800877F80937D -:103C7000E80090935101F6DD80915101882311F401 -:103C800083E001C084E08EBB16D001C040DB809190 -:103C9000E80083FF0AC08091EB0080628093EB0014 -:103CA0008091E800877F8093E8000F900F90CF917C -:103CB000DF911F91089508958EB3882329F0809194 -:103CC000E80083FF01C043CF0895F999FECF92BD6C -:103CD00081BDF89A992780B50895262FF999FECFCE -:103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 -:0A3CF0000FBE01960895F894FFCF6F -:103CFA0001021E948920DCFB120110010000002041 -:103D0A00EB03EF2F00000001000109021B00010173 -:103D1A000080320904000000FE01020009210300AC -:0A3D2A0000000C000104030904006E -:0400000300003000C9 -:00000001FF +:1000000090C00000A9C00000A7C00000A5C000006B +:10001000A3C00000A1C000009FC000009DC0000060 +:100020009BC0000099C0000097C0000048C40000B9 +:100030000CC4000091C000008FC000008DC0000003 +:100040008BC0000089C0000087C0000085C0000090 +:1000500083C0000081C000007FC0000002C100001A +:100060007BC0000079C0000077C0000075C00000B0 +:1000700073C0000071C000006FC000006DC00000C0 +:100080006BC0000069C0000067C0000065C00000D0 +:1000900063C0000061C000001201100102000008EE +:1000A0004123430001000102DC0109023E0002017C +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:10012000000011241FBECFEFD2E0DEBFCDBF11E033 +:10013000A0E0B1E0ECEAFFE002C005900D92A6312C +:10014000B107D9F712E0A6E1B1E001C01D92AF32CC +:10015000B107E1F7F1D028C753CF9C01DC01AE57BE +:10016000BF4FED91FC91119741911196FC93EE9345 +:1001700080589F4FE817F90711F42D933C939FB7D0 +:10018000F894F901EC57FF4F8081815080839FBF25 +:10019000842F0895DF92EF92FF920F931F93FC013B +:1001A0008489813019F0823021F405C040E3D42ED7 +:1001B00004C0DD2402C030E2D32E8389823011F4E2 +:1001C00088E0D82A8589873031F0883031F0863050 +:1001D00031F482E003C084E001C086E0D82A1092A6 +:1001E000C9001092C8001092CA00E784F088018903 +:1001F000128980E0E81681EEF80680E0080780E0CA +:10020000180719F420E130E00FC0C801B701969536 +:1002100087957795679560587B47814E9F4FA801DA +:100220009701A0D6215030403093CD002093CC00D0 +:10023000D092CA0080E0E81681EEF80680E0080758 +:1002400080E0180711F082E001C080E08093C800D0 +:1002500088E98093C9001F910F91FF90EF90DF9084 +:1002600008951F920F920FB60F9211242F938F9320 +:100270009F93EF93FF939091CE008EB38430F1F46F +:10028000E0919901F0919A019083E0919901F091A8 +:100290009A01CF01019690939A018093990189590F +:1002A000914021F489E191E0928381839FB7F89492 +:1002B00080919D018F5F80939D019FBFFF91EF9182 +:1002C0009F918F912F910F900FBE0F901F901895B7 +:1002D000FC01858580FF02C05F9808955F9A0895AC +:1002E00080E091E0D5C580E091E088C584B7877F44 +:1002F00084BF28E10FB6F89420936000109260004C +:100300000FBE87E690E09093CD008093CC0086E00E +:100310008093CA001092C8002093C900539A5A9A39 +:100320008AB180638AB98BB180638BB983D284E050 +:1003300085BD5F9A579A08950F931F93CF93DF93CC +:10034000D5DF2FB7F8948EE991E090931F02809348 +:100350001E0290932102809320022FBF2FB7F894A2 +:1003600089E191E090939A018093990190939C0187 +:1003700080939B012FBF7894CEE9D1E003E08FB743 +:10038000F894909122028FBF903809F180E091E0BB +:10039000ABD497FD1CC0E0911E02F0911F02808338 +:1003A000E0911E02F0911F02CF01019690931F026F +:1003B00080931E028E51924011F4D283C1839FB765 +:1003C000F894809122028F5F809322029FBF8FB7A3 +:1003D000F89410919D018FBFA89902C0113678F151 +:1003E000A89A80919D01882361F05D980093160181 +:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 +:1004000011501123B1F780911601882351F080918A +:10041000160181508093160180911601882309F4FA +:100420005D9A80911701882351F0809117018150C6 +:100430008093170180911701882309F45C9A8FB784 +:10044000F894909122028FBF992369F08EE991E090 +:1004500084DE982F8091C80085FFFCCF9093CE005A +:100460005C980093170180E091E095D42AD487CF5F +:10047000DA01923049F0933061F09130F9F4E8E913 +:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 +:1004900019C0813049F0813018F0823079F408C0F9 +:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 +:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 +:1004C00020E030E0ED93FC93C901089528E030E08E +:1004D00040E003C04F5F220F331F28173907D0F3C6 +:1004E000842F8295807F08958093E9008091EB00AE +:1004F00081608093EB001092ED006093EC004093DC +:10050000ED008091EE00881F8827881F08951092C3 +:10051000F40090E09093E9001092F0001092E8004F +:100520001092ED008091EB008E7F8093EB009F5F37 +:10053000953081F708958091270288238CF403C0B9 +:100540008EB38823B1F08091E80082FFF9CF8091CB +:10055000E8008B778093E80008958EB3882349F0F4 +:100560008091E80080FFF9CF8091E8008E7780933A +:10057000E800089594E68091EC0080FF05C080912A +:10058000E80080FF05C023C08091E80082FD1FC005 +:100590008EB3882311F482E008958EB3853011F470 +:1005A00083E008958091EB0085FF02C081E008950B +:1005B0008091E10082FFDFCF8091E1008B7F80930B +:1005C000E100992311F484E008959150D4CF80E0A4 +:1005D00008959C0140912D0250912E024617570715 +:1005E00018F4F90120E038C06115710511F0AB0174 +:1005F000F8CF8091E8008E778093E80040E050E0EB +:10060000F0CF8091E80083FF02C081E008958091DF +:10061000E80082FD2DC08EB3882381F18EB3853032 +:1006200079F18091E80080FF17C09091F20006C038 +:1006300081918093F100415050409F5F41155105D9 +:1006400011F09830A8F320E0983009F421E080916F +:10065000E8008E778093E8004115510591F622233A +:1006600081F606C08EB3882349F08EB3853041F001 +:100670008091E80082FFF6CF80E0089582E008953F +:1006800083E008959C0140912D0250912E0246175F +:10069000570710F490E03BC06115710511F0AB01F4 +:1006A000F9CF8091E8008E778093E80040E050E039 +:1006B000F1CF8091E80083FF02C081E0089580912E +:1006C000E80082FD30C08EB3882399F18EB3853067 +:1006D00091F18091E80080FF1AC08091F20009C07A +:1006E000F9012F5F3F4FE491E093F10041505040FA +:1006F0008F5F4115510511F0883090F390E08830FC +:1007000009F491E08091E8008E778093E80041152C +:10071000510579F6992369F606C08EB3882349F00E +:100720008EB3853041F08091E80082FFF6CF80E003 +:10073000089582E0089583E008959C016115710594 +:1007400029F48091E8008B778093E800F90120C0BC +:100750008091E80083FF02C081E008958EB3882372 +:1007600039F18EB3853031F18091E80082FFF0CF0E +:1007700006C08091F10081936150704021F080911A +:10078000F2008823B1F78091E8008B778093E8002E +:1007900061157105E9F606C08EB3882349F08EB362 +:1007A000853041F08091E80080FFF6CF80E0089529 +:1007B00082E0089583E0089542D044D01EBA10929A +:1007C0002502109224021092230284E089BD89B58B +:1007D000826089BD09B400FEFDCF8091D800982FBA +:1007E0009F779093D80080688093D80080916300B1 +:1007F0008E7F809363008091D8008F7D8093D80096 +:100800008091E0008E7F8093E0008091E1008E7FF8 +:100810008093E1008091E20081608093E20080910A +:10082000E100877F8093E1008091E20088608093FF +:10083000E2000895C1DF81E08093260208951092BE +:10084000E20008951092E10008951F920F920FB6F2 +:100850000F9211241F932F933F934F935F936F93A6 +:100860007F938F939F93AF93BF93EF93FF93E9EEA3 +:10087000F0E0108117701082E0EFF0E08081877F58 +:1008800080837894C3D0F894A9EEB0E01C92E0EF96 +:10089000F0E08081886080831C93FF91EF91BF918D +:1008A000AF919F918F917F916F915F914F913F9108 +:1008B0002F911F910F900FBE0F901F9018951F92B0 +:1008C0000F920FB60F9211242F933F934F935F9384 +:1008D0006F937F938F939F93AF93BF93EF93FF9308 +:1008E0008091E10080FF1BC08091E20080FF17C073 +:1008F0008091E1008E7F8093E1008091E2008E7F05 +:100900008093E2008091E20080618093E200809118 +:10091000D80080628093D80019BC1EBAD1D18091D2 +:10092000E10084FF29C08091E20084FF25C084E0BB +:1009300089BD89B5826089BD09B400FEFDCF809173 +:10094000D8008F7D8093D8008091E1008F7E8093C6 +:10095000E1008091E2008F7E8093E2008091E200CE +:1009600081608093E20080912502882311F481E068 +:1009700001C084E08EBBA4D18091E10083FF27C039 +:100980008091E20083FF23C08091E100877F809304 +:10099000E10082E08EBB109225028091E1008E7F03 +:1009A0008093E1008091E2008E7F8093E20080914D +:1009B000E20080618093E200AADD80E060E042E036 +:1009C00093DD8091F00088608093F00079D1809170 +:1009D000E10082FF0AC08091E20082FF06C08091A0 +:1009E000E1008B7F8093E1006BD1FF91EF91BF918C +:1009F000AF919F918F917F916F915F914F913F91B7 +:100A00002F910F900FBE0F901F9018951F93DF939B +:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D +:100A2000CDBFE7E2F2E08091F100819322E0EF3266 +:100A3000F207C9F78091270230912802353009F476 +:100A400087C0363040F43130C9F1313070F0333086 +:100A500009F01DC133C0383009F4EFC0393009F452 +:100A6000FEC0363009F013C192C0803821F08238C0 +:100A700009F00DC108C090912302809124028823BF +:100A800099F0926011C080912B0287708093E900E9 +:100A90008091EB0090E025E0969587952A95E1F707 +:100AA000982F91701092E9008091E800877F8093E1 +:100AB000E8009093F1001092F100CAC0882319F069 +:100AC000823009F0E4C090E08F719070009721F0BF +:100AD000029709F0DDC00CC080912902813009F035 +:100AE000D7C010922402333069F5809324022AC0C3 +:100AF00080912902882331F520912B02277009F477 +:100B0000C7C02093E9008091EB0080FFC1C0333063 +:100B100021F48091EB00806213C08091EB00806132 +:100B20008093EB0081E090E002C0880F991F2A9526 +:100B3000E2F78093EA001092EA008091EB0088606F +:100B40008093EB001092E9008091E800877F83C0DA +:100B5000882309F09CC0109129028091E800877FCA +:100B60008093E800E8DC04C08EB3882309F490C0C9 +:100B70008091E80080FFF8CF812F8F7711F492E009 +:100B800001C093E09EBB80688093E30081C08058E1 +:100B9000823008F07CC08091290290912A0223E0E3 +:100BA0008C3D920799F55FB7F894DE0115964EE0FB +:100BB00020E030E061E2E42FF0E0609357008491A0 +:100BC00020FF03C082958F704F5F982F9F70892FF1 +:100BD000805D8A3308F0895F8C9311961C9211977F +:100BE0002F5F3F4F12962431310529F75FBF8AE20C +:100BF0008B8383E08C838091E800877F8093E8007B +:100C0000CE0103966AE270E0E4DC11C060912B0231 +:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 +:100C2000E800877F8093E80089819A812BDD80919D +:100C3000E8008B778093E8002BC0803841F58091E5 +:100C4000E800877F8093E800809125028093F1007F +:100C50008091E8008E778093E8006DDC19C08823CE +:100C6000B1F490912902923098F48091E800877F46 +:100C70008093E800909325025EDC80912502882312 +:100C800011F483E001C084E08EBB2DDB01C028DBC2 +:100C90008091E80083FF0AC08091EB00806280931E +:100CA000EB008091E800877F8093E800AC960FB658 +:100CB000F894DEBF0FBECDBFCF91DF911F91089595 +:100CC00008951F938EB3882361F01091E90010926C +:100CD000E9008091E80083FF01C098DE177010934F +:100CE000E9001F9108950895FC018EB3843021F529 +:100CF00087859089A189B2890097A105B105E1F0A6 +:100D000085818093E9008091E80082FF15C0809181 +:100D1000F200882319F42FEF3FEF04C08091F10017 +:100D2000282F30E08091F200882341F48091E80080 +:100D30008B778093E80002C02FEF3FEFC901089541 +:100D4000FC018EB3843011F587859089A189B28921 +:100D50000097A105B105D1F081818093E9008091D0 +:100D6000F2008823A9F09091E8008091E8008E7746 +:100D70008093E80095FD0CC0FDDB982F882349F493 +:100D80008091E8008E778093E80003C092E001C074 +:100D900090E0892F0895FC018EB3843051F487854B +:100DA0009089A189B2890097A105B10511F0CF0101 +:100DB000C7CF08951F93FC01162F8EB38430D9F44A +:100DC00087859089A189B2890097A105B10599F01D +:100DD00081818093E9008091E80085FD08C08091C1 +:100DE000E8008E778093E800C5DB882329F4109310 +:100DF000F10080E001C082E01F9108950F931F93DE +:100E0000CF93DF93EC010D96FC0189E0DF011D9289 +:100E10008A95E9F72A813B8109818C81882311F425 +:100E200010E001C014E0C90151DB182B1260802FC3 +:100E300061E8412F59DB882329F12E813F810D8103 +:100E40008885882311F410E001C014E0C9013EDB5D +:100E5000182B1260802F60E8412F46DB882391F029 +:100E60002A853B8509858C85882311F410E001C013 +:100E700014E0C9012BDB182B1260802F61EC412F8D +:100E800033DB01C080E0DF91CF911F910F91089576 +:100E9000CF93DF93EC018091E80083FF60C08881ED +:100EA00090E020912B0230912C022817390709F08D +:100EB00056C080912802813261F0823220F4803263 +:100EC00009F04DC019C0823269F1833209F047C080 +:100ED00038C080912702813A09F041C08091E80032 +:100EE000877F8093E800CE010F9667E070E071DBAA +:100EF0008091E8008B7713C080912702813279F5C9 +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E013DCCE013ED98091E8008E7780939B +:100F2000E8001DC0809127028132C9F48091E80059 +:100F3000877F8093E800809129028D87CE01C8D9F0 +:100F40000DC080912702813251F48091E800877FA3 +:100F50008093E800CE0160912902C5DEECDADF91D2 +:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 +:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 +:100F800020F0A21BB30BE40BF50B661F771F881F25 +:100F9000991F1A9469F760957095809590959B01BB +:0C0FA000AC01BD01CF010895F894FFCF13 +:100FAC0000034000000440000002080000000000A4 +:060FBC000000000000002F +:103000004BC0000064C0000062C0000060C000004F +:103010005EC000005CC000005AC0000058C0000044 +:1030200056C0000054C0000052C00000EEC40000B2 +:103030004EC000004CC000004AC0000048C0000064 +:1030400046C0000044C0000042C0000040C0000074 +:103050003EC000003CC000003AC0000038C0000084 +:1030600036C0000034C0000032C0000030C0000094 +:103070002EC000002CC000002AC0000028C00000A4 +:1030800026C0000024C0000022C0000020C00000B4 +:103090001EC000001CC0000011241FBECFEFD2E0F4 +:1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B +:1030B00005900D92AA33B107D9F711E0AAE3B1E068 +:1030C00001C01D92AB35B107E1F772D314C698CF9A +:1030D000982F15C08091F200882371F48091E80048 +:1030E0008B7F8093E80003C08EB3882351F08091DA +:1030F000E80082FFF9CF02C08091F100915099233E +:1031000049F7089520914A01309149018091480181 +:103110009091470180933F0190934001C9018093B2 +:103120004101909342010895DF93CF9300D000D0E6 +:1031300000D0CDB7DEB780914501843009F45AC084 +:10314000853030F4813059F0833009F0D7C01FC08A +:10315000853009F4A0C0863009F0D0C0C3C080918A +:103160004601823008F0CAC0CDDF80914601882335 +:1031700061F480913F019091400123E0FC01209394 +:103180005700E89507B600FCFDCF85E008C08091A8 +:103190004601882311F0823029F4B4DF89E080935E +:1031A0000101ACC0813009F0A9C020E030E040E06E +:1031B00050E0F90184918F3F81F0CA01AA27BB2713 +:1031C00080933E013093400120933F018AE0809339 +:1031D000010185E080933B0191C02F5F3F4F4F4F2E +:1031E0005F4F2030F0E33F07F0E04F07F0E05F076C +:1031F00001F784C080914601833051F581E08093CE +:103200003A0180914B0190914C01892B71F0809192 +:103210004701813009F072C080914A0190914901C3 +:1032200090933D0180933C0169C0809147018823C0 +:1032300061F42CE088E190E00FB6F894A8958093B3 +:1032400060000FBE2093600059C01092000156C06C +:10325000882309F053C0809147018F3F09F04EC089 +:10326000E0E0F0E093E085E090935700E89507B642 +:1032700000FCFDCF80935700E89507B600FCFDCF1A +:10328000E058FF4F20E3E030F20771F781E18093CF +:103290005700E89533C0DE011196E5E0F1E083E0E8 +:1032A00001900D928150E1F7DE011496E2E0F1E029 +:1032B00083E001900D928150E1F790914701809158 +:1032C0004601882329F4FE01E90FF11D818107C021 +:1032D0008130A1F4FE01BC97E90FF11D808180933C +:1032E00050010CC080914601833041F48091470128 +:1032F000882321F48091480180933E0126960FB6E1 +:10330000F894DEBF0FBECDBFCF91DF9108952F920D +:103310003F924F925F926F927F929F92AF92BF9235 +:10332000CF92DF92EF92FF920F931F93CF93DF9391 +:103330008091590190915A0190934C0180934B01D7 +:1033400080914D01882351F080914D0181508093EF +:103350004D0180914D01882309F45D9A80914E01C1 +:10336000882351F080914E01815080934E018091CD +:103370004E01882309F45C9A80915401833009F44A +:10338000B2C1843030F4813071F0823009F0E3C191 +:1033900011C1853009F4C5C1853008F4BAC1863041 +:1033A00009F0D9C1CDC15C9883E080934E01809132 +:1033B000E800877F8093E80080913A01882329F014 +:1033C000B3DE5D9A5C9A10923A0120914B013091E4 +:1033D0004C012115310529F42AC08EB3882309F444 +:1033E000BAC18091E80082FFF8CF8091F10080930C +:1033F00045012150304030934C0120934B01E6E4CD +:10340000F1E00CC08091F10081932150304081E0C7 +:10341000EB34F80719F43183208308C08091F2005F +:10342000882381F730934C0120934B017DDE8091FE +:103430000101853009F0BAC080914B0190914C0197 +:10344000892B21F482E080930101B0C08AE140DE43 +:1034500080913F018F713CDEC0914101D0914201CA +:1034600020913F013091400121968E01021B130BE8 +:10347000219780914601882309F093C01801369462 +:103480002794C901A0913E01B0E09C01AD0162E02A +:10349000E62EF12C012D112DE20EF31E041F151F37 +:1034A00059016A0190E099249394B5E0A3E048C0E3 +:1034B0008091F200882371F48091E8008B7F8093E3 +:1034C000E80004C08EB3882309F445C18091E80068 +:1034D00082FFF8CF0894210831088091F100682F0D +:1034E0008091F100782FF5010B0190925700E8953B +:1034F00011249F5F903419F021143104A1F4F901D3 +:10350000B0935700E89507B600FCFDCF21143104B5 +:1035100051F0F701A0935700E89507B600FCFDCFE6 +:10352000A801970190E042E0442E512C612C712CAF +:10353000E40CF51C061D171DA40CB51CC61CD71CDD +:103540002114310409F0B4CFD0934001C0933F015E +:1035500081E180935700E89527C08091F20088238D +:1035600071F48091E8008B7F8093E80004C08EB3F3 +:10357000882309F4F0C08091E80082FFF8CF6091C1 +:10358000F10080913F0190914001A7D380913F01CC +:103590009091400101969093400180933F0101502A +:1035A000104001151105C9F680E192DD8091E80017 +:1035B0008B7FC3C08091E800877F8093E8005D988F +:1035C00083E080934D0104C08EB3882309F4C3C007 +:1035D0008091E80080FFF8CF80910101893091F05F +:1035E0008A3069F480914601813049F480913F012D +:1035F000909140018093F1009093F1009BC08091E5 +:10360000500196C0609141017091420120913F01AB +:10361000309140016F5F7F4F7B01E21AF30A6150E6 +:10362000704080914601882389F58701169507959A +:10363000C901A0913E01B0E09C01AD011FC0809185 +:10364000F200803271F48091E8008E7F8093E80070 +:1036500004C08EB3882309F47EC08091E80080FF07 +:10366000F8CFF901859194918093F1009093F10046 +:10367000015010402E5F3F4F4F4F5F4F0115110516 +:10368000F1F67093400160933F0129C0823039F513 +:1036900023C08091F200803271F48091E8008E7F27 +:1036A0008093E80004C08EB3882309F454C080914D +:1036B000E80080FFF8CF00913F0110914001C80160 +:1036C00004D38093F1000F5F1F4F109340010093CC +:1036D0003F010894E108F108E114F104D1F682E019 +:1036E0008093010127C08091E800877F8093E800E4 +:1036F00080913B018093F1001092F1001092F10053 +:103700001092F100809101018093F1001092F1007C +:1037100011C08091E800877F8093E80010923B0100 +:1037200019C08091E800877F8093E80080910101B3 +:103730008093F1008091E8008E7F8093E8000AC0BA +:103740008091E800877F8093E8005D9A5C9A82E030 +:103750008093010187D0DF91CF911F910F91FF904E +:10376000EF90DF90CF90BF90AF909F907F906F9041 +:103770005F904F903F902F9008952BD181E085BFAF +:1037800015BE089584B7877F84BF88E10FB6F8948B +:1037900080936000109260000FBE81E085BF82E0E0 +:1037A00085BF8AB180638AB98BB180638BB90CC144 +:1037B000E9DF789401C080D2809100018823D9F795 +:1037C00080913A018823B9F7D8DFE0913C01F0916C +:1037D0003D010995FA01923071F0933089F09130F2 +:1037E00029F488E091E022E130E019C080E090E027 +:1037F00020E030E014C08AE191E02BE130E00FC01E +:10380000882339F480913501282F30E085E391E059 +:1038100006C080914301282F30E083E491E091833A +:103820008083C90108958091EB0081608093EB0053 +:103830001092ED006093EC004093ED008091EE005B +:10384000881F8827881F08951092F4001092F000B6 +:103850001092E8001092ED00EBEEF0E080818E7F98 +:10386000808308958091530188238CF403C08EB324 +:103870008823B1F08091E80082FFF9CF8091E800C1 +:103880008B7F8093E80008958EB3882349F0809160 +:10389000E80080FFF9CF8091E8008E7F8093E800F8 +:1038A00008959C014091590150915A0146175707BC +:1038B00018F4F90120E038C06115710511F0AB0171 +:1038C000F8CF8091E8008E7F8093E80040E050E0E0 +:1038D000F0CF8091E80083FF02C081E008958091DD +:1038E000E80082FD2DC08EB3882381F18EB3853030 +:1038F00079F18091E80080FF17C09091F20006C036 +:1039000081918093F100415050409F5F41155105D6 +:1039100011F09032A8F320E0903209F421E0809178 +:10392000E8008E7F8093E8004115510591F622232F +:1039300081F606C08EB3882349F08EB3853041F0FE +:103940008091E80082FFF6CF80E0089582E008953C +:1039500083E0089554D056D01EBA1092510184E0ED +:1039600089BD89B5826089BD09B400FEFDCF809113 +:10397000D800982F9F779093D80080688093D800C4 +:10398000809163008E7F809363008091D8008F7D4B +:103990008093D8008091E0008E7F8093E00080913A +:1039A000E1008E7F8093E1008091E200816080934E +:1039B000E2008091E100877F8093E1008091E20046 +:1039C00088608093E2000895C5DF81E08093520112 +:1039D0000895C0DFE0EEF0E0808181608083E8ED53 +:1039E000F0E080818F7780830AD00CD019BCE3E6A9 +:1039F000F0E08081816080831092520108951092DE +:103A0000E20008951092E10008951F920F920FB600 +:103A10000F9211242F933F934F935F936F937F9354 +:103A20008F939F93AF93BF93EF93FF938091E100A8 +:103A300080FF1BC08091E20080FF17C08091E100F1 +:103A40008E7F8093E1008091E2008E7F8093E20080 +:103A50008091E20080618093E2008091D8008062D2 +:103A60008093D80019BC1EBA26D18091E10084FF52 +:103A700029C08091E20084FF25C084E089BD89B51A +:103A8000826089BD09B400FEFDCF8091D8008F7D92 +:103A90008093D8008091E1008F7E8093E100809137 +:103AA000E2008F7E8093E2008091E200816080934B +:103AB000E20080915101882311F481E001C084E08B +:103AC0008EBBF9D08091E10083FF22C08091E2009B +:103AD00083FF1EC08091E100877F8093E10082E038 +:103AE0008EBB109251018091E1008E7F8093E100A6 +:103AF0008091E2008E7F8093E2008091E2008061FD +:103B00008093E200A1DE80E060E042E28CDED3D070 +:103B10008091E10082FF0AC08091E20082FF06C02E +:103B20008091E1008B7F8093E100C5D0FF91EF9100 +:103B3000BF91AF919F918F917F916F915F914F91C5 +:103B40003F912F910F900FBE0F901F9018951F93CC +:103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE +:103B6000F100819381E0EB35F807C9F7909153019B +:103B700080915401853011F1863040F48130B9F0E4 +:103B8000813070F0833009F081C011C0883009F4B1 +:103B900053C0893009F462C0863009F077C02DC067 +:103BA000903809F474C0923809F070C070C099233D +:103BB00009F46DC0923009F069C069C0992309F019 +:103BC00065C0109155018091E800877F8093E800DF +:103BD00049DE04C08EB3882309F459C08091E800FF +:103BE00080FFF8CF812F8F7711F492E001C093E02E +:103BF0009EBB80688093E3004AC09058923008F0E2 +:103C000045C0809155019091560160915701AE01D8 +:103C10004F5F5F4FDFDDBC010097C9F18091E80085 +:103C2000877F8093E80089819A813BDE8091E8005C +:103C30008B7F8093E8002BC0903841F58091E8009D +:103C4000877F8093E800809151018093F1008091FB +:103C5000E8008E7F8093E80005DE19C09923B1F457 +:103C600090915501923098F48091E800877F80937D +:103C7000E80090935101F6DD80915101882311F401 +:103C800083E001C084E08EBB16D001C040DB809190 +:103C9000E80083FF0AC08091EB0080628093EB0014 +:103CA0008091E800877F8093E8000F900F90CF917C +:103CB000DF911F91089508958EB3882329F0809194 +:103CC000E80083FF01C043CF0895F999FECF92BD6C +:103CD00081BDF89A992780B50895262FF999FECFCE +:103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 +:0A3CF0000FBE01960895F894FFCF6F +:103CFA0001021E948920DCFB120110010000002041 +:103D0A00EB03EF2F00000001000109021B00010173 +:103D1A000080320904000000FE01020009210300AC +:0A3D2A0000000C000104030904006E +:0400000300003000C9 +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c index 7bed831f27f..18c761f7a94 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c @@ -1,728 +1,728 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the DFU class bootloader. This file contains the complete bootloader logic. - */ - -#define INCLUDE_FROM_BOOTLOADER_C -#include "Arduino-usbdfu.h" - -/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application - * jumped to via an indirect jump to location 0x0000 (or other location specified by the host). - */ -bool RunBootloader = true; - -/** Flag to indicate if the bootloader is waiting to exit. When the host requests the bootloader to exit and - * jump to the application address it specifies, it sends two sequential commands which must be properly - * acknowledged. Upon reception of the first the RunBootloader flag is cleared and the WaitForExit flag is set, - * causing the bootloader to wait for the final exit command before shutting down. - */ -bool WaitForExit = false; - -/** Current DFU state machine state, one of the values in the DFU_State_t enum. */ -uint8_t DFU_State = dfuIDLE; - -/** Status code of the last executed DFU command. This is set to one of the values in the DFU_Status_t enum after - * each operation, and returned to the host when a Get Status DFU request is issued. - */ -uint8_t DFU_Status = OK; - -/** Data containing the DFU command sent from the host. */ -DFU_Command_t SentCommand; - -/** Response to the last issued Read Data DFU command. Unlike other DFU commands, the read command - * requires a single byte response from the bootloader containing the read data when the next DFU_UPLOAD command - * is issued by the host. - */ -uint8_t ResponseByte; - -/** Pointer to the start of the user application. By default this is 0x0000 (the reset vector), however the host - * may specify an alternate address when issuing the application soft-start command. - */ -AppPtr_t AppStartPtr = (AppPtr_t)0x0000; - -/** 64-bit flash page number. This is concatenated with the current 16-bit address on USB AVRs containing more than - * 64KB of flash memory. - */ -uint8_t Flash64KBPage = 0; - -/** Memory start address, indicating the current address in the memory being addressed (either FLASH or EEPROM - * depending on the issued command from the host). - */ -uint16_t StartAddr = 0x0000; - -/** Memory end address, indicating the end address to read to/write from in the memory being addressed (either FLASH - * of EEPROM depending on the issued command from the host). - */ -uint16_t EndAddr = 0x0000; - - -/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ -volatile struct -{ - uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ - uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ - uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ -} PulseMSRemaining; - -/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start - * the loaded application code. - */ -int main(void) -{ - /* Configure hardware required by the bootloader */ - SetupHardware(); - - /* Enable global interrupts so that the USB stack can function */ - sei(); - - /* Run the USB management task while the bootloader is supposed to be running */ - while (RunBootloader || WaitForExit) - USB_USBTask(); - - /* Reset configured hardware back to their original states for the user application */ - ResetHardware(); - - /* Start the user application */ - AppStartPtr(); -} - -/** Configures all hardware required for the bootloader. */ -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Disable clock division */ -// clock_prescale_set(clock_div_1); - - /* Relocate the interrupt vector table to the bootloader section */ - MCUCR = (1 << IVCE); - MCUCR = (1 << IVSEL); - - LEDs_Init(); - - /* Initialize the USB subsystem */ - USB_Init(); -} - -/** Resets all configured hardware required for the bootloader back to their original states. */ -void ResetHardware(void) -{ - /* Shut down the USB subsystem */ - USB_ShutDown(); - - /* Relocate the interrupt vector table back to the application section */ - MCUCR = (1 << IVCE); - MCUCR = 0; -} - -/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific - * control requests that are not handled internally by the USB library (including the DFU commands, which are - * all issued via the control endpoint), so that they can be handled appropriately for the application. - */ -void EVENT_USB_Device_UnhandledControlRequest(void) -{ - /* Get the size of the command and data from the wLength value */ - SentCommand.DataSize = USB_ControlRequest.wLength; - - /* Turn off TX LED(s) once the TX pulse period has elapsed */ - if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) - LEDs_TurnOffLEDs(LEDMASK_TX); - - /* Turn off RX LED(s) once the RX pulse period has elapsed */ - if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) - LEDs_TurnOffLEDs(LEDMASK_RX); - - switch (USB_ControlRequest.bRequest) - { - case DFU_DNLOAD: - LEDs_TurnOnLEDs(LEDMASK_RX); - PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; - - Endpoint_ClearSETUP(); - - /* Check if bootloader is waiting to terminate */ - if (WaitForExit) - { - /* Bootloader is terminating - process last received command */ - ProcessBootloaderCommand(); - - /* Turn off TX/RX status LEDs so that they're not left on when application starts */ - LEDs_TurnOffLEDs(LEDMASK_TX); - LEDs_TurnOffLEDs(LEDMASK_RX); - - /* Indicate that the last command has now been processed - free to exit bootloader */ - WaitForExit = false; - } - - /* If the request has a data stage, load it into the command struct */ - if (SentCommand.DataSize) - { - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - /* First byte of the data stage is the DNLOAD request's command */ - SentCommand.Command = Endpoint_Read_Byte(); - - /* One byte of the data stage is the command, so subtract it from the total data bytes */ - SentCommand.DataSize--; - - /* Load in the rest of the data stage as command parameters */ - for (uint8_t DataByte = 0; (DataByte < sizeof(SentCommand.Data)) && - Endpoint_BytesInEndpoint(); DataByte++) - { - SentCommand.Data[DataByte] = Endpoint_Read_Byte(); - SentCommand.DataSize--; - } - - /* Process the command */ - ProcessBootloaderCommand(); - } - - /* Check if currently downloading firmware */ - if (DFU_State == dfuDNLOAD_IDLE) - { - if (!(SentCommand.DataSize)) - { - DFU_State = dfuIDLE; - } - else - { - /* Throw away the filler bytes before the start of the firmware */ - DiscardFillerBytes(DFU_FILLER_BYTES_SIZE); - - /* Throw away the packet alignment filler bytes before the start of the firmware */ - DiscardFillerBytes(StartAddr % FIXED_CONTROL_ENDPOINT_SIZE); - - /* Calculate the number of bytes remaining to be written */ - uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); - - if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Write flash - { - /* Calculate the number of words to be written from the number of bytes to be written */ - uint16_t WordsRemaining = (BytesRemaining >> 1); - - union - { - uint16_t Words[2]; - uint32_t Long; - } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; - - uint32_t CurrFlashPageStartAddress = CurrFlashAddress.Long; - uint8_t WordsInFlashPage = 0; - - while (WordsRemaining--) - { - /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ - if (!(Endpoint_BytesInEndpoint())) - { - Endpoint_ClearOUT(); - - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Write the next word into the current flash page */ - boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_Word_LE()); - - /* Adjust counters */ - WordsInFlashPage += 1; - CurrFlashAddress.Long += 2; - - /* See if an entire page has been written to the flash page buffer */ - if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining)) - { - /* Commit the flash page to memory */ - boot_page_write(CurrFlashPageStartAddress); - boot_spm_busy_wait(); - - /* Check if programming incomplete */ - if (WordsRemaining) - { - CurrFlashPageStartAddress = CurrFlashAddress.Long; - WordsInFlashPage = 0; - - /* Erase next page's temp buffer */ - boot_page_erase(CurrFlashAddress.Long); - boot_spm_busy_wait(); - } - } - } - - /* Once programming complete, start address equals the end address */ - StartAddr = EndAddr; - - /* Re-enable the RWW section of flash */ - boot_rww_enable(); - } - else // Write EEPROM - { - while (BytesRemaining--) - { - /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ - if (!(Endpoint_BytesInEndpoint())) - { - Endpoint_ClearOUT(); - - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Read the byte from the USB interface and write to to the EEPROM */ - eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_Byte()); - - /* Adjust counters */ - StartAddr++; - } - } - - /* Throw away the currently unused DFU file suffix */ - DiscardFillerBytes(DFU_FILE_SUFFIX_SIZE); - } - } - - Endpoint_ClearOUT(); - - Endpoint_ClearStatusStage(); - - break; - case DFU_UPLOAD: - Endpoint_ClearSETUP(); - - LEDs_TurnOnLEDs(LEDMASK_TX); - PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - if (DFU_State != dfuUPLOAD_IDLE) - { - if ((DFU_State == dfuERROR) && IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank Check - { - /* Blank checking is performed in the DFU_DNLOAD request - if we get here we've told the host - that the memory isn't blank, and the host is requesting the first non-blank address */ - Endpoint_Write_Word_LE(StartAddr); - } - else - { - /* Idle state upload - send response to last issued command */ - Endpoint_Write_Byte(ResponseByte); - } - } - else - { - /* Determine the number of bytes remaining in the current block */ - uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); - - if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read FLASH - { - /* Calculate the number of words to be written from the number of bytes to be written */ - uint16_t WordsRemaining = (BytesRemaining >> 1); - - union - { - uint16_t Words[2]; - uint32_t Long; - } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; - - while (WordsRemaining--) - { - /* Check if endpoint is full - if so clear it and wait until ready for next packet */ - if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) - { - Endpoint_ClearIN(); - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Read the flash word and send it via USB to the host */ - #if (FLASHEND > 0xFFFF) - Endpoint_Write_Word_LE(pgm_read_word_far(CurrFlashAddress.Long)); - #else - Endpoint_Write_Word_LE(pgm_read_word(CurrFlashAddress.Long)); - #endif - - /* Adjust counters */ - CurrFlashAddress.Long += 2; - } - - /* Once reading is complete, start address equals the end address */ - StartAddr = EndAddr; - } - else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM - { - while (BytesRemaining--) - { - /* Check if endpoint is full - if so clear it and wait until ready for next packet */ - if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) - { - Endpoint_ClearIN(); - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Read the EEPROM byte and send it via USB to the host */ - Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)StartAddr)); - - /* Adjust counters */ - StartAddr++; - } - } - - /* Return to idle state */ - DFU_State = dfuIDLE; - } - - Endpoint_ClearIN(); - - Endpoint_ClearStatusStage(); - break; - case DFU_GETSTATUS: - Endpoint_ClearSETUP(); - - /* Write 8-bit status value */ - Endpoint_Write_Byte(DFU_Status); - - /* Write 24-bit poll timeout value */ - Endpoint_Write_Byte(0); - Endpoint_Write_Word_LE(0); - - /* Write 8-bit state value */ - Endpoint_Write_Byte(DFU_State); - - /* Write 8-bit state string ID number */ - Endpoint_Write_Byte(0); - - Endpoint_ClearIN(); - - Endpoint_ClearStatusStage(); - break; - case DFU_CLRSTATUS: - Endpoint_ClearSETUP(); - - /* Reset the status value variable to the default OK status */ - DFU_Status = OK; - - Endpoint_ClearStatusStage(); - break; - case DFU_GETSTATE: - Endpoint_ClearSETUP(); - - /* Write the current device state to the endpoint */ - Endpoint_Write_Byte(DFU_State); - - Endpoint_ClearIN(); - - Endpoint_ClearStatusStage(); - break; - case DFU_ABORT: - Endpoint_ClearSETUP(); - - /* Turn off TX/RX status LEDs so that they're not left on when application starts */ - LEDs_TurnOffLEDs(LEDMASK_TX); - LEDs_TurnOffLEDs(LEDMASK_RX); - - /* Reset the current state variable to the default idle state */ - DFU_State = dfuIDLE; - - Endpoint_ClearStatusStage(); - break; - } -} - -/** Routine to discard the specified number of bytes from the control endpoint stream. This is used to - * discard unused bytes in the stream from the host, including the memory program block suffix. - * - * \param[in] NumberOfBytes Number of bytes to discard from the host from the control endpoint - */ -static void DiscardFillerBytes(uint8_t NumberOfBytes) -{ - while (NumberOfBytes--) - { - if (!(Endpoint_BytesInEndpoint())) - { - Endpoint_ClearOUT(); - - /* Wait until next data packet received */ - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - else - { - Endpoint_Discard_Byte(); - } - } -} - -/** Routine to process an issued command from the host, via a DFU_DNLOAD request wrapper. This routine ensures - * that the command is allowed based on the current secure mode flag value, and passes the command off to the - * appropriate handler function. - */ -static void ProcessBootloaderCommand(void) -{ - /* Check if device is in secure mode */ -// if (IsSecure) -// { -// /* Don't process command unless it is a READ or chip erase command */ -// if (!(((SentCommand.Command == COMMAND_WRITE) && -// IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) || -// (SentCommand.Command == COMMAND_READ))) -// { -// /* Set the state and status variables to indicate the error */ -// DFU_State = dfuERROR; -// DFU_Status = errWRITE; -// -// /* Stall command */ -// Endpoint_StallTransaction(); -// -// /* Don't process the command */ -// return; -// } -// } - - /* Dispatch the required command processing routine based on the command type */ - switch (SentCommand.Command) - { - case COMMAND_PROG_START: - ProcessMemProgCommand(); - break; - case COMMAND_DISP_DATA: - ProcessMemReadCommand(); - break; - case COMMAND_WRITE: - ProcessWriteCommand(); - break; - case COMMAND_READ: - ProcessReadCommand(); - break; - case COMMAND_CHANGE_BASE_ADDR: - if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x03, 0x00)) // Set 64KB flash page command - Flash64KBPage = SentCommand.Data[2]; - break; - } -} - -/** Routine to concatenate the given pair of 16-bit memory start and end addresses from the host, and store them - * in the StartAddr and EndAddr global variables. - */ -static void LoadStartEndAddresses(void) -{ - union - { - uint8_t Bytes[2]; - uint16_t Word; - } Address[2] = {{.Bytes = {SentCommand.Data[2], SentCommand.Data[1]}}, - {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}}; - - /* Load in the start and ending read addresses from the sent data packet */ - StartAddr = Address[0].Word; - EndAddr = Address[1].Word; -} - -/** Handler for a Memory Program command issued by the host. This routine handles the preparations needed - * to write subsequent data from the host into the specified memory. - */ -static void ProcessMemProgCommand(void) -{ - if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Write FLASH command - IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Write EEPROM command - { - /* Load in the start and ending read addresses */ - LoadStartEndAddresses(); - - /* If FLASH is being written to, we need to pre-erase the first page to write to */ - if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) - { - union - { - uint16_t Words[2]; - uint32_t Long; - } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; - - /* Erase the current page's temp buffer */ - boot_page_erase(CurrFlashAddress.Long); - boot_spm_busy_wait(); - } - - /* Set the state so that the next DNLOAD requests reads in the firmware */ - DFU_State = dfuDNLOAD_IDLE; - } -} - -/** Handler for a Memory Read command issued by the host. This routine handles the preparations needed - * to read subsequent data from the specified memory out to the host, as well as implementing the memory - * blank check command. - */ -static void ProcessMemReadCommand(void) -{ - if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Read FLASH command - IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM command - { - /* Load in the start and ending read addresses */ - LoadStartEndAddresses(); - - /* Set the state so that the next UPLOAD requests read out the firmware */ - DFU_State = dfuUPLOAD_IDLE; - } - else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank check FLASH command - { - uint32_t CurrFlashAddress = 0; - - while (CurrFlashAddress < BOOT_START_ADDR) - { - /* Check if the current byte is not blank */ - #if (FLASHEND > 0xFFFF) - if (pgm_read_byte_far(CurrFlashAddress) != 0xFF) - #else - if (pgm_read_byte(CurrFlashAddress) != 0xFF) - #endif - { - /* Save the location of the first non-blank byte for response back to the host */ - Flash64KBPage = (CurrFlashAddress >> 16); - StartAddr = CurrFlashAddress; - - /* Set state and status variables to the appropriate error values */ - DFU_State = dfuERROR; - DFU_Status = errCHECK_ERASED; - - break; - } - - CurrFlashAddress++; - } - } -} - -/** Handler for a Data Write command issued by the host. This routine handles non-programming commands such as - * bootloader exit (both via software jumps and hardware watchdog resets) and flash memory erasure. - */ -static void ProcessWriteCommand(void) -{ - if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x03)) // Start application - { - /* Indicate that the bootloader is terminating */ - WaitForExit = true; - - /* Check if data supplied for the Start Program command - no data executes the program */ - if (SentCommand.DataSize) - { - if (SentCommand.Data[1] == 0x01) // Start via jump - { - union - { - uint8_t Bytes[2]; - AppPtr_t FuncPtr; - } Address = {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}; - - /* Load in the jump address into the application start address pointer */ - AppStartPtr = Address.FuncPtr; - } - } - else - { - if (SentCommand.Data[1] == 0x00) // Start via watchdog - { - /* Start the watchdog to reset the AVR once the communications are finalized */ - wdt_enable(WDTO_250MS); - } - else // Start via jump - { - /* Set the flag to terminate the bootloader at next opportunity */ - RunBootloader = false; - } - } - } - else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) // Erase flash - { - uint32_t CurrFlashAddress = 0; - - /* Clear the application section of flash */ - while (CurrFlashAddress < BOOT_START_ADDR) - { - boot_page_erase(CurrFlashAddress); - boot_spm_busy_wait(); - boot_page_write(CurrFlashAddress); - boot_spm_busy_wait(); - - CurrFlashAddress += SPM_PAGESIZE; - } - - /* Re-enable the RWW section of flash as writing to the flash locks it out */ - boot_rww_enable(); - - /* Memory has been erased, reset the security bit so that programming/reading is allowed */ -// IsSecure = false; - } -} - -/** Handler for a Data Read command issued by the host. This routine handles bootloader information retrieval - * commands such as device signature and bootloader version retrieval. - */ -static void ProcessReadCommand(void) -{ - const uint8_t BootloaderInfo[3] = {BOOTLOADER_VERSION, BOOTLOADER_ID_BYTE1, BOOTLOADER_ID_BYTE2}; - const uint8_t SignatureInfo[3] = {AVR_SIGNATURE_1, AVR_SIGNATURE_2, AVR_SIGNATURE_3}; - - uint8_t DataIndexToRead = SentCommand.Data[1]; - - if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read bootloader info - ResponseByte = BootloaderInfo[DataIndexToRead]; - else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Read signature byte - ResponseByte = SignatureInfo[DataIndexToRead - 0x30]; -} +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the DFU class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_BOOTLOADER_C +#include "Arduino-usbdfu.h" + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application + * jumped to via an indirect jump to location 0x0000 (or other location specified by the host). + */ +bool RunBootloader = true; + +/** Flag to indicate if the bootloader is waiting to exit. When the host requests the bootloader to exit and + * jump to the application address it specifies, it sends two sequential commands which must be properly + * acknowledged. Upon reception of the first the RunBootloader flag is cleared and the WaitForExit flag is set, + * causing the bootloader to wait for the final exit command before shutting down. + */ +bool WaitForExit = false; + +/** Current DFU state machine state, one of the values in the DFU_State_t enum. */ +uint8_t DFU_State = dfuIDLE; + +/** Status code of the last executed DFU command. This is set to one of the values in the DFU_Status_t enum after + * each operation, and returned to the host when a Get Status DFU request is issued. + */ +uint8_t DFU_Status = OK; + +/** Data containing the DFU command sent from the host. */ +DFU_Command_t SentCommand; + +/** Response to the last issued Read Data DFU command. Unlike other DFU commands, the read command + * requires a single byte response from the bootloader containing the read data when the next DFU_UPLOAD command + * is issued by the host. + */ +uint8_t ResponseByte; + +/** Pointer to the start of the user application. By default this is 0x0000 (the reset vector), however the host + * may specify an alternate address when issuing the application soft-start command. + */ +AppPtr_t AppStartPtr = (AppPtr_t)0x0000; + +/** 64-bit flash page number. This is concatenated with the current 16-bit address on USB AVRs containing more than + * 64KB of flash memory. + */ +uint8_t Flash64KBPage = 0; + +/** Memory start address, indicating the current address in the memory being addressed (either FLASH or EEPROM + * depending on the issued command from the host). + */ +uint16_t StartAddr = 0x0000; + +/** Memory end address, indicating the end address to read to/write from in the memory being addressed (either FLASH + * of EEPROM depending on the issued command from the host). + */ +uint16_t EndAddr = 0x0000; + + +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ +volatile struct +{ + uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ + uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ + uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ +} PulseMSRemaining; + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start + * the loaded application code. + */ +int main(void) +{ + /* Configure hardware required by the bootloader */ + SetupHardware(); + + /* Enable global interrupts so that the USB stack can function */ + sei(); + + /* Run the USB management task while the bootloader is supposed to be running */ + while (RunBootloader || WaitForExit) + USB_USBTask(); + + /* Reset configured hardware back to their original states for the user application */ + ResetHardware(); + + /* Start the user application */ + AppStartPtr(); +} + +/** Configures all hardware required for the bootloader. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ +// clock_prescale_set(clock_div_1); + + /* Relocate the interrupt vector table to the bootloader section */ + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + LEDs_Init(); + + /* Initialize the USB subsystem */ + USB_Init(); +} + +/** Resets all configured hardware required for the bootloader back to their original states. */ +void ResetHardware(void) +{ + /* Shut down the USB subsystem */ + USB_ShutDown(); + + /* Relocate the interrupt vector table back to the application section */ + MCUCR = (1 << IVCE); + MCUCR = 0; +} + +/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific + * control requests that are not handled internally by the USB library (including the DFU commands, which are + * all issued via the control endpoint), so that they can be handled appropriately for the application. + */ +void EVENT_USB_Device_UnhandledControlRequest(void) +{ + /* Get the size of the command and data from the wLength value */ + SentCommand.DataSize = USB_ControlRequest.wLength; + + /* Turn off TX LED(s) once the TX pulse period has elapsed */ + if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_TX); + + /* Turn off RX LED(s) once the RX pulse period has elapsed */ + if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_RX); + + switch (USB_ControlRequest.bRequest) + { + case DFU_DNLOAD: + LEDs_TurnOnLEDs(LEDMASK_RX); + PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; + + Endpoint_ClearSETUP(); + + /* Check if bootloader is waiting to terminate */ + if (WaitForExit) + { + /* Bootloader is terminating - process last received command */ + ProcessBootloaderCommand(); + + /* Turn off TX/RX status LEDs so that they're not left on when application starts */ + LEDs_TurnOffLEDs(LEDMASK_TX); + LEDs_TurnOffLEDs(LEDMASK_RX); + + /* Indicate that the last command has now been processed - free to exit bootloader */ + WaitForExit = false; + } + + /* If the request has a data stage, load it into the command struct */ + if (SentCommand.DataSize) + { + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* First byte of the data stage is the DNLOAD request's command */ + SentCommand.Command = Endpoint_Read_Byte(); + + /* One byte of the data stage is the command, so subtract it from the total data bytes */ + SentCommand.DataSize--; + + /* Load in the rest of the data stage as command parameters */ + for (uint8_t DataByte = 0; (DataByte < sizeof(SentCommand.Data)) && + Endpoint_BytesInEndpoint(); DataByte++) + { + SentCommand.Data[DataByte] = Endpoint_Read_Byte(); + SentCommand.DataSize--; + } + + /* Process the command */ + ProcessBootloaderCommand(); + } + + /* Check if currently downloading firmware */ + if (DFU_State == dfuDNLOAD_IDLE) + { + if (!(SentCommand.DataSize)) + { + DFU_State = dfuIDLE; + } + else + { + /* Throw away the filler bytes before the start of the firmware */ + DiscardFillerBytes(DFU_FILLER_BYTES_SIZE); + + /* Throw away the packet alignment filler bytes before the start of the firmware */ + DiscardFillerBytes(StartAddr % FIXED_CONTROL_ENDPOINT_SIZE); + + /* Calculate the number of bytes remaining to be written */ + uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); + + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Write flash + { + /* Calculate the number of words to be written from the number of bytes to be written */ + uint16_t WordsRemaining = (BytesRemaining >> 1); + + union + { + uint16_t Words[2]; + uint32_t Long; + } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; + + uint32_t CurrFlashPageStartAddress = CurrFlashAddress.Long; + uint8_t WordsInFlashPage = 0; + + while (WordsRemaining--) + { + /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ + if (!(Endpoint_BytesInEndpoint())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next word into the current flash page */ + boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_Word_LE()); + + /* Adjust counters */ + WordsInFlashPage += 1; + CurrFlashAddress.Long += 2; + + /* See if an entire page has been written to the flash page buffer */ + if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining)) + { + /* Commit the flash page to memory */ + boot_page_write(CurrFlashPageStartAddress); + boot_spm_busy_wait(); + + /* Check if programming incomplete */ + if (WordsRemaining) + { + CurrFlashPageStartAddress = CurrFlashAddress.Long; + WordsInFlashPage = 0; + + /* Erase next page's temp buffer */ + boot_page_erase(CurrFlashAddress.Long); + boot_spm_busy_wait(); + } + } + } + + /* Once programming complete, start address equals the end address */ + StartAddr = EndAddr; + + /* Re-enable the RWW section of flash */ + boot_rww_enable(); + } + else // Write EEPROM + { + while (BytesRemaining--) + { + /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ + if (!(Endpoint_BytesInEndpoint())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Read the byte from the USB interface and write to to the EEPROM */ + eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_Byte()); + + /* Adjust counters */ + StartAddr++; + } + } + + /* Throw away the currently unused DFU file suffix */ + DiscardFillerBytes(DFU_FILE_SUFFIX_SIZE); + } + } + + Endpoint_ClearOUT(); + + Endpoint_ClearStatusStage(); + + break; + case DFU_UPLOAD: + Endpoint_ClearSETUP(); + + LEDs_TurnOnLEDs(LEDMASK_TX); + PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + if (DFU_State != dfuUPLOAD_IDLE) + { + if ((DFU_State == dfuERROR) && IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank Check + { + /* Blank checking is performed in the DFU_DNLOAD request - if we get here we've told the host + that the memory isn't blank, and the host is requesting the first non-blank address */ + Endpoint_Write_Word_LE(StartAddr); + } + else + { + /* Idle state upload - send response to last issued command */ + Endpoint_Write_Byte(ResponseByte); + } + } + else + { + /* Determine the number of bytes remaining in the current block */ + uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); + + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read FLASH + { + /* Calculate the number of words to be written from the number of bytes to be written */ + uint16_t WordsRemaining = (BytesRemaining >> 1); + + union + { + uint16_t Words[2]; + uint32_t Long; + } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; + + while (WordsRemaining--) + { + /* Check if endpoint is full - if so clear it and wait until ready for next packet */ + if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Read the flash word and send it via USB to the host */ + #if (FLASHEND > 0xFFFF) + Endpoint_Write_Word_LE(pgm_read_word_far(CurrFlashAddress.Long)); + #else + Endpoint_Write_Word_LE(pgm_read_word(CurrFlashAddress.Long)); + #endif + + /* Adjust counters */ + CurrFlashAddress.Long += 2; + } + + /* Once reading is complete, start address equals the end address */ + StartAddr = EndAddr; + } + else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM + { + while (BytesRemaining--) + { + /* Check if endpoint is full - if so clear it and wait until ready for next packet */ + if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Read the EEPROM byte and send it via USB to the host */ + Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)StartAddr)); + + /* Adjust counters */ + StartAddr++; + } + } + + /* Return to idle state */ + DFU_State = dfuIDLE; + } + + Endpoint_ClearIN(); + + Endpoint_ClearStatusStage(); + break; + case DFU_GETSTATUS: + Endpoint_ClearSETUP(); + + /* Write 8-bit status value */ + Endpoint_Write_Byte(DFU_Status); + + /* Write 24-bit poll timeout value */ + Endpoint_Write_Byte(0); + Endpoint_Write_Word_LE(0); + + /* Write 8-bit state value */ + Endpoint_Write_Byte(DFU_State); + + /* Write 8-bit state string ID number */ + Endpoint_Write_Byte(0); + + Endpoint_ClearIN(); + + Endpoint_ClearStatusStage(); + break; + case DFU_CLRSTATUS: + Endpoint_ClearSETUP(); + + /* Reset the status value variable to the default OK status */ + DFU_Status = OK; + + Endpoint_ClearStatusStage(); + break; + case DFU_GETSTATE: + Endpoint_ClearSETUP(); + + /* Write the current device state to the endpoint */ + Endpoint_Write_Byte(DFU_State); + + Endpoint_ClearIN(); + + Endpoint_ClearStatusStage(); + break; + case DFU_ABORT: + Endpoint_ClearSETUP(); + + /* Turn off TX/RX status LEDs so that they're not left on when application starts */ + LEDs_TurnOffLEDs(LEDMASK_TX); + LEDs_TurnOffLEDs(LEDMASK_RX); + + /* Reset the current state variable to the default idle state */ + DFU_State = dfuIDLE; + + Endpoint_ClearStatusStage(); + break; + } +} + +/** Routine to discard the specified number of bytes from the control endpoint stream. This is used to + * discard unused bytes in the stream from the host, including the memory program block suffix. + * + * \param[in] NumberOfBytes Number of bytes to discard from the host from the control endpoint + */ +static void DiscardFillerBytes(uint8_t NumberOfBytes) +{ + while (NumberOfBytes--) + { + if (!(Endpoint_BytesInEndpoint())) + { + Endpoint_ClearOUT(); + + /* Wait until next data packet received */ + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + else + { + Endpoint_Discard_Byte(); + } + } +} + +/** Routine to process an issued command from the host, via a DFU_DNLOAD request wrapper. This routine ensures + * that the command is allowed based on the current secure mode flag value, and passes the command off to the + * appropriate handler function. + */ +static void ProcessBootloaderCommand(void) +{ + /* Check if device is in secure mode */ +// if (IsSecure) +// { +// /* Don't process command unless it is a READ or chip erase command */ +// if (!(((SentCommand.Command == COMMAND_WRITE) && +// IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) || +// (SentCommand.Command == COMMAND_READ))) +// { +// /* Set the state and status variables to indicate the error */ +// DFU_State = dfuERROR; +// DFU_Status = errWRITE; +// +// /* Stall command */ +// Endpoint_StallTransaction(); +// +// /* Don't process the command */ +// return; +// } +// } + + /* Dispatch the required command processing routine based on the command type */ + switch (SentCommand.Command) + { + case COMMAND_PROG_START: + ProcessMemProgCommand(); + break; + case COMMAND_DISP_DATA: + ProcessMemReadCommand(); + break; + case COMMAND_WRITE: + ProcessWriteCommand(); + break; + case COMMAND_READ: + ProcessReadCommand(); + break; + case COMMAND_CHANGE_BASE_ADDR: + if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x03, 0x00)) // Set 64KB flash page command + Flash64KBPage = SentCommand.Data[2]; + break; + } +} + +/** Routine to concatenate the given pair of 16-bit memory start and end addresses from the host, and store them + * in the StartAddr and EndAddr global variables. + */ +static void LoadStartEndAddresses(void) +{ + union + { + uint8_t Bytes[2]; + uint16_t Word; + } Address[2] = {{.Bytes = {SentCommand.Data[2], SentCommand.Data[1]}}, + {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}}; + + /* Load in the start and ending read addresses from the sent data packet */ + StartAddr = Address[0].Word; + EndAddr = Address[1].Word; +} + +/** Handler for a Memory Program command issued by the host. This routine handles the preparations needed + * to write subsequent data from the host into the specified memory. + */ +static void ProcessMemProgCommand(void) +{ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Write FLASH command + IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Write EEPROM command + { + /* Load in the start and ending read addresses */ + LoadStartEndAddresses(); + + /* If FLASH is being written to, we need to pre-erase the first page to write to */ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) + { + union + { + uint16_t Words[2]; + uint32_t Long; + } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; + + /* Erase the current page's temp buffer */ + boot_page_erase(CurrFlashAddress.Long); + boot_spm_busy_wait(); + } + + /* Set the state so that the next DNLOAD requests reads in the firmware */ + DFU_State = dfuDNLOAD_IDLE; + } +} + +/** Handler for a Memory Read command issued by the host. This routine handles the preparations needed + * to read subsequent data from the specified memory out to the host, as well as implementing the memory + * blank check command. + */ +static void ProcessMemReadCommand(void) +{ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Read FLASH command + IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM command + { + /* Load in the start and ending read addresses */ + LoadStartEndAddresses(); + + /* Set the state so that the next UPLOAD requests read out the firmware */ + DFU_State = dfuUPLOAD_IDLE; + } + else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank check FLASH command + { + uint32_t CurrFlashAddress = 0; + + while (CurrFlashAddress < BOOT_START_ADDR) + { + /* Check if the current byte is not blank */ + #if (FLASHEND > 0xFFFF) + if (pgm_read_byte_far(CurrFlashAddress) != 0xFF) + #else + if (pgm_read_byte(CurrFlashAddress) != 0xFF) + #endif + { + /* Save the location of the first non-blank byte for response back to the host */ + Flash64KBPage = (CurrFlashAddress >> 16); + StartAddr = CurrFlashAddress; + + /* Set state and status variables to the appropriate error values */ + DFU_State = dfuERROR; + DFU_Status = errCHECK_ERASED; + + break; + } + + CurrFlashAddress++; + } + } +} + +/** Handler for a Data Write command issued by the host. This routine handles non-programming commands such as + * bootloader exit (both via software jumps and hardware watchdog resets) and flash memory erasure. + */ +static void ProcessWriteCommand(void) +{ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x03)) // Start application + { + /* Indicate that the bootloader is terminating */ + WaitForExit = true; + + /* Check if data supplied for the Start Program command - no data executes the program */ + if (SentCommand.DataSize) + { + if (SentCommand.Data[1] == 0x01) // Start via jump + { + union + { + uint8_t Bytes[2]; + AppPtr_t FuncPtr; + } Address = {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}; + + /* Load in the jump address into the application start address pointer */ + AppStartPtr = Address.FuncPtr; + } + } + else + { + if (SentCommand.Data[1] == 0x00) // Start via watchdog + { + /* Start the watchdog to reset the AVR once the communications are finalized */ + wdt_enable(WDTO_250MS); + } + else // Start via jump + { + /* Set the flag to terminate the bootloader at next opportunity */ + RunBootloader = false; + } + } + } + else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) // Erase flash + { + uint32_t CurrFlashAddress = 0; + + /* Clear the application section of flash */ + while (CurrFlashAddress < BOOT_START_ADDR) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + + CurrFlashAddress += SPM_PAGESIZE; + } + + /* Re-enable the RWW section of flash as writing to the flash locks it out */ + boot_rww_enable(); + + /* Memory has been erased, reset the security bit so that programming/reading is allowed */ +// IsSecure = false; + } +} + +/** Handler for a Data Read command issued by the host. This routine handles bootloader information retrieval + * commands such as device signature and bootloader version retrieval. + */ +static void ProcessReadCommand(void) +{ + const uint8_t BootloaderInfo[3] = {BOOTLOADER_VERSION, BOOTLOADER_ID_BYTE1, BOOTLOADER_ID_BYTE2}; + const uint8_t SignatureInfo[3] = {AVR_SIGNATURE_1, AVR_SIGNATURE_2, AVR_SIGNATURE_3}; + + uint8_t DataIndexToRead = SentCommand.Data[1]; + + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read bootloader info + ResponseByte = BootloaderInfo[DataIndexToRead]; + else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Read signature byte + ResponseByte = SignatureInfo[DataIndexToRead - 0x30]; +} diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h index 4fb236e64b6..4adc7e5545e 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h @@ -1,220 +1,220 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Arduino-usbdfu.c. - */ - -#ifndef _ARDUINO_USB_DFU_BOOTLOADER_H_ -#define _ARDUINO_USB_DFU_BOOTLOADER_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - #include - - /* Macros: */ - /** LED mask for the library LED driver, to indicate TX activity. */ - #define LEDMASK_TX LEDS_LED1 - - /** LED mask for the library LED driver, to indicate RX activity. */ - #define LEDMASK_RX LEDS_LED2 - - /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ - #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) - - /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ - #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) - - /** Configuration define. Define this token to true to case the bootloader to reject all memory commands - * until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this - * can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are - * allowed at any time. - */ -// #define SECURE_MODE false - - /** Major bootloader version number. */ - #define BOOTLOADER_VERSION_MINOR 2 - - /** Minor bootloader version number. */ - #define BOOTLOADER_VERSION_REV 0 - - /** Complete bootloader version number expressed as a packed byte, constructed from the - * two individual bootloader version macros. - */ - #define BOOTLOADER_VERSION ((BOOTLOADER_VERSION_MINOR << 4) | BOOTLOADER_VERSION_REV) - - /** First byte of the bootloader identification bytes, used to identify a device's bootloader. */ - #define BOOTLOADER_ID_BYTE1 0xDC - - /** Second byte of the bootloader identification bytes, used to identify a device's bootloader. */ - #define BOOTLOADER_ID_BYTE2 0xFB - - /** Convenience macro, used to determine if the issued command is the given one-byte long command. - * - * \param[in] dataarr Command byte array to check against - * \param[in] cb1 First command byte to check - */ - #define IS_ONEBYTE_COMMAND(dataarr, cb1) (dataarr[0] == (cb1)) - - /** Convenience macro, used to determine if the issued command is the given two-byte long command. - * - * \param[in] dataarr Command byte array to check against - * \param[in] cb1 First command byte to check - * \param[in] cb2 Second command byte to check - */ - #define IS_TWOBYTE_COMMAND(dataarr, cb1, cb2) ((dataarr[0] == (cb1)) && (dataarr[1] == (cb2))) - - /** Length of the DFU file suffix block, appended to the end of each complete memory write command. - * The DFU file suffix is currently unused (but is designed to give extra file information, such as - * a CRC of the complete firmware for error checking) and so is discarded. - */ - #define DFU_FILE_SUFFIX_SIZE 16 - - /** Length of the DFU file filler block, appended to the start of each complete memory write command. - * Filler bytes are added to the start of each complete memory write command, and must be discarded. - */ - #define DFU_FILLER_BYTES_SIZE 26 - - /** DFU class command request to detach from the host. */ - #define DFU_DETATCH 0x00 - - /** DFU class command request to send data from the host to the bootloader. */ - #define DFU_DNLOAD 0x01 - - /** DFU class command request to send data from the bootloader to the host. */ - #define DFU_UPLOAD 0x02 - - /** DFU class command request to get the current DFU status and state from the bootloader. */ - #define DFU_GETSTATUS 0x03 - - /** DFU class command request to reset the current DFU status and state variables to their defaults. */ - #define DFU_CLRSTATUS 0x04 - - /** DFU class command request to get the current DFU state of the bootloader. */ - #define DFU_GETSTATE 0x05 - - /** DFU class command request to abort the current multi-request transfer and return to the dfuIDLE state. */ - #define DFU_ABORT 0x06 - - /** DFU command to begin programming the device's memory. */ - #define COMMAND_PROG_START 0x01 - - /** DFU command to begin reading the device's memory. */ - #define COMMAND_DISP_DATA 0x03 - - /** DFU command to issue a write command. */ - #define COMMAND_WRITE 0x04 - - /** DFU command to issue a read command. */ - #define COMMAND_READ 0x05 - - /** DFU command to issue a memory base address change command, to set the current 64KB flash page - * that subsequent flash operations should use. */ - #define COMMAND_CHANGE_BASE_ADDR 0x06 - - /* Type Defines: */ - /** Type define for a non-returning function pointer to the loaded application. */ - typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; - - /** Type define for a structure containing a complete DFU command issued by the host. */ - typedef struct - { - uint8_t Command; /**< Single byte command to perform, one of the COMMAND_* macro values */ - uint8_t Data[5]; /**< Command parameters */ - uint16_t DataSize; /**< Size of the command parameters */ - } DFU_Command_t; - - /* Enums: */ - /** DFU bootloader states. Refer to the DFU class specification for information on each state. */ - enum DFU_State_t - { - appIDLE = 0, - appDETACH = 1, - dfuIDLE = 2, - dfuDNLOAD_SYNC = 3, - dfuDNBUSY = 4, - dfuDNLOAD_IDLE = 5, - dfuMANIFEST_SYNC = 6, - dfuMANIFEST = 7, - dfuMANIFEST_WAIT_RESET = 8, - dfuUPLOAD_IDLE = 9, - dfuERROR = 10 - }; - - /** DFU command status error codes. Refer to the DFU class specification for information on each error code. */ - enum DFU_Status_t - { - OK = 0, - errTARGET = 1, - errFILE = 2, - errWRITE = 3, - errERASE = 4, - errCHECK_ERASED = 5, - errPROG = 6, - errVERIFY = 7, - errADDRESS = 8, - errNOTDONE = 9, - errFIRMWARE = 10, - errVENDOR = 11, - errUSBR = 12, - errPOR = 13, - errUNKNOWN = 14, - errSTALLEDPKT = 15 - }; - - /* Function Prototypes: */ - void SetupHardware(void); - void ResetHardware(void); - - void EVENT_USB_Device_UnhandledControlRequest(void); - - #if defined(INCLUDE_FROM_BOOTLOADER_C) - static void DiscardFillerBytes(uint8_t NumberOfBytes); - static void ProcessBootloaderCommand(void); - static void LoadStartEndAddresses(void); - static void ProcessMemProgCommand(void); - static void ProcessMemReadCommand(void); - static void ProcessWriteCommand(void); - static void ProcessReadCommand(void); - #endif - -#endif /* _ARDUINO_USB_DFU_BOOTLOADER_H_ */ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Arduino-usbdfu.c. + */ + +#ifndef _ARDUINO_USB_DFU_BOOTLOADER_H_ +#define _ARDUINO_USB_DFU_BOOTLOADER_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + #include + + /* Macros: */ + /** LED mask for the library LED driver, to indicate TX activity. */ + #define LEDMASK_TX LEDS_LED1 + + /** LED mask for the library LED driver, to indicate RX activity. */ + #define LEDMASK_RX LEDS_LED2 + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ + #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) + + /** Configuration define. Define this token to true to case the bootloader to reject all memory commands + * until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this + * can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are + * allowed at any time. + */ +// #define SECURE_MODE false + + /** Major bootloader version number. */ + #define BOOTLOADER_VERSION_MINOR 2 + + /** Minor bootloader version number. */ + #define BOOTLOADER_VERSION_REV 0 + + /** Complete bootloader version number expressed as a packed byte, constructed from the + * two individual bootloader version macros. + */ + #define BOOTLOADER_VERSION ((BOOTLOADER_VERSION_MINOR << 4) | BOOTLOADER_VERSION_REV) + + /** First byte of the bootloader identification bytes, used to identify a device's bootloader. */ + #define BOOTLOADER_ID_BYTE1 0xDC + + /** Second byte of the bootloader identification bytes, used to identify a device's bootloader. */ + #define BOOTLOADER_ID_BYTE2 0xFB + + /** Convenience macro, used to determine if the issued command is the given one-byte long command. + * + * \param[in] dataarr Command byte array to check against + * \param[in] cb1 First command byte to check + */ + #define IS_ONEBYTE_COMMAND(dataarr, cb1) (dataarr[0] == (cb1)) + + /** Convenience macro, used to determine if the issued command is the given two-byte long command. + * + * \param[in] dataarr Command byte array to check against + * \param[in] cb1 First command byte to check + * \param[in] cb2 Second command byte to check + */ + #define IS_TWOBYTE_COMMAND(dataarr, cb1, cb2) ((dataarr[0] == (cb1)) && (dataarr[1] == (cb2))) + + /** Length of the DFU file suffix block, appended to the end of each complete memory write command. + * The DFU file suffix is currently unused (but is designed to give extra file information, such as + * a CRC of the complete firmware for error checking) and so is discarded. + */ + #define DFU_FILE_SUFFIX_SIZE 16 + + /** Length of the DFU file filler block, appended to the start of each complete memory write command. + * Filler bytes are added to the start of each complete memory write command, and must be discarded. + */ + #define DFU_FILLER_BYTES_SIZE 26 + + /** DFU class command request to detach from the host. */ + #define DFU_DETATCH 0x00 + + /** DFU class command request to send data from the host to the bootloader. */ + #define DFU_DNLOAD 0x01 + + /** DFU class command request to send data from the bootloader to the host. */ + #define DFU_UPLOAD 0x02 + + /** DFU class command request to get the current DFU status and state from the bootloader. */ + #define DFU_GETSTATUS 0x03 + + /** DFU class command request to reset the current DFU status and state variables to their defaults. */ + #define DFU_CLRSTATUS 0x04 + + /** DFU class command request to get the current DFU state of the bootloader. */ + #define DFU_GETSTATE 0x05 + + /** DFU class command request to abort the current multi-request transfer and return to the dfuIDLE state. */ + #define DFU_ABORT 0x06 + + /** DFU command to begin programming the device's memory. */ + #define COMMAND_PROG_START 0x01 + + /** DFU command to begin reading the device's memory. */ + #define COMMAND_DISP_DATA 0x03 + + /** DFU command to issue a write command. */ + #define COMMAND_WRITE 0x04 + + /** DFU command to issue a read command. */ + #define COMMAND_READ 0x05 + + /** DFU command to issue a memory base address change command, to set the current 64KB flash page + * that subsequent flash operations should use. */ + #define COMMAND_CHANGE_BASE_ADDR 0x06 + + /* Type Defines: */ + /** Type define for a non-returning function pointer to the loaded application. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /** Type define for a structure containing a complete DFU command issued by the host. */ + typedef struct + { + uint8_t Command; /**< Single byte command to perform, one of the COMMAND_* macro values */ + uint8_t Data[5]; /**< Command parameters */ + uint16_t DataSize; /**< Size of the command parameters */ + } DFU_Command_t; + + /* Enums: */ + /** DFU bootloader states. Refer to the DFU class specification for information on each state. */ + enum DFU_State_t + { + appIDLE = 0, + appDETACH = 1, + dfuIDLE = 2, + dfuDNLOAD_SYNC = 3, + dfuDNBUSY = 4, + dfuDNLOAD_IDLE = 5, + dfuMANIFEST_SYNC = 6, + dfuMANIFEST = 7, + dfuMANIFEST_WAIT_RESET = 8, + dfuUPLOAD_IDLE = 9, + dfuERROR = 10 + }; + + /** DFU command status error codes. Refer to the DFU class specification for information on each error code. */ + enum DFU_Status_t + { + OK = 0, + errTARGET = 1, + errFILE = 2, + errWRITE = 3, + errERASE = 4, + errCHECK_ERASED = 5, + errPROG = 6, + errVERIFY = 7, + errADDRESS = 8, + errNOTDONE = 9, + errFIRMWARE = 10, + errVENDOR = 11, + errUSBR = 12, + errPOR = 13, + errUNKNOWN = 14, + errSTALLEDPKT = 15 + }; + + /* Function Prototypes: */ + void SetupHardware(void); + void ResetHardware(void); + + void EVENT_USB_Device_UnhandledControlRequest(void); + + #if defined(INCLUDE_FROM_BOOTLOADER_C) + static void DiscardFillerBytes(uint8_t NumberOfBytes); + static void ProcessBootloaderCommand(void); + static void LoadStartEndAddresses(void); + static void ProcessMemProgCommand(void); + static void ProcessMemReadCommand(void); + static void ProcessWriteCommand(void); + static void ProcessReadCommand(void); + #endif + +#endif /* _ARDUINO_USB_DFU_BOOTLOADER_H_ */ diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h index 152e8f571c4..41465f22ddf 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h @@ -1,110 +1,110 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/* - Board LEDs driver for the Benito board, from www.dorkbotpdx.org. -*/ - -#ifndef __LEDS_ARDUINOUNO_H__ -#define __LEDS_ARDUINOUNO_H__ - - /* Includes: */ - #include - -/* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(INCLUDE_FROM_LEDS_H) - #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** LED mask for the first LED on the board. */ - #define LEDS_LED1 (1 << 5) - - /** LED mask for the second LED on the board. */ - #define LEDS_LED2 (1 << 4) - - /** LED mask for all the LEDs on the board. */ - #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) - - /** LED mask for the none of the board LEDs */ - #define LEDS_NO_LEDS 0 - - /* Inline Functions: */ - #if !defined(__DOXYGEN__) - static inline void LEDs_Init(void) - { - DDRD |= LEDS_ALL_LEDS; - PORTD |= LEDS_ALL_LEDS; - } - - static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) - { - PORTD &= ~LEDMask; - } - - static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) - { - PORTD |= LEDMask; - } - - static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) - { - PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); - } - - static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) - { - PORTD = ((PORTD | ActiveMask) & ~LEDMask); - } - - static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) - { - PORTD ^= LEDMask; - } - - static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; - static inline uint8_t LEDs_GetLEDs(void) - { - return (PORTD & LEDS_ALL_LEDS); - } - #endif - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/* + Board LEDs driver for the Benito board, from www.dorkbotpdx.org. +*/ + +#ifndef __LEDS_ARDUINOUNO_H__ +#define __LEDS_ARDUINOUNO_H__ + + /* Includes: */ + #include + +/* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the first LED on the board. */ + #define LEDS_LED1 (1 << 5) + + /** LED mask for the second LED on the board. */ + #define LEDS_LED2 (1 << 4) + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the none of the board LEDs */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRD |= LEDS_ALL_LEDS; + PORTD |= LEDS_ALL_LEDS; + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + PORTD &= ~LEDMask; + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + PORTD |= LEDMask; + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) + { + PORTD = ((PORTD | ActiveMask) & ~LEDMask); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + PORTD ^= LEDMask; + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return (PORTD & LEDS_ALL_LEDS); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c index 4deaa0625e3..1ec1cd22357 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c @@ -1,189 +1,189 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ -USB_Descriptor_Device_t DeviceDescriptor = -{ - .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - - .USBSpecification = VERSION_BCD(01.10), - .Class = 0x00, - .SubClass = 0x00, - .Protocol = 0x00, - - .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - - .VendorID = 0x03EB, // Atmel - .ProductID = PRODUCT_ID_CODE, // MCU-dependent - .ReleaseNumber = 0x0000, - - .ManufacturerStrIndex = NO_DESCRIPTOR, - .ProductStrIndex = 0x01, - .SerialNumStrIndex = NO_DESCRIPTOR, - - .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS -}; - -/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ -USB_Descriptor_Configuration_t ConfigurationDescriptor = -{ - .Config = - { - .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 1, - - .ConfigurationNumber = 1, - .ConfigurationStrIndex = NO_DESCRIPTOR, - - .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, - - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) - }, - - .DFU_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 0, - .AlternateSetting = 0, - - .TotalEndpoints = 0, - - .Class = 0xFE, - .SubClass = 0x01, - .Protocol = 0x02, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .DFU_Functional = - { - .Header = {.Size = sizeof(USB_DFU_Functional_Descriptor_t), .Type = DTYPE_DFUFunctional}, - - .Attributes = (ATTR_CAN_UPLOAD | ATTR_CAN_DOWNLOAD), - - .DetachTimeout = 0x0000, - .TransferSize = 0x0c00, - - .DFUSpecification = VERSION_BCD(01.01) - } -}; - -/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests - * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -USB_Descriptor_String_t LanguageString = -{ - .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, - - .UnicodeString = {LANGUAGE_ID_ENG} -}; - -/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, - * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -USB_Descriptor_String_t ProductString = -{ - #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) - .Header = {.Size = USB_STRING_LEN(15), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Uno DFU" - #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) - .Header = {.Size = USB_STRING_LEN(21), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Mega 2560 DFU" - #endif -}; - -/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" - * documentation) by the application code so that the address and size of a requested descriptor can be given - * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function - * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the - * USB host. - */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - if (!(DescriptorNumber)) - { - Address = &LanguageString; - Size = LanguageString.Header.Size; - } - else - { - Address = &ProductString; - Size = ProductString.Header.Size; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +USB_Descriptor_Device_t DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = 0x00, + .SubClass = 0x00, + .Protocol = 0x00, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x03EB, // Atmel + .ProductID = PRODUCT_ID_CODE, // MCU-dependent + .ReleaseNumber = 0x0000, + + .ManufacturerStrIndex = NO_DESCRIPTOR, + .ProductStrIndex = 0x01, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 1, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .DFU_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 0, + + .Class = 0xFE, + .SubClass = 0x01, + .Protocol = 0x02, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .DFU_Functional = + { + .Header = {.Size = sizeof(USB_DFU_Functional_Descriptor_t), .Type = DTYPE_DFUFunctional}, + + .Attributes = (ATTR_CAN_UPLOAD | ATTR_CAN_DOWNLOAD), + + .DetachTimeout = 0x0000, + .TransferSize = 0x0c00, + + .DFUSpecification = VERSION_BCD(01.01) + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +USB_Descriptor_String_t LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t ProductString = +{ + #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) + .Header = {.Size = USB_STRING_LEN(15), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Uno DFU" + #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) + .Header = {.Size = USB_STRING_LEN(21), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Mega 2560 DFU" + #endif +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else + { + Address = &ProductString; + Size = ProductString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h index 6c93f20cdee..cb3a8ca1dda 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h @@ -1,177 +1,177 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - /* Product-specific definitions: */ - #define ARDUINO_UNO_PID 0x0001 - #define ARDUINO_MEGA2560_PID 0x0010 - - /* Macros: */ - /** Descriptor type value for a DFU class functional descriptor. */ - #define DTYPE_DFUFunctional 0x21 - - /** DFU attribute mask, indicating that the DFU device will detach and re-attach when a DFU_DETACH - * command is issued, rather than the host issuing a USB Reset. - */ - #define ATTR_WILL_DETATCH (1 << 3) - - /** DFU attribute mask, indicating that the DFU device can communicate during the manifestation phase - * (memory programming phase). - */ - #define ATTR_MANEFESTATION_TOLLERANT (1 << 2) - - /** DFU attribute mask, indicating that the DFU device can accept DFU_UPLOAD requests to send data from - * the device to the host. - */ - #define ATTR_CAN_UPLOAD (1 << 1) - - /** DFU attribute mask, indicating that the DFU device can accept DFU_DNLOAD requests to send data from - * the host to the device. - */ - #define ATTR_CAN_DOWNLOAD (1 << 0) - - #if defined(__AVR_AT90USB1287__) - #define PRODUCT_ID_CODE 0x2FFB - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB1286__) - #define PRODUCT_ID_CODE 0x2FFB - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB647__) - #define PRODUCT_ID_CODE 0x2FF9 - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB646__) - #define PRODUCT_ID_CODE 0x2FF9 - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega32U6__) - #define PRODUCT_ID_CODE 0x2FFB - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U4__) - #define PRODUCT_ID_CODE 0x2FF4 - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x87 - #elif defined(__AVR_ATmega32U2__) - #define PRODUCT_ID_CODE 0x2FF0 - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x8A - #elif defined(__AVR_ATmega16U4__) - #define PRODUCT_ID_CODE 0x2FF3 - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega16U2__) - #define PRODUCT_ID_CODE 0x2FEF - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB162__) - #define PRODUCT_ID_CODE 0x2FFA - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB82__) - #define PRODUCT_ID_CODE 0x2FEE - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x93 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_ATmega8U2__) - #define PRODUCT_ID_CODE 0x2FF7 - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x93 - #define AVR_SIGNATURE_3 0x82 - #else - #error The selected AVR part is not currently supported by this bootloader. - #endif - - #if !defined(PRODUCT_ID_CODE) - #error Current AVR model is not supported by this bootloader. - #endif - - /* Type Defines: */ - /** Type define for a DFU class function descriptor. This descriptor gives DFU class information - * to the host when read, indicating the DFU device's capabilities. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Standard descriptor header structure */ - - uint8_t Attributes; /**< DFU device attributes, a mask comprising of the - * ATTR_* macros listed in this source file - */ - uint16_t DetachTimeout; /**< Timeout in milliseconds between a USB_DETACH - * command being issued and the device detaching - * from the USB bus - */ - uint16_t TransferSize; /**< Maximum number of bytes the DFU device can accept - * from the host in a transaction - */ - uint16_t DFUSpecification; /**< BCD packed DFU specification number this DFU - * device complies with - */ - } USB_DFU_Functional_Descriptor_t; - - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - USB_Descriptor_Interface_t DFU_Interface; - USB_DFU_Functional_Descriptor_t DFU_Functional; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + /* Product-specific definitions: */ + #define ARDUINO_UNO_PID 0x0001 + #define ARDUINO_MEGA2560_PID 0x0010 + + /* Macros: */ + /** Descriptor type value for a DFU class functional descriptor. */ + #define DTYPE_DFUFunctional 0x21 + + /** DFU attribute mask, indicating that the DFU device will detach and re-attach when a DFU_DETACH + * command is issued, rather than the host issuing a USB Reset. + */ + #define ATTR_WILL_DETATCH (1 << 3) + + /** DFU attribute mask, indicating that the DFU device can communicate during the manifestation phase + * (memory programming phase). + */ + #define ATTR_MANEFESTATION_TOLLERANT (1 << 2) + + /** DFU attribute mask, indicating that the DFU device can accept DFU_UPLOAD requests to send data from + * the device to the host. + */ + #define ATTR_CAN_UPLOAD (1 << 1) + + /** DFU attribute mask, indicating that the DFU device can accept DFU_DNLOAD requests to send data from + * the host to the device. + */ + #define ATTR_CAN_DOWNLOAD (1 << 0) + + #if defined(__AVR_AT90USB1287__) + #define PRODUCT_ID_CODE 0x2FFB + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB1286__) + #define PRODUCT_ID_CODE 0x2FFB + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB647__) + #define PRODUCT_ID_CODE 0x2FF9 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB646__) + #define PRODUCT_ID_CODE 0x2FF9 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega32U6__) + #define PRODUCT_ID_CODE 0x2FFB + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U4__) + #define PRODUCT_ID_CODE 0x2FF4 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x87 + #elif defined(__AVR_ATmega32U2__) + #define PRODUCT_ID_CODE 0x2FF0 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x8A + #elif defined(__AVR_ATmega16U4__) + #define PRODUCT_ID_CODE 0x2FF3 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega16U2__) + #define PRODUCT_ID_CODE 0x2FEF + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB162__) + #define PRODUCT_ID_CODE 0x2FFA + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB82__) + #define PRODUCT_ID_CODE 0x2FEE + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_ATmega8U2__) + #define PRODUCT_ID_CODE 0x2FF7 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x82 + #else + #error The selected AVR part is not currently supported by this bootloader. + #endif + + #if !defined(PRODUCT_ID_CODE) + #error Current AVR model is not supported by this bootloader. + #endif + + /* Type Defines: */ + /** Type define for a DFU class function descriptor. This descriptor gives DFU class information + * to the host when read, indicating the DFU device's capabilities. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Standard descriptor header structure */ + + uint8_t Attributes; /**< DFU device attributes, a mask comprising of the + * ATTR_* macros listed in this source file + */ + uint16_t DetachTimeout; /**< Timeout in milliseconds between a USB_DETACH + * command being issued and the device detaching + * from the USB bus + */ + uint16_t TransferSize; /**< Maximum number of bytes the DFU device can accept + * from the host in a transaction + */ + uint16_t DFUSpecification; /**< BCD packed DFU specification number this DFU + * device complies with + */ + } USB_DFU_Functional_Descriptor_t; + + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + USB_Descriptor_Interface_t DFU_Interface; + USB_DFU_Functional_Descriptor_t DFU_Functional; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/makefile b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/makefile index 1fb4ed346f2..04a052175cb 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/makefile +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/makefile @@ -1,710 +1,710 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - - -# MCU name -MCU = atmega8u2 -MCU_AVRDUDE = at90usb82 - -# Specify the Arduino model using the assigned PID. This is used by Descriptors.c -# to set the product descriptor string (for DFU we must use the PID for each -# chip that dfu-bootloader or Flip expect) -# Uno PID: -ARDUINO_MODEL_PID = 0x0001 -# Mega 2560 PID: -#ARDUINO_MODEL_PID = 0x0010 - -# Target board (see library "Board Types" documentation, NONE for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USER - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_CLOCK below, as it is sourced by -# F_CLOCK after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# Input clock frequency. -# This will define a symbol, F_CLOCK, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_CLOCK = $(F_CPU) - - -# Starting byte address of the bootloader, as a byte address - computed via the formula -# BOOT_START = ((TOTAL_FLASH_BYTES - BOOTLOADER_SECTION_SIZE_BYTES) * 1024) -# -# Note that the bootloader size and start address given in AVRStudio is in words and not -# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. -BOOT_START = 0x1000 - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = Arduino-usbdfu - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Path to the LUFA library -LUFA_PATH = ../.. - - -# LUFA library compile-time options and predefined tokens -LUFA_OPTS = -D USB_DEVICE_ONLY -LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 -LUFA_OPTS += -D CONTROL_ONLY_DEVICE -LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=32 -LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 -LUFA_OPTS += -D USE_RAM_DESCRIPTORS -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -LUFA_OPTS += -D NO_INTERNAL_SERIAL -LUFA_OPTS += -D NO_DEVICE_SELF_POWER -LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP -LUFA_OPTS += -D NO_STREAM_CALLBACKS - - -# Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(LUFA_PATH)/ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=c99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) -CDEFS += -DF_CLOCK=$(F_CLOCK)UL -CDEFS += -DBOARD=BOARD_$(BOARD) -CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CDEFS += -DTX_RX_LED_PULSE_MS=3 -CDEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) -ADEFS += -DF_CLOCK=$(F_CLOCK)UL -ADEFS += -DBOARD=BOARD_$(BOARD) -CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -ADEFS += $(LUFA_OPTS) - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL -CPPDEFS += -DBOARD=BOARD_$(BOARD) -CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CPPDEFS += $(LUFA_OPTS) -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CPPFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Fuse settings for Arduino Uno DFU bootloader project -AVRDUDE_FUSES = -U efuse:w:0xF4:m -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m - -# Lock settings for Arduino Uno DFU bootloader project -AVRDUDE_LOCK = -U lock:w:0x0F:m - -# Programming hardware -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = avrispmkii - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -F -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_FUSES) $(AVRDUDE_LOCK) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -z $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - -doxygen: - @echo Generating Project Documentation... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff doxygen clean \ -clean_list clean_doxygen program debug gdb-config +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + + +# MCU name +MCU = atmega8u2 +MCU_AVRDUDE = at90usb82 + +# Specify the Arduino model using the assigned PID. This is used by Descriptors.c +# to set the product descriptor string (for DFU we must use the PID for each +# chip that dfu-bootloader or Flip expect) +# Uno PID: +ARDUINO_MODEL_PID = 0x0001 +# Mega 2560 PID: +#ARDUINO_MODEL_PID = 0x0010 + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_CLOCK below, as it is sourced by +# F_CLOCK after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_CLOCK, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_CLOCK = $(F_CPU) + + +# Starting byte address of the bootloader, as a byte address - computed via the formula +# BOOT_START = ((TOTAL_FLASH_BYTES - BOOTLOADER_SECTION_SIZE_BYTES) * 1024) +# +# Note that the bootloader size and start address given in AVRStudio is in words and not +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. +BOOT_START = 0x1000 + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Arduino-usbdfu + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../.. + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D CONTROL_ONLY_DEVICE +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=32 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D NO_INTERNAL_SERIAL +LUFA_OPTS += -D NO_DEVICE_SELF_POWER +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP +LUFA_OPTS += -D NO_STREAM_CALLBACKS + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) +CDEFS += -DF_CLOCK=$(F_CLOCK)UL +CDEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += -DTX_RX_LED_PULSE_MS=3 +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_CLOCK=$(F_CLOCK)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +ADEFS += $(LUFA_OPTS) + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Fuse settings for Arduino Uno DFU bootloader project +AVRDUDE_FUSES = -U efuse:w:0xF4:m -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m + +# Lock settings for Arduino Uno DFU bootloader project +AVRDUDE_LOCK = -U lock:w:0x0F:m + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkii + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -F -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_FUSES) $(AVRDUDE_LOCK) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program debug gdb-config diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex index efbbf15db24..6ff3644796b 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex @@ -1,254 +1,254 @@ -:1000000090C00000A9C00000A7C00000A5C000006B -:10001000A3C00000A1C000009FC000009DC0000060 -:100020009BC0000099C0000097C0000048C40000B9 -:100030000CC4000091C000008FC000008DC0000003 -:100040008BC0000089C0000087C0000085C0000090 -:1000500083C0000081C000007FC0000002C100001A -:100060007BC0000079C0000077C0000075C00000B0 -:1000700073C0000071C000006FC000006DC00000C0 -:100080006BC0000069C0000067C0000065C00000D0 -:1000900063C0000061C000001201100102000008EE -:1000A0004123420001000102DC0109023E0002017D -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:10012000000011241FBECFEFD2E0DEBFCDBF11E033 -:10013000A0E0B1E0ECEAFFE002C005900D92A6312C -:10014000B107D9F712E0A6E1B1E001C01D92AF32CC -:10015000B107E1F7F1D028C753CF9C01DC01AE57BE -:10016000BF4FED91FC91119741911196FC93EE9345 -:1001700080589F4FE817F90711F42D933C939FB7D0 -:10018000F894F901EC57FF4F8081815080839FBF25 -:10019000842F0895DF92EF92FF920F931F93FC013B -:1001A0008489813019F0823021F405C040E3D42ED7 -:1001B00004C0DD2402C030E2D32E8389823011F4E2 -:1001C00088E0D82A8589873031F0883031F0863050 -:1001D00031F482E003C084E001C086E0D82A1092A6 -:1001E000C9001092C8001092CA00E784F088018903 -:1001F000128980E0E81681EEF80680E0080780E0CA -:10020000180719F420E130E00FC0C801B701969536 -:1002100087957795679560587B47814E9F4FA801DA -:100220009701A0D6215030403093CD002093CC00D0 -:10023000D092CA0080E0E81681EEF80680E0080758 -:1002400080E0180711F082E001C080E08093C800D0 -:1002500088E98093C9001F910F91FF90EF90DF9084 -:1002600008951F920F920FB60F9211242F938F9320 -:100270009F93EF93FF939091CE008EB38430F1F46F -:10028000E0919901F0919A019083E0919901F091A8 -:100290009A01CF01019690939A018093990189590F -:1002A000914021F489E191E0928381839FB7F89492 -:1002B00080919D018F5F80939D019FBFFF91EF9182 -:1002C0009F918F912F910F900FBE0F901F901895B7 -:1002D000FC01858580FF02C05F9808955F9A0895AC -:1002E00080E091E0D5C580E091E088C584B7877F44 -:1002F00084BF28E10FB6F89420936000109260004C -:100300000FBE87E690E09093CD008093CC0086E00E -:100310008093CA001092C8002093C900539A5A9A39 -:100320008AB180638AB98BB180638BB983D284E050 -:1003300085BD5F9A579A08950F931F93CF93DF93CC -:10034000D5DF2FB7F8948EE991E090931F02809348 -:100350001E0290932102809320022FBF2FB7F894A2 -:1003600089E191E090939A018093990190939C0187 -:1003700080939B012FBF7894CEE9D1E003E08FB743 -:10038000F894909122028FBF903809F180E091E0BB -:10039000ABD497FD1CC0E0911E02F0911F02808338 -:1003A000E0911E02F0911F02CF01019690931F026F -:1003B00080931E028E51924011F4D283C1839FB765 -:1003C000F894809122028F5F809322029FBF8FB7A3 -:1003D000F89410919D018FBFA89902C0113678F151 -:1003E000A89A80919D01882361F05D980093160181 -:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 -:1004000011501123B1F780911601882351F080918A -:10041000160181508093160180911601882309F4FA -:100420005D9A80911701882351F0809117018150C6 -:100430008093170180911701882309F45C9A8FB784 -:10044000F894909122028FBF992369F08EE991E090 -:1004500084DE982F8091C80085FFFCCF9093CE005A -:100460005C980093170180E091E095D42AD487CF5F -:10047000DA01923049F0933061F09130F9F4E8E913 -:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 -:1004900019C0813049F0813018F0823079F408C0F9 -:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 -:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 -:1004C00020E030E0ED93FC93C901089528E030E08E -:1004D00040E003C04F5F220F331F28173907D0F3C6 -:1004E000842F8295807F08958093E9008091EB00AE -:1004F00081608093EB001092ED006093EC004093DC -:10050000ED008091EE00881F8827881F08951092C3 -:10051000F40090E09093E9001092F0001092E8004F -:100520001092ED008091EB008E7F8093EB009F5F37 -:10053000953081F708958091270288238CF403C0B9 -:100540008EB38823B1F08091E80082FFF9CF8091CB -:10055000E8008B778093E80008958EB3882349F0F4 -:100560008091E80080FFF9CF8091E8008E7780933A -:10057000E800089594E68091EC0080FF05C080912A -:10058000E80080FF05C023C08091E80082FD1FC005 -:100590008EB3882311F482E008958EB3853011F470 -:1005A00083E008958091EB0085FF02C081E008950B -:1005B0008091E10082FFDFCF8091E1008B7F80930B -:1005C000E100992311F484E008959150D4CF80E0A4 -:1005D00008959C0140912D0250912E024617570715 -:1005E00018F4F90120E038C06115710511F0AB0174 -:1005F000F8CF8091E8008E778093E80040E050E0EB -:10060000F0CF8091E80083FF02C081E008958091DF -:10061000E80082FD2DC08EB3882381F18EB3853032 -:1006200079F18091E80080FF17C09091F20006C038 -:1006300081918093F100415050409F5F41155105D9 -:1006400011F09830A8F320E0983009F421E080916F -:10065000E8008E778093E8004115510591F622233A -:1006600081F606C08EB3882349F08EB3853041F001 -:100670008091E80082FFF6CF80E0089582E008953F -:1006800083E008959C0140912D0250912E0246175F -:10069000570710F490E03BC06115710511F0AB01F4 -:1006A000F9CF8091E8008E778093E80040E050E039 -:1006B000F1CF8091E80083FF02C081E0089580912E -:1006C000E80082FD30C08EB3882399F18EB3853067 -:1006D00091F18091E80080FF1AC08091F20009C07A -:1006E000F9012F5F3F4FE491E093F10041505040FA -:1006F0008F5F4115510511F0883090F390E08830FC -:1007000009F491E08091E8008E778093E80041152C -:10071000510579F6992369F606C08EB3882349F00E -:100720008EB3853041F08091E80082FFF6CF80E003 -:10073000089582E0089583E008959C016115710594 -:1007400029F48091E8008B778093E800F90120C0BC -:100750008091E80083FF02C081E008958EB3882372 -:1007600039F18EB3853031F18091E80082FFF0CF0E -:1007700006C08091F10081936150704021F080911A -:10078000F2008823B1F78091E8008B778093E8002E -:1007900061157105E9F606C08EB3882349F08EB362 -:1007A000853041F08091E80080FFF6CF80E0089529 -:1007B00082E0089583E0089542D044D01EBA10929A -:1007C0002502109224021092230284E089BD89B58B -:1007D000826089BD09B400FEFDCF8091D800982FBA -:1007E0009F779093D80080688093D80080916300B1 -:1007F0008E7F809363008091D8008F7D8093D80096 -:100800008091E0008E7F8093E0008091E1008E7FF8 -:100810008093E1008091E20081608093E20080910A -:10082000E100877F8093E1008091E20088608093FF -:10083000E2000895C1DF81E08093260208951092BE -:10084000E20008951092E10008951F920F920FB6F2 -:100850000F9211241F932F933F934F935F936F93A6 -:100860007F938F939F93AF93BF93EF93FF93E9EEA3 -:10087000F0E0108117701082E0EFF0E08081877F58 -:1008800080837894C3D0F894A9EEB0E01C92E0EF96 -:10089000F0E08081886080831C93FF91EF91BF918D -:1008A000AF919F918F917F916F915F914F913F9108 -:1008B0002F911F910F900FBE0F901F9018951F92B0 -:1008C0000F920FB60F9211242F933F934F935F9384 -:1008D0006F937F938F939F93AF93BF93EF93FF9308 -:1008E0008091E10080FF1BC08091E20080FF17C073 -:1008F0008091E1008E7F8093E1008091E2008E7F05 -:100900008093E2008091E20080618093E200809118 -:10091000D80080628093D80019BC1EBAD1D18091D2 -:10092000E10084FF29C08091E20084FF25C084E0BB -:1009300089BD89B5826089BD09B400FEFDCF809173 -:10094000D8008F7D8093D8008091E1008F7E8093C6 -:10095000E1008091E2008F7E8093E2008091E200CE -:1009600081608093E20080912502882311F481E068 -:1009700001C084E08EBBA4D18091E10083FF27C039 -:100980008091E20083FF23C08091E100877F809304 -:10099000E10082E08EBB109225028091E1008E7F03 -:1009A0008093E1008091E2008E7F8093E20080914D -:1009B000E20080618093E200AADD80E060E042E036 -:1009C00093DD8091F00088608093F00079D1809170 -:1009D000E10082FF0AC08091E20082FF06C08091A0 -:1009E000E1008B7F8093E1006BD1FF91EF91BF918C -:1009F000AF919F918F917F916F915F914F913F91B7 -:100A00002F910F900FBE0F901F9018951F93DF939B -:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D -:100A2000CDBFE7E2F2E08091F100819322E0EF3266 -:100A3000F207C9F78091270230912802353009F476 -:100A400087C0363040F43130C9F1313070F0333086 -:100A500009F01DC133C0383009F4EFC0393009F452 -:100A6000FEC0363009F013C192C0803821F08238C0 -:100A700009F00DC108C090912302809124028823BF -:100A800099F0926011C080912B0287708093E900E9 -:100A90008091EB0090E025E0969587952A95E1F707 -:100AA000982F91701092E9008091E800877F8093E1 -:100AB000E8009093F1001092F100CAC0882319F069 -:100AC000823009F0E4C090E08F719070009721F0BF -:100AD000029709F0DDC00CC080912902813009F035 -:100AE000D7C010922402333069F5809324022AC0C3 -:100AF00080912902882331F520912B02277009F477 -:100B0000C7C02093E9008091EB0080FFC1C0333063 -:100B100021F48091EB00806213C08091EB00806132 -:100B20008093EB0081E090E002C0880F991F2A9526 -:100B3000E2F78093EA001092EA008091EB0088606F -:100B40008093EB001092E9008091E800877F83C0DA -:100B5000882309F09CC0109129028091E800877FCA -:100B60008093E800E8DC04C08EB3882309F490C0C9 -:100B70008091E80080FFF8CF812F8F7711F492E009 -:100B800001C093E09EBB80688093E30081C08058E1 -:100B9000823008F07CC08091290290912A0223E0E3 -:100BA0008C3D920799F55FB7F894DE0115964EE0FB -:100BB00020E030E061E2E42FF0E0609357008491A0 -:100BC00020FF03C082958F704F5F982F9F70892FF1 -:100BD000805D8A3308F0895F8C9311961C9211977F -:100BE0002F5F3F4F12962431310529F75FBF8AE20C -:100BF0008B8383E08C838091E800877F8093E8007B -:100C0000CE0103966AE270E0E4DC11C060912B0231 -:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 -:100C2000E800877F8093E80089819A812BDD80919D -:100C3000E8008B778093E8002BC0803841F58091E5 -:100C4000E800877F8093E800809125028093F1007F -:100C50008091E8008E778093E8006DDC19C08823CE -:100C6000B1F490912902923098F48091E800877F46 -:100C70008093E800909325025EDC80912502882312 -:100C800011F483E001C084E08EBB2DDB01C028DBC2 -:100C90008091E80083FF0AC08091EB00806280931E -:100CA000EB008091E800877F8093E800AC960FB658 -:100CB000F894DEBF0FBECDBFCF91DF911F91089595 -:100CC00008951F938EB3882361F01091E90010926C -:100CD000E9008091E80083FF01C098DE177010934F -:100CE000E9001F9108950895FC018EB3843021F529 -:100CF00087859089A189B2890097A105B105E1F0A6 -:100D000085818093E9008091E80082FF15C0809181 -:100D1000F200882319F42FEF3FEF04C08091F10017 -:100D2000282F30E08091F200882341F48091E80080 -:100D30008B778093E80002C02FEF3FEFC901089541 -:100D4000FC018EB3843011F587859089A189B28921 -:100D50000097A105B105D1F081818093E9008091D0 -:100D6000F2008823A9F09091E8008091E8008E7746 -:100D70008093E80095FD0CC0FDDB982F882349F493 -:100D80008091E8008E778093E80003C092E001C074 -:100D900090E0892F0895FC018EB3843051F487854B -:100DA0009089A189B2890097A105B10511F0CF0101 -:100DB000C7CF08951F93FC01162F8EB38430D9F44A -:100DC00087859089A189B2890097A105B10599F01D -:100DD00081818093E9008091E80085FD08C08091C1 -:100DE000E8008E778093E800C5DB882329F4109310 -:100DF000F10080E001C082E01F9108950F931F93DE -:100E0000CF93DF93EC010D96FC0189E0DF011D9289 -:100E10008A95E9F72A813B8109818C81882311F425 -:100E200010E001C014E0C90151DB182B1260802FC3 -:100E300061E8412F59DB882329F12E813F810D8103 -:100E40008885882311F410E001C014E0C9013EDB5D -:100E5000182B1260802F60E8412F46DB882391F029 -:100E60002A853B8509858C85882311F410E001C013 -:100E700014E0C9012BDB182B1260802F61EC412F8D -:100E800033DB01C080E0DF91CF911F910F91089576 -:100E9000CF93DF93EC018091E80083FF60C08881ED -:100EA00090E020912B0230912C022817390709F08D -:100EB00056C080912802813261F0823220F4803263 -:100EC00009F04DC019C0823269F1833209F047C080 -:100ED00038C080912702813A09F041C08091E80032 -:100EE000877F8093E800CE010F9667E070E071DBAA -:100EF0008091E8008B7713C080912702813279F5C9 -:100F00008091E800877F8093E800CE010F9667E02C -:100F100070E013DCCE013ED98091E8008E7780939B -:100F2000E8001DC0809127028132C9F48091E80059 -:100F3000877F8093E800809129028D87CE01C8D9F0 -:100F40000DC080912702813251F48091E800877FA3 -:100F50008093E800CE0160912902C5DEECDADF91D2 -:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 -:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 -:100F800020F0A21BB30BE40BF50B661F771F881F25 -:100F9000991F1A9469F760957095809590959B01BB -:0C0FA000AC01BD01CF010895F894FFCF13 -:100FAC0000034000000440000002080000000000A4 -:060FBC000000000000002F -:00000001FF +:1000000090C00000A9C00000A7C00000A5C000006B +:10001000A3C00000A1C000009FC000009DC0000060 +:100020009BC0000099C0000097C0000048C40000B9 +:100030000CC4000091C000008FC000008DC0000003 +:100040008BC0000089C0000087C0000085C0000090 +:1000500083C0000081C000007FC0000002C100001A +:100060007BC0000079C0000077C0000075C00000B0 +:1000700073C0000071C000006FC000006DC00000C0 +:100080006BC0000069C0000067C0000065C00000D0 +:1000900063C0000061C000001201100102000008EE +:1000A0004123420001000102DC0109023E0002017D +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:10012000000011241FBECFEFD2E0DEBFCDBF11E033 +:10013000A0E0B1E0ECEAFFE002C005900D92A6312C +:10014000B107D9F712E0A6E1B1E001C01D92AF32CC +:10015000B107E1F7F1D028C753CF9C01DC01AE57BE +:10016000BF4FED91FC91119741911196FC93EE9345 +:1001700080589F4FE817F90711F42D933C939FB7D0 +:10018000F894F901EC57FF4F8081815080839FBF25 +:10019000842F0895DF92EF92FF920F931F93FC013B +:1001A0008489813019F0823021F405C040E3D42ED7 +:1001B00004C0DD2402C030E2D32E8389823011F4E2 +:1001C00088E0D82A8589873031F0883031F0863050 +:1001D00031F482E003C084E001C086E0D82A1092A6 +:1001E000C9001092C8001092CA00E784F088018903 +:1001F000128980E0E81681EEF80680E0080780E0CA +:10020000180719F420E130E00FC0C801B701969536 +:1002100087957795679560587B47814E9F4FA801DA +:100220009701A0D6215030403093CD002093CC00D0 +:10023000D092CA0080E0E81681EEF80680E0080758 +:1002400080E0180711F082E001C080E08093C800D0 +:1002500088E98093C9001F910F91FF90EF90DF9084 +:1002600008951F920F920FB60F9211242F938F9320 +:100270009F93EF93FF939091CE008EB38430F1F46F +:10028000E0919901F0919A019083E0919901F091A8 +:100290009A01CF01019690939A018093990189590F +:1002A000914021F489E191E0928381839FB7F89492 +:1002B00080919D018F5F80939D019FBFFF91EF9182 +:1002C0009F918F912F910F900FBE0F901F901895B7 +:1002D000FC01858580FF02C05F9808955F9A0895AC +:1002E00080E091E0D5C580E091E088C584B7877F44 +:1002F00084BF28E10FB6F89420936000109260004C +:100300000FBE87E690E09093CD008093CC0086E00E +:100310008093CA001092C8002093C900539A5A9A39 +:100320008AB180638AB98BB180638BB983D284E050 +:1003300085BD5F9A579A08950F931F93CF93DF93CC +:10034000D5DF2FB7F8948EE991E090931F02809348 +:100350001E0290932102809320022FBF2FB7F894A2 +:1003600089E191E090939A018093990190939C0187 +:1003700080939B012FBF7894CEE9D1E003E08FB743 +:10038000F894909122028FBF903809F180E091E0BB +:10039000ABD497FD1CC0E0911E02F0911F02808338 +:1003A000E0911E02F0911F02CF01019690931F026F +:1003B00080931E028E51924011F4D283C1839FB765 +:1003C000F894809122028F5F809322029FBF8FB7A3 +:1003D000F89410919D018FBFA89902C0113678F151 +:1003E000A89A80919D01882361F05D980093160181 +:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 +:1004000011501123B1F780911601882351F080918A +:10041000160181508093160180911601882309F4FA +:100420005D9A80911701882351F0809117018150C6 +:100430008093170180911701882309F45C9A8FB784 +:10044000F894909122028FBF992369F08EE991E090 +:1004500084DE982F8091C80085FFFCCF9093CE005A +:100460005C980093170180E091E095D42AD487CF5F +:10047000DA01923049F0933061F09130F9F4E8E913 +:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 +:1004900019C0813049F0813018F0823079F408C0F9 +:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 +:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 +:1004C00020E030E0ED93FC93C901089528E030E08E +:1004D00040E003C04F5F220F331F28173907D0F3C6 +:1004E000842F8295807F08958093E9008091EB00AE +:1004F00081608093EB001092ED006093EC004093DC +:10050000ED008091EE00881F8827881F08951092C3 +:10051000F40090E09093E9001092F0001092E8004F +:100520001092ED008091EB008E7F8093EB009F5F37 +:10053000953081F708958091270288238CF403C0B9 +:100540008EB38823B1F08091E80082FFF9CF8091CB +:10055000E8008B778093E80008958EB3882349F0F4 +:100560008091E80080FFF9CF8091E8008E7780933A +:10057000E800089594E68091EC0080FF05C080912A +:10058000E80080FF05C023C08091E80082FD1FC005 +:100590008EB3882311F482E008958EB3853011F470 +:1005A00083E008958091EB0085FF02C081E008950B +:1005B0008091E10082FFDFCF8091E1008B7F80930B +:1005C000E100992311F484E008959150D4CF80E0A4 +:1005D00008959C0140912D0250912E024617570715 +:1005E00018F4F90120E038C06115710511F0AB0174 +:1005F000F8CF8091E8008E778093E80040E050E0EB +:10060000F0CF8091E80083FF02C081E008958091DF +:10061000E80082FD2DC08EB3882381F18EB3853032 +:1006200079F18091E80080FF17C09091F20006C038 +:1006300081918093F100415050409F5F41155105D9 +:1006400011F09830A8F320E0983009F421E080916F +:10065000E8008E778093E8004115510591F622233A +:1006600081F606C08EB3882349F08EB3853041F001 +:100670008091E80082FFF6CF80E0089582E008953F +:1006800083E008959C0140912D0250912E0246175F +:10069000570710F490E03BC06115710511F0AB01F4 +:1006A000F9CF8091E8008E778093E80040E050E039 +:1006B000F1CF8091E80083FF02C081E0089580912E +:1006C000E80082FD30C08EB3882399F18EB3853067 +:1006D00091F18091E80080FF1AC08091F20009C07A +:1006E000F9012F5F3F4FE491E093F10041505040FA +:1006F0008F5F4115510511F0883090F390E08830FC +:1007000009F491E08091E8008E778093E80041152C +:10071000510579F6992369F606C08EB3882349F00E +:100720008EB3853041F08091E80082FFF6CF80E003 +:10073000089582E0089583E008959C016115710594 +:1007400029F48091E8008B778093E800F90120C0BC +:100750008091E80083FF02C081E008958EB3882372 +:1007600039F18EB3853031F18091E80082FFF0CF0E +:1007700006C08091F10081936150704021F080911A +:10078000F2008823B1F78091E8008B778093E8002E +:1007900061157105E9F606C08EB3882349F08EB362 +:1007A000853041F08091E80080FFF6CF80E0089529 +:1007B00082E0089583E0089542D044D01EBA10929A +:1007C0002502109224021092230284E089BD89B58B +:1007D000826089BD09B400FEFDCF8091D800982FBA +:1007E0009F779093D80080688093D80080916300B1 +:1007F0008E7F809363008091D8008F7D8093D80096 +:100800008091E0008E7F8093E0008091E1008E7FF8 +:100810008093E1008091E20081608093E20080910A +:10082000E100877F8093E1008091E20088608093FF +:10083000E2000895C1DF81E08093260208951092BE +:10084000E20008951092E10008951F920F920FB6F2 +:100850000F9211241F932F933F934F935F936F93A6 +:100860007F938F939F93AF93BF93EF93FF93E9EEA3 +:10087000F0E0108117701082E0EFF0E08081877F58 +:1008800080837894C3D0F894A9EEB0E01C92E0EF96 +:10089000F0E08081886080831C93FF91EF91BF918D +:1008A000AF919F918F917F916F915F914F913F9108 +:1008B0002F911F910F900FBE0F901F9018951F92B0 +:1008C0000F920FB60F9211242F933F934F935F9384 +:1008D0006F937F938F939F93AF93BF93EF93FF9308 +:1008E0008091E10080FF1BC08091E20080FF17C073 +:1008F0008091E1008E7F8093E1008091E2008E7F05 +:100900008093E2008091E20080618093E200809118 +:10091000D80080628093D80019BC1EBAD1D18091D2 +:10092000E10084FF29C08091E20084FF25C084E0BB +:1009300089BD89B5826089BD09B400FEFDCF809173 +:10094000D8008F7D8093D8008091E1008F7E8093C6 +:10095000E1008091E2008F7E8093E2008091E200CE +:1009600081608093E20080912502882311F481E068 +:1009700001C084E08EBBA4D18091E10083FF27C039 +:100980008091E20083FF23C08091E100877F809304 +:10099000E10082E08EBB109225028091E1008E7F03 +:1009A0008093E1008091E2008E7F8093E20080914D +:1009B000E20080618093E200AADD80E060E042E036 +:1009C00093DD8091F00088608093F00079D1809170 +:1009D000E10082FF0AC08091E20082FF06C08091A0 +:1009E000E1008B7F8093E1006BD1FF91EF91BF918C +:1009F000AF919F918F917F916F915F914F913F91B7 +:100A00002F910F900FBE0F901F9018951F93DF939B +:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D +:100A2000CDBFE7E2F2E08091F100819322E0EF3266 +:100A3000F207C9F78091270230912802353009F476 +:100A400087C0363040F43130C9F1313070F0333086 +:100A500009F01DC133C0383009F4EFC0393009F452 +:100A6000FEC0363009F013C192C0803821F08238C0 +:100A700009F00DC108C090912302809124028823BF +:100A800099F0926011C080912B0287708093E900E9 +:100A90008091EB0090E025E0969587952A95E1F707 +:100AA000982F91701092E9008091E800877F8093E1 +:100AB000E8009093F1001092F100CAC0882319F069 +:100AC000823009F0E4C090E08F719070009721F0BF +:100AD000029709F0DDC00CC080912902813009F035 +:100AE000D7C010922402333069F5809324022AC0C3 +:100AF00080912902882331F520912B02277009F477 +:100B0000C7C02093E9008091EB0080FFC1C0333063 +:100B100021F48091EB00806213C08091EB00806132 +:100B20008093EB0081E090E002C0880F991F2A9526 +:100B3000E2F78093EA001092EA008091EB0088606F +:100B40008093EB001092E9008091E800877F83C0DA +:100B5000882309F09CC0109129028091E800877FCA +:100B60008093E800E8DC04C08EB3882309F490C0C9 +:100B70008091E80080FFF8CF812F8F7711F492E009 +:100B800001C093E09EBB80688093E30081C08058E1 +:100B9000823008F07CC08091290290912A0223E0E3 +:100BA0008C3D920799F55FB7F894DE0115964EE0FB +:100BB00020E030E061E2E42FF0E0609357008491A0 +:100BC00020FF03C082958F704F5F982F9F70892FF1 +:100BD000805D8A3308F0895F8C9311961C9211977F +:100BE0002F5F3F4F12962431310529F75FBF8AE20C +:100BF0008B8383E08C838091E800877F8093E8007B +:100C0000CE0103966AE270E0E4DC11C060912B0231 +:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 +:100C2000E800877F8093E80089819A812BDD80919D +:100C3000E8008B778093E8002BC0803841F58091E5 +:100C4000E800877F8093E800809125028093F1007F +:100C50008091E8008E778093E8006DDC19C08823CE +:100C6000B1F490912902923098F48091E800877F46 +:100C70008093E800909325025EDC80912502882312 +:100C800011F483E001C084E08EBB2DDB01C028DBC2 +:100C90008091E80083FF0AC08091EB00806280931E +:100CA000EB008091E800877F8093E800AC960FB658 +:100CB000F894DEBF0FBECDBFCF91DF911F91089595 +:100CC00008951F938EB3882361F01091E90010926C +:100CD000E9008091E80083FF01C098DE177010934F +:100CE000E9001F9108950895FC018EB3843021F529 +:100CF00087859089A189B2890097A105B105E1F0A6 +:100D000085818093E9008091E80082FF15C0809181 +:100D1000F200882319F42FEF3FEF04C08091F10017 +:100D2000282F30E08091F200882341F48091E80080 +:100D30008B778093E80002C02FEF3FEFC901089541 +:100D4000FC018EB3843011F587859089A189B28921 +:100D50000097A105B105D1F081818093E9008091D0 +:100D6000F2008823A9F09091E8008091E8008E7746 +:100D70008093E80095FD0CC0FDDB982F882349F493 +:100D80008091E8008E778093E80003C092E001C074 +:100D900090E0892F0895FC018EB3843051F487854B +:100DA0009089A189B2890097A105B10511F0CF0101 +:100DB000C7CF08951F93FC01162F8EB38430D9F44A +:100DC00087859089A189B2890097A105B10599F01D +:100DD00081818093E9008091E80085FD08C08091C1 +:100DE000E8008E778093E800C5DB882329F4109310 +:100DF000F10080E001C082E01F9108950F931F93DE +:100E0000CF93DF93EC010D96FC0189E0DF011D9289 +:100E10008A95E9F72A813B8109818C81882311F425 +:100E200010E001C014E0C90151DB182B1260802FC3 +:100E300061E8412F59DB882329F12E813F810D8103 +:100E40008885882311F410E001C014E0C9013EDB5D +:100E5000182B1260802F60E8412F46DB882391F029 +:100E60002A853B8509858C85882311F410E001C013 +:100E700014E0C9012BDB182B1260802F61EC412F8D +:100E800033DB01C080E0DF91CF911F910F91089576 +:100E9000CF93DF93EC018091E80083FF60C08881ED +:100EA00090E020912B0230912C022817390709F08D +:100EB00056C080912802813261F0823220F4803263 +:100EC00009F04DC019C0823269F1833209F047C080 +:100ED00038C080912702813A09F041C08091E80032 +:100EE000877F8093E800CE010F9667E070E071DBAA +:100EF0008091E8008B7713C080912702813279F5C9 +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E013DCCE013ED98091E8008E7780939B +:100F2000E8001DC0809127028132C9F48091E80059 +:100F3000877F8093E800809129028D87CE01C8D9F0 +:100F40000DC080912702813251F48091E800877FA3 +:100F50008093E800CE0160912902C5DEECDADF91D2 +:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 +:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 +:100F800020F0A21BB30BE40BF50B661F771F881F25 +:100F9000991F1A9469F760957095809590959B01BB +:0C0FA000AC01BD01CF010895F894FFCF13 +:100FAC0000034000000440000002080000000000A4 +:060FBC000000000000002F +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-MegaADK-Rev3.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-MegaADK-Rev3.hex index 3af6a243f31..1ca40e2e57f 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-MegaADK-Rev3.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-MegaADK-Rev3.hex @@ -1,254 +1,254 @@ -:1000000090C00000A9C00000A7C00000A5C000006B -:10001000A3C00000A1C000009FC000009DC0000060 -:100020009BC0000099C0000097C0000048C40000B9 -:100030000CC4000091C000008FC000008DC0000003 -:100040008BC0000089C0000087C0000085C0000090 -:1000500083C0000081C000007FC0000002C100001A -:100060007BC0000079C0000077C0000075C00000B0 -:1000700073C0000071C000006FC000006DC00000C0 -:100080006BC0000069C0000067C0000065C00000D0 -:1000900063C0000061C000001201100102000008EE -:1000A0004123440001000102DC0109023E0002017B -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:10012000000011241FBECFEFD2E0DEBFCDBF11E033 -:10013000A0E0B1E0ECEAFFE002C005900D92A6312C -:10014000B107D9F712E0A6E1B1E001C01D92AF32CC -:10015000B107E1F7F1D028C753CF9C01DC01AE57BE -:10016000BF4FED91FC91119741911196FC93EE9345 -:1001700080589F4FE817F90711F42D933C939FB7D0 -:10018000F894F901EC57FF4F8081815080839FBF25 -:10019000842F0895DF92EF92FF920F931F93FC013B -:1001A0008489813019F0823021F405C040E3D42ED7 -:1001B00004C0DD2402C030E2D32E8389823011F4E2 -:1001C00088E0D82A8589873031F0883031F0863050 -:1001D00031F482E003C084E001C086E0D82A1092A6 -:1001E000C9001092C8001092CA00E784F088018903 -:1001F000128980E0E81681EEF80680E0080780E0CA -:10020000180719F420E130E00FC0C801B701969536 -:1002100087957795679560587B47814E9F4FA801DA -:100220009701A0D6215030403093CD002093CC00D0 -:10023000D092CA0080E0E81681EEF80680E0080758 -:1002400080E0180711F082E001C080E08093C800D0 -:1002500088E98093C9001F910F91FF90EF90DF9084 -:1002600008951F920F920FB60F9211242F938F9320 -:100270009F93EF93FF939091CE008EB38430F1F46F -:10028000E0919901F0919A019083E0919901F091A8 -:100290009A01CF01019690939A018093990189590F -:1002A000914021F489E191E0928381839FB7F89492 -:1002B00080919D018F5F80939D019FBFFF91EF9182 -:1002C0009F918F912F910F900FBE0F901F901895B7 -:1002D000FC01858580FF02C05F9808955F9A0895AC -:1002E00080E091E0D5C580E091E088C584B7877F44 -:1002F00084BF28E10FB6F89420936000109260004C -:100300000FBE87E690E09093CD008093CC0086E00E -:100310008093CA001092C8002093C900539A5A9A39 -:100320008AB180638AB98BB180638BB983D284E050 -:1003300085BD5F9A579A08950F931F93CF93DF93CC -:10034000D5DF2FB7F8948EE991E090931F02809348 -:100350001E0290932102809320022FBF2FB7F894A2 -:1003600089E191E090939A018093990190939C0187 -:1003700080939B012FBF7894CEE9D1E003E08FB743 -:10038000F894909122028FBF903809F180E091E0BB -:10039000ABD497FD1CC0E0911E02F0911F02808338 -:1003A000E0911E02F0911F02CF01019690931F026F -:1003B00080931E028E51924011F4D283C1839FB765 -:1003C000F894809122028F5F809322029FBF8FB7A3 -:1003D000F89410919D018FBFA89902C0113678F151 -:1003E000A89A80919D01882361F05D980093160181 -:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 -:1004000011501123B1F780911601882351F080918A -:10041000160181508093160180911601882309F4FA -:100420005D9A80911701882351F0809117018150C6 -:100430008093170180911701882309F45C9A8FB784 -:10044000F894909122028FBF992369F08EE991E090 -:1004500084DE982F8091C80085FFFCCF9093CE005A -:100460005C980093170180E091E095D42AD487CF5F -:10047000DA01923049F0933061F09130F9F4E8E913 -:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 -:1004900019C0813049F0813018F0823079F408C0F9 -:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 -:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 -:1004C00020E030E0ED93FC93C901089528E030E08E -:1004D00040E003C04F5F220F331F28173907D0F3C6 -:1004E000842F8295807F08958093E9008091EB00AE -:1004F00081608093EB001092ED006093EC004093DC -:10050000ED008091EE00881F8827881F08951092C3 -:10051000F40090E09093E9001092F0001092E8004F -:100520001092ED008091EB008E7F8093EB009F5F37 -:10053000953081F708958091270288238CF403C0B9 -:100540008EB38823B1F08091E80082FFF9CF8091CB -:10055000E8008B778093E80008958EB3882349F0F4 -:100560008091E80080FFF9CF8091E8008E7780933A -:10057000E800089594E68091EC0080FF05C080912A -:10058000E80080FF05C023C08091E80082FD1FC005 -:100590008EB3882311F482E008958EB3853011F470 -:1005A00083E008958091EB0085FF02C081E008950B -:1005B0008091E10082FFDFCF8091E1008B7F80930B -:1005C000E100992311F484E008959150D4CF80E0A4 -:1005D00008959C0140912D0250912E024617570715 -:1005E00018F4F90120E038C06115710511F0AB0174 -:1005F000F8CF8091E8008E778093E80040E050E0EB -:10060000F0CF8091E80083FF02C081E008958091DF -:10061000E80082FD2DC08EB3882381F18EB3853032 -:1006200079F18091E80080FF17C09091F20006C038 -:1006300081918093F100415050409F5F41155105D9 -:1006400011F09830A8F320E0983009F421E080916F -:10065000E8008E778093E8004115510591F622233A -:1006600081F606C08EB3882349F08EB3853041F001 -:100670008091E80082FFF6CF80E0089582E008953F -:1006800083E008959C0140912D0250912E0246175F -:10069000570710F490E03BC06115710511F0AB01F4 -:1006A000F9CF8091E8008E778093E80040E050E039 -:1006B000F1CF8091E80083FF02C081E0089580912E -:1006C000E80082FD30C08EB3882399F18EB3853067 -:1006D00091F18091E80080FF1AC08091F20009C07A -:1006E000F9012F5F3F4FE491E093F10041505040FA -:1006F0008F5F4115510511F0883090F390E08830FC -:1007000009F491E08091E8008E778093E80041152C -:10071000510579F6992369F606C08EB3882349F00E -:100720008EB3853041F08091E80082FFF6CF80E003 -:10073000089582E0089583E008959C016115710594 -:1007400029F48091E8008B778093E800F90120C0BC -:100750008091E80083FF02C081E008958EB3882372 -:1007600039F18EB3853031F18091E80082FFF0CF0E -:1007700006C08091F10081936150704021F080911A -:10078000F2008823B1F78091E8008B778093E8002E -:1007900061157105E9F606C08EB3882349F08EB362 -:1007A000853041F08091E80080FFF6CF80E0089529 -:1007B00082E0089583E0089542D044D01EBA10929A -:1007C0002502109224021092230284E089BD89B58B -:1007D000826089BD09B400FEFDCF8091D800982FBA -:1007E0009F779093D80080688093D80080916300B1 -:1007F0008E7F809363008091D8008F7D8093D80096 -:100800008091E0008E7F8093E0008091E1008E7FF8 -:100810008093E1008091E20081608093E20080910A -:10082000E100877F8093E1008091E20088608093FF -:10083000E2000895C1DF81E08093260208951092BE -:10084000E20008951092E10008951F920F920FB6F2 -:100850000F9211241F932F933F934F935F936F93A6 -:100860007F938F939F93AF93BF93EF93FF93E9EEA3 -:10087000F0E0108117701082E0EFF0E08081877F58 -:1008800080837894C3D0F894A9EEB0E01C92E0EF96 -:10089000F0E08081886080831C93FF91EF91BF918D -:1008A000AF919F918F917F916F915F914F913F9108 -:1008B0002F911F910F900FBE0F901F9018951F92B0 -:1008C0000F920FB60F9211242F933F934F935F9384 -:1008D0006F937F938F939F93AF93BF93EF93FF9308 -:1008E0008091E10080FF1BC08091E20080FF17C073 -:1008F0008091E1008E7F8093E1008091E2008E7F05 -:100900008093E2008091E20080618093E200809118 -:10091000D80080628093D80019BC1EBAD1D18091D2 -:10092000E10084FF29C08091E20084FF25C084E0BB -:1009300089BD89B5826089BD09B400FEFDCF809173 -:10094000D8008F7D8093D8008091E1008F7E8093C6 -:10095000E1008091E2008F7E8093E2008091E200CE -:1009600081608093E20080912502882311F481E068 -:1009700001C084E08EBBA4D18091E10083FF27C039 -:100980008091E20083FF23C08091E100877F809304 -:10099000E10082E08EBB109225028091E1008E7F03 -:1009A0008093E1008091E2008E7F8093E20080914D -:1009B000E20080618093E200AADD80E060E042E036 -:1009C00093DD8091F00088608093F00079D1809170 -:1009D000E10082FF0AC08091E20082FF06C08091A0 -:1009E000E1008B7F8093E1006BD1FF91EF91BF918C -:1009F000AF919F918F917F916F915F914F913F91B7 -:100A00002F910F900FBE0F901F9018951F93DF939B -:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D -:100A2000CDBFE7E2F2E08091F100819322E0EF3266 -:100A3000F207C9F78091270230912802353009F476 -:100A400087C0363040F43130C9F1313070F0333086 -:100A500009F01DC133C0383009F4EFC0393009F452 -:100A6000FEC0363009F013C192C0803821F08238C0 -:100A700009F00DC108C090912302809124028823BF -:100A800099F0926011C080912B0287708093E900E9 -:100A90008091EB0090E025E0969587952A95E1F707 -:100AA000982F91701092E9008091E800877F8093E1 -:100AB000E8009093F1001092F100CAC0882319F069 -:100AC000823009F0E4C090E08F719070009721F0BF -:100AD000029709F0DDC00CC080912902813009F035 -:100AE000D7C010922402333069F5809324022AC0C3 -:100AF00080912902882331F520912B02277009F477 -:100B0000C7C02093E9008091EB0080FFC1C0333063 -:100B100021F48091EB00806213C08091EB00806132 -:100B20008093EB0081E090E002C0880F991F2A9526 -:100B3000E2F78093EA001092EA008091EB0088606F -:100B40008093EB001092E9008091E800877F83C0DA -:100B5000882309F09CC0109129028091E800877FCA -:100B60008093E800E8DC04C08EB3882309F490C0C9 -:100B70008091E80080FFF8CF812F8F7711F492E009 -:100B800001C093E09EBB80688093E30081C08058E1 -:100B9000823008F07CC08091290290912A0223E0E3 -:100BA0008C3D920799F55FB7F894DE0115964EE0FB -:100BB00020E030E061E2E42FF0E0609357008491A0 -:100BC00020FF03C082958F704F5F982F9F70892FF1 -:100BD000805D8A3308F0895F8C9311961C9211977F -:100BE0002F5F3F4F12962431310529F75FBF8AE20C -:100BF0008B8383E08C838091E800877F8093E8007B -:100C0000CE0103966AE270E0E4DC11C060912B0231 -:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 -:100C2000E800877F8093E80089819A812BDD80919D -:100C3000E8008B778093E8002BC0803841F58091E5 -:100C4000E800877F8093E800809125028093F1007F -:100C50008091E8008E778093E8006DDC19C08823CE -:100C6000B1F490912902923098F48091E800877F46 -:100C70008093E800909325025EDC80912502882312 -:100C800011F483E001C084E08EBB2DDB01C028DBC2 -:100C90008091E80083FF0AC08091EB00806280931E -:100CA000EB008091E800877F8093E800AC960FB658 -:100CB000F894DEBF0FBECDBFCF91DF911F91089595 -:100CC00008951F938EB3882361F01091E90010926C -:100CD000E9008091E80083FF01C098DE177010934F -:100CE000E9001F9108950895FC018EB3843021F529 -:100CF00087859089A189B2890097A105B105E1F0A6 -:100D000085818093E9008091E80082FF15C0809181 -:100D1000F200882319F42FEF3FEF04C08091F10017 -:100D2000282F30E08091F200882341F48091E80080 -:100D30008B778093E80002C02FEF3FEFC901089541 -:100D4000FC018EB3843011F587859089A189B28921 -:100D50000097A105B105D1F081818093E9008091D0 -:100D6000F2008823A9F09091E8008091E8008E7746 -:100D70008093E80095FD0CC0FDDB982F882349F493 -:100D80008091E8008E778093E80003C092E001C074 -:100D900090E0892F0895FC018EB3843051F487854B -:100DA0009089A189B2890097A105B10511F0CF0101 -:100DB000C7CF08951F93FC01162F8EB38430D9F44A -:100DC00087859089A189B2890097A105B10599F01D -:100DD00081818093E9008091E80085FD08C08091C1 -:100DE000E8008E778093E800C5DB882329F4109310 -:100DF000F10080E001C082E01F9108950F931F93DE -:100E0000CF93DF93EC010D96FC0189E0DF011D9289 -:100E10008A95E9F72A813B8109818C81882311F425 -:100E200010E001C014E0C90151DB182B1260802FC3 -:100E300061E8412F59DB882329F12E813F810D8103 -:100E40008885882311F410E001C014E0C9013EDB5D -:100E5000182B1260802F60E8412F46DB882391F029 -:100E60002A853B8509858C85882311F410E001C013 -:100E700014E0C9012BDB182B1260802F61EC412F8D -:100E800033DB01C080E0DF91CF911F910F91089576 -:100E9000CF93DF93EC018091E80083FF60C08881ED -:100EA00090E020912B0230912C022817390709F08D -:100EB00056C080912802813261F0823220F4803263 -:100EC00009F04DC019C0823269F1833209F047C080 -:100ED00038C080912702813A09F041C08091E80032 -:100EE000877F8093E800CE010F9667E070E071DBAA -:100EF0008091E8008B7713C080912702813279F5C9 -:100F00008091E800877F8093E800CE010F9667E02C -:100F100070E013DCCE013ED98091E8008E7780939B -:100F2000E8001DC0809127028132C9F48091E80059 -:100F3000877F8093E800809129028D87CE01C8D9F0 -:100F40000DC080912702813251F48091E800877FA3 -:100F50008093E800CE0160912902C5DEECDADF91D2 -:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 -:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 -:100F800020F0A21BB30BE40BF50B661F771F881F25 -:100F9000991F1A9469F760957095809590959B01BB -:0C0FA000AC01BD01CF010895F894FFCF13 -:100FAC0000034000000440000002080000000000A4 -:060FBC000000000000002F -:00000001FF +:1000000090C00000A9C00000A7C00000A5C000006B +:10001000A3C00000A1C000009FC000009DC0000060 +:100020009BC0000099C0000097C0000048C40000B9 +:100030000CC4000091C000008FC000008DC0000003 +:100040008BC0000089C0000087C0000085C0000090 +:1000500083C0000081C000007FC0000002C100001A +:100060007BC0000079C0000077C0000075C00000B0 +:1000700073C0000071C000006FC000006DC00000C0 +:100080006BC0000069C0000067C0000065C00000D0 +:1000900063C0000061C000001201100102000008EE +:1000A0004123440001000102DC0109023E0002017B +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:10012000000011241FBECFEFD2E0DEBFCDBF11E033 +:10013000A0E0B1E0ECEAFFE002C005900D92A6312C +:10014000B107D9F712E0A6E1B1E001C01D92AF32CC +:10015000B107E1F7F1D028C753CF9C01DC01AE57BE +:10016000BF4FED91FC91119741911196FC93EE9345 +:1001700080589F4FE817F90711F42D933C939FB7D0 +:10018000F894F901EC57FF4F8081815080839FBF25 +:10019000842F0895DF92EF92FF920F931F93FC013B +:1001A0008489813019F0823021F405C040E3D42ED7 +:1001B00004C0DD2402C030E2D32E8389823011F4E2 +:1001C00088E0D82A8589873031F0883031F0863050 +:1001D00031F482E003C084E001C086E0D82A1092A6 +:1001E000C9001092C8001092CA00E784F088018903 +:1001F000128980E0E81681EEF80680E0080780E0CA +:10020000180719F420E130E00FC0C801B701969536 +:1002100087957795679560587B47814E9F4FA801DA +:100220009701A0D6215030403093CD002093CC00D0 +:10023000D092CA0080E0E81681EEF80680E0080758 +:1002400080E0180711F082E001C080E08093C800D0 +:1002500088E98093C9001F910F91FF90EF90DF9084 +:1002600008951F920F920FB60F9211242F938F9320 +:100270009F93EF93FF939091CE008EB38430F1F46F +:10028000E0919901F0919A019083E0919901F091A8 +:100290009A01CF01019690939A018093990189590F +:1002A000914021F489E191E0928381839FB7F89492 +:1002B00080919D018F5F80939D019FBFFF91EF9182 +:1002C0009F918F912F910F900FBE0F901F901895B7 +:1002D000FC01858580FF02C05F9808955F9A0895AC +:1002E00080E091E0D5C580E091E088C584B7877F44 +:1002F00084BF28E10FB6F89420936000109260004C +:100300000FBE87E690E09093CD008093CC0086E00E +:100310008093CA001092C8002093C900539A5A9A39 +:100320008AB180638AB98BB180638BB983D284E050 +:1003300085BD5F9A579A08950F931F93CF93DF93CC +:10034000D5DF2FB7F8948EE991E090931F02809348 +:100350001E0290932102809320022FBF2FB7F894A2 +:1003600089E191E090939A018093990190939C0187 +:1003700080939B012FBF7894CEE9D1E003E08FB743 +:10038000F894909122028FBF903809F180E091E0BB +:10039000ABD497FD1CC0E0911E02F0911F02808338 +:1003A000E0911E02F0911F02CF01019690931F026F +:1003B00080931E028E51924011F4D283C1839FB765 +:1003C000F894809122028F5F809322029FBF8FB7A3 +:1003D000F89410919D018FBFA89902C0113678F151 +:1003E000A89A80919D01882361F05D980093160181 +:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 +:1004000011501123B1F780911601882351F080918A +:10041000160181508093160180911601882309F4FA +:100420005D9A80911701882351F0809117018150C6 +:100430008093170180911701882309F45C9A8FB784 +:10044000F894909122028FBF992369F08EE991E090 +:1004500084DE982F8091C80085FFFCCF9093CE005A +:100460005C980093170180E091E095D42AD487CF5F +:10047000DA01923049F0933061F09130F9F4E8E913 +:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 +:1004900019C0813049F0813018F0823079F408C0F9 +:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 +:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 +:1004C00020E030E0ED93FC93C901089528E030E08E +:1004D00040E003C04F5F220F331F28173907D0F3C6 +:1004E000842F8295807F08958093E9008091EB00AE +:1004F00081608093EB001092ED006093EC004093DC +:10050000ED008091EE00881F8827881F08951092C3 +:10051000F40090E09093E9001092F0001092E8004F +:100520001092ED008091EB008E7F8093EB009F5F37 +:10053000953081F708958091270288238CF403C0B9 +:100540008EB38823B1F08091E80082FFF9CF8091CB +:10055000E8008B778093E80008958EB3882349F0F4 +:100560008091E80080FFF9CF8091E8008E7780933A +:10057000E800089594E68091EC0080FF05C080912A +:10058000E80080FF05C023C08091E80082FD1FC005 +:100590008EB3882311F482E008958EB3853011F470 +:1005A00083E008958091EB0085FF02C081E008950B +:1005B0008091E10082FFDFCF8091E1008B7F80930B +:1005C000E100992311F484E008959150D4CF80E0A4 +:1005D00008959C0140912D0250912E024617570715 +:1005E00018F4F90120E038C06115710511F0AB0174 +:1005F000F8CF8091E8008E778093E80040E050E0EB +:10060000F0CF8091E80083FF02C081E008958091DF +:10061000E80082FD2DC08EB3882381F18EB3853032 +:1006200079F18091E80080FF17C09091F20006C038 +:1006300081918093F100415050409F5F41155105D9 +:1006400011F09830A8F320E0983009F421E080916F +:10065000E8008E778093E8004115510591F622233A +:1006600081F606C08EB3882349F08EB3853041F001 +:100670008091E80082FFF6CF80E0089582E008953F +:1006800083E008959C0140912D0250912E0246175F +:10069000570710F490E03BC06115710511F0AB01F4 +:1006A000F9CF8091E8008E778093E80040E050E039 +:1006B000F1CF8091E80083FF02C081E0089580912E +:1006C000E80082FD30C08EB3882399F18EB3853067 +:1006D00091F18091E80080FF1AC08091F20009C07A +:1006E000F9012F5F3F4FE491E093F10041505040FA +:1006F0008F5F4115510511F0883090F390E08830FC +:1007000009F491E08091E8008E778093E80041152C +:10071000510579F6992369F606C08EB3882349F00E +:100720008EB3853041F08091E80082FFF6CF80E003 +:10073000089582E0089583E008959C016115710594 +:1007400029F48091E8008B778093E800F90120C0BC +:100750008091E80083FF02C081E008958EB3882372 +:1007600039F18EB3853031F18091E80082FFF0CF0E +:1007700006C08091F10081936150704021F080911A +:10078000F2008823B1F78091E8008B778093E8002E +:1007900061157105E9F606C08EB3882349F08EB362 +:1007A000853041F08091E80080FFF6CF80E0089529 +:1007B00082E0089583E0089542D044D01EBA10929A +:1007C0002502109224021092230284E089BD89B58B +:1007D000826089BD09B400FEFDCF8091D800982FBA +:1007E0009F779093D80080688093D80080916300B1 +:1007F0008E7F809363008091D8008F7D8093D80096 +:100800008091E0008E7F8093E0008091E1008E7FF8 +:100810008093E1008091E20081608093E20080910A +:10082000E100877F8093E1008091E20088608093FF +:10083000E2000895C1DF81E08093260208951092BE +:10084000E20008951092E10008951F920F920FB6F2 +:100850000F9211241F932F933F934F935F936F93A6 +:100860007F938F939F93AF93BF93EF93FF93E9EEA3 +:10087000F0E0108117701082E0EFF0E08081877F58 +:1008800080837894C3D0F894A9EEB0E01C92E0EF96 +:10089000F0E08081886080831C93FF91EF91BF918D +:1008A000AF919F918F917F916F915F914F913F9108 +:1008B0002F911F910F900FBE0F901F9018951F92B0 +:1008C0000F920FB60F9211242F933F934F935F9384 +:1008D0006F937F938F939F93AF93BF93EF93FF9308 +:1008E0008091E10080FF1BC08091E20080FF17C073 +:1008F0008091E1008E7F8093E1008091E2008E7F05 +:100900008093E2008091E20080618093E200809118 +:10091000D80080628093D80019BC1EBAD1D18091D2 +:10092000E10084FF29C08091E20084FF25C084E0BB +:1009300089BD89B5826089BD09B400FEFDCF809173 +:10094000D8008F7D8093D8008091E1008F7E8093C6 +:10095000E1008091E2008F7E8093E2008091E200CE +:1009600081608093E20080912502882311F481E068 +:1009700001C084E08EBBA4D18091E10083FF27C039 +:100980008091E20083FF23C08091E100877F809304 +:10099000E10082E08EBB109225028091E1008E7F03 +:1009A0008093E1008091E2008E7F8093E20080914D +:1009B000E20080618093E200AADD80E060E042E036 +:1009C00093DD8091F00088608093F00079D1809170 +:1009D000E10082FF0AC08091E20082FF06C08091A0 +:1009E000E1008B7F8093E1006BD1FF91EF91BF918C +:1009F000AF919F918F917F916F915F914F913F91B7 +:100A00002F910F900FBE0F901F9018951F93DF939B +:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D +:100A2000CDBFE7E2F2E08091F100819322E0EF3266 +:100A3000F207C9F78091270230912802353009F476 +:100A400087C0363040F43130C9F1313070F0333086 +:100A500009F01DC133C0383009F4EFC0393009F452 +:100A6000FEC0363009F013C192C0803821F08238C0 +:100A700009F00DC108C090912302809124028823BF +:100A800099F0926011C080912B0287708093E900E9 +:100A90008091EB0090E025E0969587952A95E1F707 +:100AA000982F91701092E9008091E800877F8093E1 +:100AB000E8009093F1001092F100CAC0882319F069 +:100AC000823009F0E4C090E08F719070009721F0BF +:100AD000029709F0DDC00CC080912902813009F035 +:100AE000D7C010922402333069F5809324022AC0C3 +:100AF00080912902882331F520912B02277009F477 +:100B0000C7C02093E9008091EB0080FFC1C0333063 +:100B100021F48091EB00806213C08091EB00806132 +:100B20008093EB0081E090E002C0880F991F2A9526 +:100B3000E2F78093EA001092EA008091EB0088606F +:100B40008093EB001092E9008091E800877F83C0DA +:100B5000882309F09CC0109129028091E800877FCA +:100B60008093E800E8DC04C08EB3882309F490C0C9 +:100B70008091E80080FFF8CF812F8F7711F492E009 +:100B800001C093E09EBB80688093E30081C08058E1 +:100B9000823008F07CC08091290290912A0223E0E3 +:100BA0008C3D920799F55FB7F894DE0115964EE0FB +:100BB00020E030E061E2E42FF0E0609357008491A0 +:100BC00020FF03C082958F704F5F982F9F70892FF1 +:100BD000805D8A3308F0895F8C9311961C9211977F +:100BE0002F5F3F4F12962431310529F75FBF8AE20C +:100BF0008B8383E08C838091E800877F8093E8007B +:100C0000CE0103966AE270E0E4DC11C060912B0231 +:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 +:100C2000E800877F8093E80089819A812BDD80919D +:100C3000E8008B778093E8002BC0803841F58091E5 +:100C4000E800877F8093E800809125028093F1007F +:100C50008091E8008E778093E8006DDC19C08823CE +:100C6000B1F490912902923098F48091E800877F46 +:100C70008093E800909325025EDC80912502882312 +:100C800011F483E001C084E08EBB2DDB01C028DBC2 +:100C90008091E80083FF0AC08091EB00806280931E +:100CA000EB008091E800877F8093E800AC960FB658 +:100CB000F894DEBF0FBECDBFCF91DF911F91089595 +:100CC00008951F938EB3882361F01091E90010926C +:100CD000E9008091E80083FF01C098DE177010934F +:100CE000E9001F9108950895FC018EB3843021F529 +:100CF00087859089A189B2890097A105B105E1F0A6 +:100D000085818093E9008091E80082FF15C0809181 +:100D1000F200882319F42FEF3FEF04C08091F10017 +:100D2000282F30E08091F200882341F48091E80080 +:100D30008B778093E80002C02FEF3FEFC901089541 +:100D4000FC018EB3843011F587859089A189B28921 +:100D50000097A105B105D1F081818093E9008091D0 +:100D6000F2008823A9F09091E8008091E8008E7746 +:100D70008093E80095FD0CC0FDDB982F882349F493 +:100D80008091E8008E778093E80003C092E001C074 +:100D900090E0892F0895FC018EB3843051F487854B +:100DA0009089A189B2890097A105B10511F0CF0101 +:100DB000C7CF08951F93FC01162F8EB38430D9F44A +:100DC00087859089A189B2890097A105B10599F01D +:100DD00081818093E9008091E80085FD08C08091C1 +:100DE000E8008E778093E800C5DB882329F4109310 +:100DF000F10080E001C082E01F9108950F931F93DE +:100E0000CF93DF93EC010D96FC0189E0DF011D9289 +:100E10008A95E9F72A813B8109818C81882311F425 +:100E200010E001C014E0C90151DB182B1260802FC3 +:100E300061E8412F59DB882329F12E813F810D8103 +:100E40008885882311F410E001C014E0C9013EDB5D +:100E5000182B1260802F60E8412F46DB882391F029 +:100E60002A853B8509858C85882311F410E001C013 +:100E700014E0C9012BDB182B1260802F61EC412F8D +:100E800033DB01C080E0DF91CF911F910F91089576 +:100E9000CF93DF93EC018091E80083FF60C08881ED +:100EA00090E020912B0230912C022817390709F08D +:100EB00056C080912802813261F0823220F4803263 +:100EC00009F04DC019C0823269F1833209F047C080 +:100ED00038C080912702813A09F041C08091E80032 +:100EE000877F8093E800CE010F9667E070E071DBAA +:100EF0008091E8008B7713C080912702813279F5C9 +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E013DCCE013ED98091E8008E7780939B +:100F2000E8001DC0809127028132C9F48091E80059 +:100F3000877F8093E800809129028D87CE01C8D9F0 +:100F40000DC080912702813251F48091E800877FA3 +:100F50008093E800CE0160912902C5DEECDADF91D2 +:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 +:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 +:100F800020F0A21BB30BE40BF50B661F771F881F25 +:100F9000991F1A9469F760957095809590959B01BB +:0C0FA000AC01BD01CF010895F894FFCF13 +:100FAC0000034000000440000002080000000000A4 +:060FBC000000000000002F +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Uno-Rev3.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Uno-Rev3.hex index d1404eef09b..711fabfb2d4 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Uno-Rev3.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Uno-Rev3.hex @@ -1,254 +1,254 @@ -:1000000090C00000A9C00000A7C00000A5C000006B -:10001000A3C00000A1C000009FC000009DC0000060 -:100020009BC0000099C0000097C0000048C40000B9 -:100030000CC4000091C000008FC000008DC0000003 -:100040008BC0000089C0000087C0000085C0000090 -:1000500083C0000081C000007FC0000002C100001A -:100060007BC0000079C0000077C0000075C00000B0 -:1000700073C0000071C000006FC000006DC00000C0 -:100080006BC0000069C0000067C0000065C00000D0 -:1000900063C0000061C000001201100102000008EE -:1000A0004123430001000102DC0109023E0002017C -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:10012000000011241FBECFEFD2E0DEBFCDBF11E033 -:10013000A0E0B1E0ECEAFFE002C005900D92A6312C -:10014000B107D9F712E0A6E1B1E001C01D92AF32CC -:10015000B107E1F7F1D028C753CF9C01DC01AE57BE -:10016000BF4FED91FC91119741911196FC93EE9345 -:1001700080589F4FE817F90711F42D933C939FB7D0 -:10018000F894F901EC57FF4F8081815080839FBF25 -:10019000842F0895DF92EF92FF920F931F93FC013B -:1001A0008489813019F0823021F405C040E3D42ED7 -:1001B00004C0DD2402C030E2D32E8389823011F4E2 -:1001C00088E0D82A8589873031F0883031F0863050 -:1001D00031F482E003C084E001C086E0D82A1092A6 -:1001E000C9001092C8001092CA00E784F088018903 -:1001F000128980E0E81681EEF80680E0080780E0CA -:10020000180719F420E130E00FC0C801B701969536 -:1002100087957795679560587B47814E9F4FA801DA -:100220009701A0D6215030403093CD002093CC00D0 -:10023000D092CA0080E0E81681EEF80680E0080758 -:1002400080E0180711F082E001C080E08093C800D0 -:1002500088E98093C9001F910F91FF90EF90DF9084 -:1002600008951F920F920FB60F9211242F938F9320 -:100270009F93EF93FF939091CE008EB38430F1F46F -:10028000E0919901F0919A019083E0919901F091A8 -:100290009A01CF01019690939A018093990189590F -:1002A000914021F489E191E0928381839FB7F89492 -:1002B00080919D018F5F80939D019FBFFF91EF9182 -:1002C0009F918F912F910F900FBE0F901F901895B7 -:1002D000FC01858580FF02C05F9808955F9A0895AC -:1002E00080E091E0D5C580E091E088C584B7877F44 -:1002F00084BF28E10FB6F89420936000109260004C -:100300000FBE87E690E09093CD008093CC0086E00E -:100310008093CA001092C8002093C900539A5A9A39 -:100320008AB180638AB98BB180638BB983D284E050 -:1003300085BD5F9A579A08950F931F93CF93DF93CC -:10034000D5DF2FB7F8948EE991E090931F02809348 -:100350001E0290932102809320022FBF2FB7F894A2 -:1003600089E191E090939A018093990190939C0187 -:1003700080939B012FBF7894CEE9D1E003E08FB743 -:10038000F894909122028FBF903809F180E091E0BB -:10039000ABD497FD1CC0E0911E02F0911F02808338 -:1003A000E0911E02F0911F02CF01019690931F026F -:1003B00080931E028E51924011F4D283C1839FB765 -:1003C000F894809122028F5F809322029FBF8FB7A3 -:1003D000F89410919D018FBFA89902C0113678F151 -:1003E000A89A80919D01882361F05D980093160181 -:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 -:1004000011501123B1F780911601882351F080918A -:10041000160181508093160180911601882309F4FA -:100420005D9A80911701882351F0809117018150C6 -:100430008093170180911701882309F45C9A8FB784 -:10044000F894909122028FBF992369F08EE991E090 -:1004500084DE982F8091C80085FFFCCF9093CE005A -:100460005C980093170180E091E095D42AD487CF5F -:10047000DA01923049F0933061F09130F9F4E8E913 -:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 -:1004900019C0813049F0813018F0823079F408C0F9 -:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 -:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 -:1004C00020E030E0ED93FC93C901089528E030E08E -:1004D00040E003C04F5F220F331F28173907D0F3C6 -:1004E000842F8295807F08958093E9008091EB00AE -:1004F00081608093EB001092ED006093EC004093DC -:10050000ED008091EE00881F8827881F08951092C3 -:10051000F40090E09093E9001092F0001092E8004F -:100520001092ED008091EB008E7F8093EB009F5F37 -:10053000953081F708958091270288238CF403C0B9 -:100540008EB38823B1F08091E80082FFF9CF8091CB -:10055000E8008B778093E80008958EB3882349F0F4 -:100560008091E80080FFF9CF8091E8008E7780933A -:10057000E800089594E68091EC0080FF05C080912A -:10058000E80080FF05C023C08091E80082FD1FC005 -:100590008EB3882311F482E008958EB3853011F470 -:1005A00083E008958091EB0085FF02C081E008950B -:1005B0008091E10082FFDFCF8091E1008B7F80930B -:1005C000E100992311F484E008959150D4CF80E0A4 -:1005D00008959C0140912D0250912E024617570715 -:1005E00018F4F90120E038C06115710511F0AB0174 -:1005F000F8CF8091E8008E778093E80040E050E0EB -:10060000F0CF8091E80083FF02C081E008958091DF -:10061000E80082FD2DC08EB3882381F18EB3853032 -:1006200079F18091E80080FF17C09091F20006C038 -:1006300081918093F100415050409F5F41155105D9 -:1006400011F09830A8F320E0983009F421E080916F -:10065000E8008E778093E8004115510591F622233A -:1006600081F606C08EB3882349F08EB3853041F001 -:100670008091E80082FFF6CF80E0089582E008953F -:1006800083E008959C0140912D0250912E0246175F -:10069000570710F490E03BC06115710511F0AB01F4 -:1006A000F9CF8091E8008E778093E80040E050E039 -:1006B000F1CF8091E80083FF02C081E0089580912E -:1006C000E80082FD30C08EB3882399F18EB3853067 -:1006D00091F18091E80080FF1AC08091F20009C07A -:1006E000F9012F5F3F4FE491E093F10041505040FA -:1006F0008F5F4115510511F0883090F390E08830FC -:1007000009F491E08091E8008E778093E80041152C -:10071000510579F6992369F606C08EB3882349F00E -:100720008EB3853041F08091E80082FFF6CF80E003 -:10073000089582E0089583E008959C016115710594 -:1007400029F48091E8008B778093E800F90120C0BC -:100750008091E80083FF02C081E008958EB3882372 -:1007600039F18EB3853031F18091E80082FFF0CF0E -:1007700006C08091F10081936150704021F080911A -:10078000F2008823B1F78091E8008B778093E8002E -:1007900061157105E9F606C08EB3882349F08EB362 -:1007A000853041F08091E80080FFF6CF80E0089529 -:1007B00082E0089583E0089542D044D01EBA10929A -:1007C0002502109224021092230284E089BD89B58B -:1007D000826089BD09B400FEFDCF8091D800982FBA -:1007E0009F779093D80080688093D80080916300B1 -:1007F0008E7F809363008091D8008F7D8093D80096 -:100800008091E0008E7F8093E0008091E1008E7FF8 -:100810008093E1008091E20081608093E20080910A -:10082000E100877F8093E1008091E20088608093FF -:10083000E2000895C1DF81E08093260208951092BE -:10084000E20008951092E10008951F920F920FB6F2 -:100850000F9211241F932F933F934F935F936F93A6 -:100860007F938F939F93AF93BF93EF93FF93E9EEA3 -:10087000F0E0108117701082E0EFF0E08081877F58 -:1008800080837894C3D0F894A9EEB0E01C92E0EF96 -:10089000F0E08081886080831C93FF91EF91BF918D -:1008A000AF919F918F917F916F915F914F913F9108 -:1008B0002F911F910F900FBE0F901F9018951F92B0 -:1008C0000F920FB60F9211242F933F934F935F9384 -:1008D0006F937F938F939F93AF93BF93EF93FF9308 -:1008E0008091E10080FF1BC08091E20080FF17C073 -:1008F0008091E1008E7F8093E1008091E2008E7F05 -:100900008093E2008091E20080618093E200809118 -:10091000D80080628093D80019BC1EBAD1D18091D2 -:10092000E10084FF29C08091E20084FF25C084E0BB -:1009300089BD89B5826089BD09B400FEFDCF809173 -:10094000D8008F7D8093D8008091E1008F7E8093C6 -:10095000E1008091E2008F7E8093E2008091E200CE -:1009600081608093E20080912502882311F481E068 -:1009700001C084E08EBBA4D18091E10083FF27C039 -:100980008091E20083FF23C08091E100877F809304 -:10099000E10082E08EBB109225028091E1008E7F03 -:1009A0008093E1008091E2008E7F8093E20080914D -:1009B000E20080618093E200AADD80E060E042E036 -:1009C00093DD8091F00088608093F00079D1809170 -:1009D000E10082FF0AC08091E20082FF06C08091A0 -:1009E000E1008B7F8093E1006BD1FF91EF91BF918C -:1009F000AF919F918F917F916F915F914F913F91B7 -:100A00002F910F900FBE0F901F9018951F93DF939B -:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D -:100A2000CDBFE7E2F2E08091F100819322E0EF3266 -:100A3000F207C9F78091270230912802353009F476 -:100A400087C0363040F43130C9F1313070F0333086 -:100A500009F01DC133C0383009F4EFC0393009F452 -:100A6000FEC0363009F013C192C0803821F08238C0 -:100A700009F00DC108C090912302809124028823BF -:100A800099F0926011C080912B0287708093E900E9 -:100A90008091EB0090E025E0969587952A95E1F707 -:100AA000982F91701092E9008091E800877F8093E1 -:100AB000E8009093F1001092F100CAC0882319F069 -:100AC000823009F0E4C090E08F719070009721F0BF -:100AD000029709F0DDC00CC080912902813009F035 -:100AE000D7C010922402333069F5809324022AC0C3 -:100AF00080912902882331F520912B02277009F477 -:100B0000C7C02093E9008091EB0080FFC1C0333063 -:100B100021F48091EB00806213C08091EB00806132 -:100B20008093EB0081E090E002C0880F991F2A9526 -:100B3000E2F78093EA001092EA008091EB0088606F -:100B40008093EB001092E9008091E800877F83C0DA -:100B5000882309F09CC0109129028091E800877FCA -:100B60008093E800E8DC04C08EB3882309F490C0C9 -:100B70008091E80080FFF8CF812F8F7711F492E009 -:100B800001C093E09EBB80688093E30081C08058E1 -:100B9000823008F07CC08091290290912A0223E0E3 -:100BA0008C3D920799F55FB7F894DE0115964EE0FB -:100BB00020E030E061E2E42FF0E0609357008491A0 -:100BC00020FF03C082958F704F5F982F9F70892FF1 -:100BD000805D8A3308F0895F8C9311961C9211977F -:100BE0002F5F3F4F12962431310529F75FBF8AE20C -:100BF0008B8383E08C838091E800877F8093E8007B -:100C0000CE0103966AE270E0E4DC11C060912B0231 -:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 -:100C2000E800877F8093E80089819A812BDD80919D -:100C3000E8008B778093E8002BC0803841F58091E5 -:100C4000E800877F8093E800809125028093F1007F -:100C50008091E8008E778093E8006DDC19C08823CE -:100C6000B1F490912902923098F48091E800877F46 -:100C70008093E800909325025EDC80912502882312 -:100C800011F483E001C084E08EBB2DDB01C028DBC2 -:100C90008091E80083FF0AC08091EB00806280931E -:100CA000EB008091E800877F8093E800AC960FB658 -:100CB000F894DEBF0FBECDBFCF91DF911F91089595 -:100CC00008951F938EB3882361F01091E90010926C -:100CD000E9008091E80083FF01C098DE177010934F -:100CE000E9001F9108950895FC018EB3843021F529 -:100CF00087859089A189B2890097A105B105E1F0A6 -:100D000085818093E9008091E80082FF15C0809181 -:100D1000F200882319F42FEF3FEF04C08091F10017 -:100D2000282F30E08091F200882341F48091E80080 -:100D30008B778093E80002C02FEF3FEFC901089541 -:100D4000FC018EB3843011F587859089A189B28921 -:100D50000097A105B105D1F081818093E9008091D0 -:100D6000F2008823A9F09091E8008091E8008E7746 -:100D70008093E80095FD0CC0FDDB982F882349F493 -:100D80008091E8008E778093E80003C092E001C074 -:100D900090E0892F0895FC018EB3843051F487854B -:100DA0009089A189B2890097A105B10511F0CF0101 -:100DB000C7CF08951F93FC01162F8EB38430D9F44A -:100DC00087859089A189B2890097A105B10599F01D -:100DD00081818093E9008091E80085FD08C08091C1 -:100DE000E8008E778093E800C5DB882329F4109310 -:100DF000F10080E001C082E01F9108950F931F93DE -:100E0000CF93DF93EC010D96FC0189E0DF011D9289 -:100E10008A95E9F72A813B8109818C81882311F425 -:100E200010E001C014E0C90151DB182B1260802FC3 -:100E300061E8412F59DB882329F12E813F810D8103 -:100E40008885882311F410E001C014E0C9013EDB5D -:100E5000182B1260802F60E8412F46DB882391F029 -:100E60002A853B8509858C85882311F410E001C013 -:100E700014E0C9012BDB182B1260802F61EC412F8D -:100E800033DB01C080E0DF91CF911F910F91089576 -:100E9000CF93DF93EC018091E80083FF60C08881ED -:100EA00090E020912B0230912C022817390709F08D -:100EB00056C080912802813261F0823220F4803263 -:100EC00009F04DC019C0823269F1833209F047C080 -:100ED00038C080912702813A09F041C08091E80032 -:100EE000877F8093E800CE010F9667E070E071DBAA -:100EF0008091E8008B7713C080912702813279F5C9 -:100F00008091E800877F8093E800CE010F9667E02C -:100F100070E013DCCE013ED98091E8008E7780939B -:100F2000E8001DC0809127028132C9F48091E80059 -:100F3000877F8093E800809129028D87CE01C8D9F0 -:100F40000DC080912702813251F48091E800877FA3 -:100F50008093E800CE0160912902C5DEECDADF91D2 -:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 -:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 -:100F800020F0A21BB30BE40BF50B661F771F881F25 -:100F9000991F1A9469F760957095809590959B01BB -:0C0FA000AC01BD01CF010895F894FFCF13 -:100FAC0000034000000440000002080000000000A4 -:060FBC000000000000002F -:00000001FF +:1000000090C00000A9C00000A7C00000A5C000006B +:10001000A3C00000A1C000009FC000009DC0000060 +:100020009BC0000099C0000097C0000048C40000B9 +:100030000CC4000091C000008FC000008DC0000003 +:100040008BC0000089C0000087C0000085C0000090 +:1000500083C0000081C000007FC0000002C100001A +:100060007BC0000079C0000077C0000075C00000B0 +:1000700073C0000071C000006FC000006DC00000C0 +:100080006BC0000069C0000067C0000065C00000D0 +:1000900063C0000061C000001201100102000008EE +:1000A0004123430001000102DC0109023E0002017C +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:10012000000011241FBECFEFD2E0DEBFCDBF11E033 +:10013000A0E0B1E0ECEAFFE002C005900D92A6312C +:10014000B107D9F712E0A6E1B1E001C01D92AF32CC +:10015000B107E1F7F1D028C753CF9C01DC01AE57BE +:10016000BF4FED91FC91119741911196FC93EE9345 +:1001700080589F4FE817F90711F42D933C939FB7D0 +:10018000F894F901EC57FF4F8081815080839FBF25 +:10019000842F0895DF92EF92FF920F931F93FC013B +:1001A0008489813019F0823021F405C040E3D42ED7 +:1001B00004C0DD2402C030E2D32E8389823011F4E2 +:1001C00088E0D82A8589873031F0883031F0863050 +:1001D00031F482E003C084E001C086E0D82A1092A6 +:1001E000C9001092C8001092CA00E784F088018903 +:1001F000128980E0E81681EEF80680E0080780E0CA +:10020000180719F420E130E00FC0C801B701969536 +:1002100087957795679560587B47814E9F4FA801DA +:100220009701A0D6215030403093CD002093CC00D0 +:10023000D092CA0080E0E81681EEF80680E0080758 +:1002400080E0180711F082E001C080E08093C800D0 +:1002500088E98093C9001F910F91FF90EF90DF9084 +:1002600008951F920F920FB60F9211242F938F9320 +:100270009F93EF93FF939091CE008EB38430F1F46F +:10028000E0919901F0919A019083E0919901F091A8 +:100290009A01CF01019690939A018093990189590F +:1002A000914021F489E191E0928381839FB7F89492 +:1002B00080919D018F5F80939D019FBFFF91EF9182 +:1002C0009F918F912F910F900FBE0F901F901895B7 +:1002D000FC01858580FF02C05F9808955F9A0895AC +:1002E00080E091E0D5C580E091E088C584B7877F44 +:1002F00084BF28E10FB6F89420936000109260004C +:100300000FBE87E690E09093CD008093CC0086E00E +:100310008093CA001092C8002093C900539A5A9A39 +:100320008AB180638AB98BB180638BB983D284E050 +:1003300085BD5F9A579A08950F931F93CF93DF93CC +:10034000D5DF2FB7F8948EE991E090931F02809348 +:100350001E0290932102809320022FBF2FB7F894A2 +:1003600089E191E090939A018093990190939C0187 +:1003700080939B012FBF7894CEE9D1E003E08FB743 +:10038000F894909122028FBF903809F180E091E0BB +:10039000ABD497FD1CC0E0911E02F0911F02808338 +:1003A000E0911E02F0911F02CF01019690931F026F +:1003B00080931E028E51924011F4D283C1839FB765 +:1003C000F894809122028F5F809322029FBF8FB7A3 +:1003D000F89410919D018FBFA89902C0113678F151 +:1003E000A89A80919D01882361F05D980093160181 +:1003F00008C089E191E0B1DE682F80E091E0DAD4B5 +:1004000011501123B1F780911601882351F080918A +:10041000160181508093160180911601882309F4FA +:100420005D9A80911701882351F0809117018150C6 +:100430008093170180911701882309F45C9A8FB784 +:10044000F894909122028FBF992369F08EE991E090 +:1004500084DE982F8091C80085FFFCCF9093CE005A +:100460005C980093170180E091E095D42AD487CF5F +:10047000DA01923049F0933061F09130F9F4E8E913 +:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 +:1004900019C0813049F0813018F0823079F408C0F9 +:1004A000E8EEF0E0849107C0ECEEF0E0849103C048 +:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 +:1004C00020E030E0ED93FC93C901089528E030E08E +:1004D00040E003C04F5F220F331F28173907D0F3C6 +:1004E000842F8295807F08958093E9008091EB00AE +:1004F00081608093EB001092ED006093EC004093DC +:10050000ED008091EE00881F8827881F08951092C3 +:10051000F40090E09093E9001092F0001092E8004F +:100520001092ED008091EB008E7F8093EB009F5F37 +:10053000953081F708958091270288238CF403C0B9 +:100540008EB38823B1F08091E80082FFF9CF8091CB +:10055000E8008B778093E80008958EB3882349F0F4 +:100560008091E80080FFF9CF8091E8008E7780933A +:10057000E800089594E68091EC0080FF05C080912A +:10058000E80080FF05C023C08091E80082FD1FC005 +:100590008EB3882311F482E008958EB3853011F470 +:1005A00083E008958091EB0085FF02C081E008950B +:1005B0008091E10082FFDFCF8091E1008B7F80930B +:1005C000E100992311F484E008959150D4CF80E0A4 +:1005D00008959C0140912D0250912E024617570715 +:1005E00018F4F90120E038C06115710511F0AB0174 +:1005F000F8CF8091E8008E778093E80040E050E0EB +:10060000F0CF8091E80083FF02C081E008958091DF +:10061000E80082FD2DC08EB3882381F18EB3853032 +:1006200079F18091E80080FF17C09091F20006C038 +:1006300081918093F100415050409F5F41155105D9 +:1006400011F09830A8F320E0983009F421E080916F +:10065000E8008E778093E8004115510591F622233A +:1006600081F606C08EB3882349F08EB3853041F001 +:100670008091E80082FFF6CF80E0089582E008953F +:1006800083E008959C0140912D0250912E0246175F +:10069000570710F490E03BC06115710511F0AB01F4 +:1006A000F9CF8091E8008E778093E80040E050E039 +:1006B000F1CF8091E80083FF02C081E0089580912E +:1006C000E80082FD30C08EB3882399F18EB3853067 +:1006D00091F18091E80080FF1AC08091F20009C07A +:1006E000F9012F5F3F4FE491E093F10041505040FA +:1006F0008F5F4115510511F0883090F390E08830FC +:1007000009F491E08091E8008E778093E80041152C +:10071000510579F6992369F606C08EB3882349F00E +:100720008EB3853041F08091E80082FFF6CF80E003 +:10073000089582E0089583E008959C016115710594 +:1007400029F48091E8008B778093E800F90120C0BC +:100750008091E80083FF02C081E008958EB3882372 +:1007600039F18EB3853031F18091E80082FFF0CF0E +:1007700006C08091F10081936150704021F080911A +:10078000F2008823B1F78091E8008B778093E8002E +:1007900061157105E9F606C08EB3882349F08EB362 +:1007A000853041F08091E80080FFF6CF80E0089529 +:1007B00082E0089583E0089542D044D01EBA10929A +:1007C0002502109224021092230284E089BD89B58B +:1007D000826089BD09B400FEFDCF8091D800982FBA +:1007E0009F779093D80080688093D80080916300B1 +:1007F0008E7F809363008091D8008F7D8093D80096 +:100800008091E0008E7F8093E0008091E1008E7FF8 +:100810008093E1008091E20081608093E20080910A +:10082000E100877F8093E1008091E20088608093FF +:10083000E2000895C1DF81E08093260208951092BE +:10084000E20008951092E10008951F920F920FB6F2 +:100850000F9211241F932F933F934F935F936F93A6 +:100860007F938F939F93AF93BF93EF93FF93E9EEA3 +:10087000F0E0108117701082E0EFF0E08081877F58 +:1008800080837894C3D0F894A9EEB0E01C92E0EF96 +:10089000F0E08081886080831C93FF91EF91BF918D +:1008A000AF919F918F917F916F915F914F913F9108 +:1008B0002F911F910F900FBE0F901F9018951F92B0 +:1008C0000F920FB60F9211242F933F934F935F9384 +:1008D0006F937F938F939F93AF93BF93EF93FF9308 +:1008E0008091E10080FF1BC08091E20080FF17C073 +:1008F0008091E1008E7F8093E1008091E2008E7F05 +:100900008093E2008091E20080618093E200809118 +:10091000D80080628093D80019BC1EBAD1D18091D2 +:10092000E10084FF29C08091E20084FF25C084E0BB +:1009300089BD89B5826089BD09B400FEFDCF809173 +:10094000D8008F7D8093D8008091E1008F7E8093C6 +:10095000E1008091E2008F7E8093E2008091E200CE +:1009600081608093E20080912502882311F481E068 +:1009700001C084E08EBBA4D18091E10083FF27C039 +:100980008091E20083FF23C08091E100877F809304 +:10099000E10082E08EBB109225028091E1008E7F03 +:1009A0008093E1008091E2008E7F8093E20080914D +:1009B000E20080618093E200AADD80E060E042E036 +:1009C00093DD8091F00088608093F00079D1809170 +:1009D000E10082FF0AC08091E20082FF06C08091A0 +:1009E000E1008B7F8093E1006BD1FF91EF91BF918C +:1009F000AF919F918F917F916F915F914F913F91B7 +:100A00002F910F900FBE0F901F9018951F93DF939B +:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D +:100A2000CDBFE7E2F2E08091F100819322E0EF3266 +:100A3000F207C9F78091270230912802353009F476 +:100A400087C0363040F43130C9F1313070F0333086 +:100A500009F01DC133C0383009F4EFC0393009F452 +:100A6000FEC0363009F013C192C0803821F08238C0 +:100A700009F00DC108C090912302809124028823BF +:100A800099F0926011C080912B0287708093E900E9 +:100A90008091EB0090E025E0969587952A95E1F707 +:100AA000982F91701092E9008091E800877F8093E1 +:100AB000E8009093F1001092F100CAC0882319F069 +:100AC000823009F0E4C090E08F719070009721F0BF +:100AD000029709F0DDC00CC080912902813009F035 +:100AE000D7C010922402333069F5809324022AC0C3 +:100AF00080912902882331F520912B02277009F477 +:100B0000C7C02093E9008091EB0080FFC1C0333063 +:100B100021F48091EB00806213C08091EB00806132 +:100B20008093EB0081E090E002C0880F991F2A9526 +:100B3000E2F78093EA001092EA008091EB0088606F +:100B40008093EB001092E9008091E800877F83C0DA +:100B5000882309F09CC0109129028091E800877FCA +:100B60008093E800E8DC04C08EB3882309F490C0C9 +:100B70008091E80080FFF8CF812F8F7711F492E009 +:100B800001C093E09EBB80688093E30081C08058E1 +:100B9000823008F07CC08091290290912A0223E0E3 +:100BA0008C3D920799F55FB7F894DE0115964EE0FB +:100BB00020E030E061E2E42FF0E0609357008491A0 +:100BC00020FF03C082958F704F5F982F9F70892FF1 +:100BD000805D8A3308F0895F8C9311961C9211977F +:100BE0002F5F3F4F12962431310529F75FBF8AE20C +:100BF0008B8383E08C838091E800877F8093E8007B +:100C0000CE0103966AE270E0E4DC11C060912B0231 +:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 +:100C2000E800877F8093E80089819A812BDD80919D +:100C3000E8008B778093E8002BC0803841F58091E5 +:100C4000E800877F8093E800809125028093F1007F +:100C50008091E8008E778093E8006DDC19C08823CE +:100C6000B1F490912902923098F48091E800877F46 +:100C70008093E800909325025EDC80912502882312 +:100C800011F483E001C084E08EBB2DDB01C028DBC2 +:100C90008091E80083FF0AC08091EB00806280931E +:100CA000EB008091E800877F8093E800AC960FB658 +:100CB000F894DEBF0FBECDBFCF91DF911F91089595 +:100CC00008951F938EB3882361F01091E90010926C +:100CD000E9008091E80083FF01C098DE177010934F +:100CE000E9001F9108950895FC018EB3843021F529 +:100CF00087859089A189B2890097A105B105E1F0A6 +:100D000085818093E9008091E80082FF15C0809181 +:100D1000F200882319F42FEF3FEF04C08091F10017 +:100D2000282F30E08091F200882341F48091E80080 +:100D30008B778093E80002C02FEF3FEFC901089541 +:100D4000FC018EB3843011F587859089A189B28921 +:100D50000097A105B105D1F081818093E9008091D0 +:100D6000F2008823A9F09091E8008091E8008E7746 +:100D70008093E80095FD0CC0FDDB982F882349F493 +:100D80008091E8008E778093E80003C092E001C074 +:100D900090E0892F0895FC018EB3843051F487854B +:100DA0009089A189B2890097A105B10511F0CF0101 +:100DB000C7CF08951F93FC01162F8EB38430D9F44A +:100DC00087859089A189B2890097A105B10599F01D +:100DD00081818093E9008091E80085FD08C08091C1 +:100DE000E8008E778093E800C5DB882329F4109310 +:100DF000F10080E001C082E01F9108950F931F93DE +:100E0000CF93DF93EC010D96FC0189E0DF011D9289 +:100E10008A95E9F72A813B8109818C81882311F425 +:100E200010E001C014E0C90151DB182B1260802FC3 +:100E300061E8412F59DB882329F12E813F810D8103 +:100E40008885882311F410E001C014E0C9013EDB5D +:100E5000182B1260802F60E8412F46DB882391F029 +:100E60002A853B8509858C85882311F410E001C013 +:100E700014E0C9012BDB182B1260802F61EC412F8D +:100E800033DB01C080E0DF91CF911F910F91089576 +:100E9000CF93DF93EC018091E80083FF60C08881ED +:100EA00090E020912B0230912C022817390709F08D +:100EB00056C080912802813261F0823220F4803263 +:100EC00009F04DC019C0823269F1833209F047C080 +:100ED00038C080912702813A09F041C08091E80032 +:100EE000877F8093E800CE010F9667E070E071DBAA +:100EF0008091E8008B7713C080912702813279F5C9 +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E013DCCE013ED98091E8008E7780939B +:100F2000E8001DC0809127028132C9F48091E80059 +:100F3000877F8093E800809129028D87CE01C8D9F0 +:100F40000DC080912702813251F48091E800877FA3 +:100F50008093E800CE0160912902C5DEECDADF91D2 +:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 +:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 +:100F800020F0A21BB30BE40BF50B661F771F881F25 +:100F9000991F1A9469F760957095809590959B01BB +:0C0FA000AC01BD01CF010895F894FFCF13 +:100FAC0000034000000440000002080000000000A4 +:060FBC000000000000002F +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-mega.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-mega.hex index fbbeb07146e..1aaa2f46623 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-mega.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-mega.hex @@ -1,256 +1,256 @@ -:10000000A2C00000BBC00000B9C00000B7C0000023 -:10001000B5C00000B3C00000B1C00000AFC0000018 -:10002000ADC00000ABC00000A9C000005AC4000071 -:100030001EC40000A3C00000A1C000009FC00000BB -:100040009DC000009BC0000099C0000097C0000048 -:1000500095C0000093C0000091C0000014C10000D2 -:100060008DC000008BC0000089C0000087C0000068 -:1000700085C0000083C0000081C000007FC0000078 -:100080007DC000007BC0000079C0000077C0000088 -:1000900075C0000073C000001201100102000008CA -:1000A0004123100001000102DC0109023E000201AF -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:100120002403410072006400750069006E006F00D6 -:1001300020004D006500670061002000320035009E -:1001400036003000000011241FBECFEFD2E0DEBF2A -:10015000CDBF11E0A0E0B1E0E0EDFFE002C005900E -:100160000D92A631B107D9F712E0A6E1B1E001C0C6 -:100170001D92AF32B107E1F7F1D028C741CF9C0102 -:10018000DC01AE57BF4FED91FC9111974191119653 -:10019000FC93EE9380589F4FE817F90711F42D93C5 -:1001A0003C939FB7F894F901EC57FF4F8081815041 -:1001B00080839FBF842F0895DF92EF92FF920F9369 -:1001C0001F93FC018489813019F0823021F405C02D -:1001D00040E3D42E04C0DD2402C030E2D32E838954 -:1001E000823011F488E0D82A8589873031F0883050 -:1001F00031F0863031F482E003C084E001C086E053 -:10020000D82A1092C9001092C8001092CA00E78440 -:10021000F0880189128980E0E81681EEF80680E016 -:10022000080780E0180719F420E130E00FC0C8018A -:10023000B701969587957795679560587B47814E6E -:100240009F4FA8019701A0D6215030403093CD0098 -:100250002093CC00D092CA0080E0E81681EEF80628 -:1002600080E0080780E0180711F082E001C080E01C -:100270008093C80088E98093C9001F910F91FF9077 -:10028000EF90DF9008951F920F920FB60F921124F6 -:100290002F938F939F93EF93FF939091CE008EB304 -:1002A0008430F1F4E0919901F0919A019083E0910A -:1002B0009901F0919A01CF01019690939A01809350 -:1002C00099018959914021F489E191E092838183D8 -:1002D0009FB7F89480919D018F5F80939D019FBF90 -:1002E000FF91EF919F918F912F910F900FBE0F90E3 -:1002F0001F901895FC01858580FF02C05F980895C6 -:100300005F9A089580E091E0D5C580E091E088C5CE -:1003100084B7877F84BF28E10FB6F89420936000EC -:10032000109260000FBE87E690E09093CD0080931E -:10033000CC0086E08093CA001092C8002093C900C8 -:10034000539A5A9A8AB180638AB98BB180638BB908 -:1003500083D284E085BD5F9A579A08950F931F93C7 -:10036000CF93DF93D5DF2FB7F8948EE991E0909388 -:100370001F0280931E0290932102809320022FBFC0 -:100380002FB7F89489E191E090939A0180939901B5 -:1003900090939C0180939B012FBF7894CEE9D1E08C -:1003A00003E08FB7F894909122028FBF903809F143 -:1003B00080E091E0ABD497FD1CC0E0911E02F0916B -:1003C0001F028083E0911E02F0911F02CF0101966F -:1003D00090931F0280931E028E51924011F4D2839B -:1003E000C1839FB7F894809122028F5F809322028D -:1003F0009FBF8FB7F89410919D018FBFA89902C03D -:10040000113678F1A89A80919D01882361F05D985A -:100410000093160108C089E191E0B1DE682F80E009 -:1004200091E0DAD411501123B1F78091160188239D -:1004300051F0809116018150809316018091160130 -:10044000882309F45D9A80911701882351F08091E7 -:10045000170181508093170180911701882309F4B7 -:100460005C9A8FB7F894909122028FBF992369F01C -:100470008EE991E084DE982F8091C80085FFFCCF43 -:100480009093CE005C980093170180E091E095D4A2 -:100490002AD487CFDA01923049F0933061F091305D -:1004A000F9F4E8E9F0E022E130E01EC0EAEAF0E029 -:1004B0002EE330E019C0813049F0813018F08230ED -:1004C00079F408C0E8EEF0E0849107C0ECEEF0E0CB -:1004D000849103C0E0E2F1E08491282F30E004C071 -:1004E000E0E0F0E020E030E0ED93FC93C9010895F6 -:1004F00028E030E040E003C04F5F220F331F281791 -:100500003907D0F3842F8295807F08958093E90086 -:100510008091EB0081608093EB001092ED0060937E -:10052000EC004093ED008091EE00881F8827881F23 -:1005300008951092F40090E09093E9001092F0007A -:100540001092E8001092ED008091EB008E7F809376 -:10055000EB009F5F953081F70895809127028823F3 -:100560008CF403C08EB38823B1F08091E80082FF41 -:10057000F9CF8091E8008B778093E80008958EB3DF -:10058000882349F08091E80080FFF9CF8091E8004E -:100590008E778093E800089594E68091EC0080FFC8 -:1005A00005C08091E80080FF05C023C08091E8006D -:1005B00082FD1FC08EB3882311F482E008958EB3AC -:1005C000853011F483E008958091EB0085FF02C02F -:1005D00081E008958091E10082FFDFCF8091E1000A -:1005E0008B7F8093E100992311F484E0089591506A -:1005F000D4CF80E008959C0140912D0250912E02AD -:100600004617570718F4F90120E038C06115710545 -:1006100011F0AB01F8CF8091E8008E778093E8006D -:1006200040E050E0F0CF8091E80083FF02C081E01D -:1006300008958091E80082FD2DC08EB3882381F15A -:100640008EB3853079F18091E80080FF17C09091DA -:10065000F20006C081918093F100415050409F5FAD -:100660004115510511F09830A8F320E0983009F4B5 -:1006700021E08091E8008E778093E80041155105D4 -:1006800091F6222381F606C08EB3882349F08EB3FB -:10069000853041F08091E80082FFF6CF80E0089538 -:1006A00082E0089583E008959C0140912D025091CD -:1006B0002E024617570710F490E03BC061157105F4 -:1006C00011F0AB01F9CF8091E8008E778093E800BC -:1006D00040E050E0F1CF8091E80083FF02C081E06C -:1006E00008958091E80082FD30C08EB3882399F18F -:1006F0008EB3853091F18091E80080FF1AC080911F -:10070000F20009C0F9012F5F3F4FE491E093F1003F -:10071000415050408F5F4115510511F0883090F3E2 -:1007200090E0883009F491E08091E8008E77809322 -:10073000E8004115510579F6992369F606C08EB394 -:10074000882349F08EB3853041F08091E80082FF24 -:10075000F6CF80E0089582E0089583E008959C013B -:100760006115710529F48091E8008B778093E8008A -:10077000F90120C08091E80083FF02C081E0089564 -:100780008EB3882339F18EB3853031F18091E80042 -:1007900082FFF0CF06C08091F100819361507040DC -:1007A00021F08091F2008823B1F78091E8008B77E7 -:1007B0008093E80061157105E9F606C08EB38823C1 -:1007C00049F08EB3853041F08091E80080FFF6CF8C -:1007D00080E0089582E0089583E0089542D044D0F7 -:1007E0001EBA10922502109224021092230284E075 -:1007F00089BD89B5826089BD09B400FEFDCF8091B5 -:10080000D800982F9F779093D80080688093D80065 -:10081000809163008E7F809363008091D8008F7DEC -:100820008093D8008091E0008E7F8093E0008091DB -:10083000E1008E7F8093E1008091E20081608093EF -:10084000E2008091E100877F8093E1008091E200E7 -:1008500088608093E2000895C1DF81E080932602E2 -:1008600008951092E20008951092E10008951F92F9 -:100870000F920FB60F9211241F932F933F934F9314 -:100880005F936F937F938F939F93AF93BF93EF93F8 -:10089000FF93E9EEF0E0108117701082E0EFF0E0D6 -:1008A0008081877F80837894C3D0F894A9EEB0E0EC -:1008B0001C92E0EFF0E08081886080831C93FF91C0 -:1008C000EF91BF91AF919F918F917F916F915F91C8 -:1008D0004F913F912F911F910F900FBE0F901F903E -:1008E00018951F920F920FB60F9211242F933F93DA -:1008F0004F935F936F937F938F939F93AF93BF9328 -:10090000EF93FF938091E10080FF1BC08091E20094 -:1009100080FF17C08091E1008E7F8093E10080917D -:10092000E2008E7F8093E2008091E20080618093FC -:10093000E2008091D80080628093D80019BC1EBA72 -:10094000D1D18091E10084FF29C08091E20084FF31 -:1009500025C084E089BD89B5826089BD09B400FEE7 -:10096000FDCF8091D8008F7D8093D8008091E100E9 -:100970008F7E8093E1008091E2008F7E8093E20081 -:100980008091E20081608093E200809125028823BB -:1009900011F481E001C084E08EBBA4D18091E1001C -:1009A00083FF27C08091E20083FF23C08091E10094 -:1009B000877F8093E10082E08EBB109225028091B8 -:1009C000E1008E7F8093E1008091E2008E7F809332 -:1009D000E2008091E20080618093E200AADD80E085 -:1009E00060E042E093DD8091F00088608093F00049 -:1009F00079D18091E10082FF0AC08091E20082FFFC -:100A000006C08091E1008B7F8093E1006BD1FF9164 -:100A1000EF91BF91AF919F918F917F916F915F9176 -:100A20004F913F912F910F900FBE0F901F901895EF -:100A30001F93DF93CF93CDB7DEB7AC970FB6F89483 -:100A4000DEBF0FBECDBFE7E2F2E08091F1008193FF -:100A500022E0EF32F207C9F7809127023091280295 -:100A6000353009F487C0363040F43130C9F13130C7 -:100A700070F0333009F01DC133C0383009F4EFC0D5 -:100A8000393009F4FEC0363009F013C192C0803805 -:100A900021F0823809F00DC108C0909123028091A5 -:100AA0002402882399F0926011C080912B028770F4 -:100AB0008093E9008091EB0090E025E09695879582 -:100AC0002A95E1F7982F91701092E9008091E80043 -:100AD000877F8093E8009093F1001092F100CAC0E4 -:100AE000882319F0823009F0E4C090E08F71907093 -:100AF000009721F0029709F0DDC00CC08091290217 -:100B0000813009F0D7C010922402333069F5809308 -:100B100024022AC080912902882331F520912B02DA -:100B2000277009F4C7C02093E9008091EB0080FF93 -:100B3000C1C0333021F48091EB00806213C08091FA -:100B4000EB0080618093EB0081E090E002C0880FB1 -:100B5000991F2A95E2F78093EA001092EA008091AB -:100B6000EB0088608093EB001092E9008091E80030 -:100B7000877F83C0882309F09CC01091290280914F -:100B8000E800877F8093E800E8DC04C08EB3882308 -:100B900009F490C08091E80080FFF8CF812F8F7713 -:100BA00011F492E001C093E09EBB80688093E30063 -:100BB00081C08058823008F07CC0809129029091D9 -:100BC0002A0223E08C3D920799F55FB7F894DE0185 -:100BD00015964EE020E030E061E2E42FF0E0609313 -:100BE0005700849120FF03C082958F704F5F982F2C -:100BF0009F70892F805D8A3308F0895F8C931196EE -:100C00001C9211972F5F3F4F12962431310529F71F -:100C10005FBF8AE28B8383E08C838091E800877FCB -:100C20008093E800CE0103966AE270E0E4DC11C034 -:100C300060912B02AE014F5F5F4F2CDCBC0100972F -:100C4000C9F18091E800877F8093E80089819A81CB -:100C50002BDD8091E8008B778093E8002BC08038F3 -:100C600041F58091E800877F8093E800809125021C -:100C70008093F1008091E8008E778093E8006DDC2E -:100C800019C08823B1F490912902923098F4809190 -:100C9000E800877F8093E800909325025EDC8091D6 -:100CA0002502882311F483E001C084E08EBB2DDB94 -:100CB00001C028DB8091E80083FF0AC08091EB002F -:100CC00080628093EB008091E800877F8093E8004A -:100CD000AC960FB6F894DEBF0FBECDBFCF91DF91BB -:100CE0001F91089508951F938EB3882361F010918A -:100CF000E9001092E9008091E80083FF01C098DECE -:100D000017701093E9001F9108950895FC018EB3A8 -:100D1000843021F587859089A189B2890097A10542 -:100D2000B105E1F085818093E9008091E80082FFC0 -:100D300015C08091F200882319F42FEF3FEF04C013 -:100D40008091F100282F30E08091F200882341F457 -:100D50008091E8008B778093E80002C02FEF3FEF8F -:100D6000C9010895FC018EB3843011F587859089FF -:100D7000A189B2890097A105B105D1F08181809345 -:100D8000E9008091F2008823A9F09091E800809119 -:100D9000E8008E778093E80095FD0CC0FDDB982F6E -:100DA000882349F48091E8008E778093E80003C09F -:100DB00092E001C090E0892F0895FC018EB3843049 -:100DC00051F487859089A189B2890097A105B10561 -:100DD00011F0CF01C7CF08951F93FC01162F8EB3DA -:100DE0008430D9F487859089A189B2890097A105BB -:100DF000B10599F081818093E9008091E80085FD3B -:100E000008C08091E8008E778093E800C5DB8823D6 -:100E100029F41093F10080E001C082E01F91089551 -:100E20000F931F93CF93DF93EC010D96FC0189E0A4 -:100E3000DF011D928A95E9F72A813B8109818C8126 -:100E4000882311F410E001C014E0C90151DB182B14 -:100E50001260802F61E8412F59DB882329F12E8110 -:100E60003F810D818885882311F410E001C014E0D2 -:100E7000C9013EDB182B1260802F60E8412F46DB52 -:100E8000882391F02A853B8509858C85882311F478 -:100E900010E001C014E0C9012BDB182B1260802F79 -:100EA00061EC412F33DB01C080E0DF91CF911F91D6 -:100EB0000F910895CF93DF93EC018091E80083FFB9 -:100EC00060C0888190E020912B0230912C0228177D -:100ED000390709F056C080912802813261F08232D0 -:100EE00020F4803209F04DC019C0823269F183329A -:100EF00009F047C038C080912702813A09F041C00B -:100F00008091E800877F8093E800CE010F9667E02C -:100F100070E071DB8091E8008B7713C0809127022D -:100F2000813279F58091E800877F8093E800CE01D7 -:100F30000F9667E070E013DCCE013ED98091E800A7 -:100F40008E778093E8001DC0809127028132C9F41A -:100F50008091E800877F8093E800809129028D8747 -:100F6000CE01C8D90DC080912702813251F4809101 -:100F7000E800877F8093E800CE0160912902C5DEFA -:100F8000ECDADF91CF910895A1E21A2EAA1BBB1BC8 -:100F9000FD010DC0AA1FBB1FEE1FFF1FA217B30745 -:100FA000E407F50720F0A21BB30BE40BF50B661F5B -:100FB000771F881F991F1A9469F76095709580951F -:100FC00090959B01AC01BD01CF010895F894FFCF2E -:100FD0000003400000044000000208000000000080 -:060FE0000000000000000B -:00000001FF +:10000000A2C00000BBC00000B9C00000B7C0000023 +:10001000B5C00000B3C00000B1C00000AFC0000018 +:10002000ADC00000ABC00000A9C000005AC4000071 +:100030001EC40000A3C00000A1C000009FC00000BB +:100040009DC000009BC0000099C0000097C0000048 +:1000500095C0000093C0000091C0000014C10000D2 +:100060008DC000008BC0000089C0000087C0000068 +:1000700085C0000083C0000081C000007FC0000078 +:100080007DC000007BC0000079C0000077C0000088 +:1000900075C0000073C000001201100102000008CA +:1000A0004123100001000102DC0109023E000201AF +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:100120002403410072006400750069006E006F00D6 +:1001300020004D006500670061002000320035009E +:1001400036003000000011241FBECFEFD2E0DEBF2A +:10015000CDBF11E0A0E0B1E0E0EDFFE002C005900E +:100160000D92A631B107D9F712E0A6E1B1E001C0C6 +:100170001D92AF32B107E1F7F1D028C741CF9C0102 +:10018000DC01AE57BF4FED91FC9111974191119653 +:10019000FC93EE9380589F4FE817F90711F42D93C5 +:1001A0003C939FB7F894F901EC57FF4F8081815041 +:1001B00080839FBF842F0895DF92EF92FF920F9369 +:1001C0001F93FC018489813019F0823021F405C02D +:1001D00040E3D42E04C0DD2402C030E2D32E838954 +:1001E000823011F488E0D82A8589873031F0883050 +:1001F00031F0863031F482E003C084E001C086E053 +:10020000D82A1092C9001092C8001092CA00E78440 +:10021000F0880189128980E0E81681EEF80680E016 +:10022000080780E0180719F420E130E00FC0C8018A +:10023000B701969587957795679560587B47814E6E +:100240009F4FA8019701A0D6215030403093CD0098 +:100250002093CC00D092CA0080E0E81681EEF80628 +:1002600080E0080780E0180711F082E001C080E01C +:100270008093C80088E98093C9001F910F91FF9077 +:10028000EF90DF9008951F920F920FB60F921124F6 +:100290002F938F939F93EF93FF939091CE008EB304 +:1002A0008430F1F4E0919901F0919A019083E0910A +:1002B0009901F0919A01CF01019690939A01809350 +:1002C00099018959914021F489E191E092838183D8 +:1002D0009FB7F89480919D018F5F80939D019FBF90 +:1002E000FF91EF919F918F912F910F900FBE0F90E3 +:1002F0001F901895FC01858580FF02C05F980895C6 +:100300005F9A089580E091E0D5C580E091E088C5CE +:1003100084B7877F84BF28E10FB6F89420936000EC +:10032000109260000FBE87E690E09093CD0080931E +:10033000CC0086E08093CA001092C8002093C900C8 +:10034000539A5A9A8AB180638AB98BB180638BB908 +:1003500083D284E085BD5F9A579A08950F931F93C7 +:10036000CF93DF93D5DF2FB7F8948EE991E0909388 +:100370001F0280931E0290932102809320022FBFC0 +:100380002FB7F89489E191E090939A0180939901B5 +:1003900090939C0180939B012FBF7894CEE9D1E08C +:1003A00003E08FB7F894909122028FBF903809F143 +:1003B00080E091E0ABD497FD1CC0E0911E02F0916B +:1003C0001F028083E0911E02F0911F02CF0101966F +:1003D00090931F0280931E028E51924011F4D2839B +:1003E000C1839FB7F894809122028F5F809322028D +:1003F0009FBF8FB7F89410919D018FBFA89902C03D +:10040000113678F1A89A80919D01882361F05D985A +:100410000093160108C089E191E0B1DE682F80E009 +:1004200091E0DAD411501123B1F78091160188239D +:1004300051F0809116018150809316018091160130 +:10044000882309F45D9A80911701882351F08091E7 +:10045000170181508093170180911701882309F4B7 +:100460005C9A8FB7F894909122028FBF992369F01C +:100470008EE991E084DE982F8091C80085FFFCCF43 +:100480009093CE005C980093170180E091E095D4A2 +:100490002AD487CFDA01923049F0933061F091305D +:1004A000F9F4E8E9F0E022E130E01EC0EAEAF0E029 +:1004B0002EE330E019C0813049F0813018F08230ED +:1004C00079F408C0E8EEF0E0849107C0ECEEF0E0CB +:1004D000849103C0E0E2F1E08491282F30E004C071 +:1004E000E0E0F0E020E030E0ED93FC93C9010895F6 +:1004F00028E030E040E003C04F5F220F331F281791 +:100500003907D0F3842F8295807F08958093E90086 +:100510008091EB0081608093EB001092ED0060937E +:10052000EC004093ED008091EE00881F8827881F23 +:1005300008951092F40090E09093E9001092F0007A +:100540001092E8001092ED008091EB008E7F809376 +:10055000EB009F5F953081F70895809127028823F3 +:100560008CF403C08EB38823B1F08091E80082FF41 +:10057000F9CF8091E8008B778093E80008958EB3DF +:10058000882349F08091E80080FFF9CF8091E8004E +:100590008E778093E800089594E68091EC0080FFC8 +:1005A00005C08091E80080FF05C023C08091E8006D +:1005B00082FD1FC08EB3882311F482E008958EB3AC +:1005C000853011F483E008958091EB0085FF02C02F +:1005D00081E008958091E10082FFDFCF8091E1000A +:1005E0008B7F8093E100992311F484E0089591506A +:1005F000D4CF80E008959C0140912D0250912E02AD +:100600004617570718F4F90120E038C06115710545 +:1006100011F0AB01F8CF8091E8008E778093E8006D +:1006200040E050E0F0CF8091E80083FF02C081E01D +:1006300008958091E80082FD2DC08EB3882381F15A +:100640008EB3853079F18091E80080FF17C09091DA +:10065000F20006C081918093F100415050409F5FAD +:100660004115510511F09830A8F320E0983009F4B5 +:1006700021E08091E8008E778093E80041155105D4 +:1006800091F6222381F606C08EB3882349F08EB3FB +:10069000853041F08091E80082FFF6CF80E0089538 +:1006A00082E0089583E008959C0140912D025091CD +:1006B0002E024617570710F490E03BC061157105F4 +:1006C00011F0AB01F9CF8091E8008E778093E800BC +:1006D00040E050E0F1CF8091E80083FF02C081E06C +:1006E00008958091E80082FD30C08EB3882399F18F +:1006F0008EB3853091F18091E80080FF1AC080911F +:10070000F20009C0F9012F5F3F4FE491E093F1003F +:10071000415050408F5F4115510511F0883090F3E2 +:1007200090E0883009F491E08091E8008E77809322 +:10073000E8004115510579F6992369F606C08EB394 +:10074000882349F08EB3853041F08091E80082FF24 +:10075000F6CF80E0089582E0089583E008959C013B +:100760006115710529F48091E8008B778093E8008A +:10077000F90120C08091E80083FF02C081E0089564 +:100780008EB3882339F18EB3853031F18091E80042 +:1007900082FFF0CF06C08091F100819361507040DC +:1007A00021F08091F2008823B1F78091E8008B77E7 +:1007B0008093E80061157105E9F606C08EB38823C1 +:1007C00049F08EB3853041F08091E80080FFF6CF8C +:1007D00080E0089582E0089583E0089542D044D0F7 +:1007E0001EBA10922502109224021092230284E075 +:1007F00089BD89B5826089BD09B400FEFDCF8091B5 +:10080000D800982F9F779093D80080688093D80065 +:10081000809163008E7F809363008091D8008F7DEC +:100820008093D8008091E0008E7F8093E0008091DB +:10083000E1008E7F8093E1008091E20081608093EF +:10084000E2008091E100877F8093E1008091E200E7 +:1008500088608093E2000895C1DF81E080932602E2 +:1008600008951092E20008951092E10008951F92F9 +:100870000F920FB60F9211241F932F933F934F9314 +:100880005F936F937F938F939F93AF93BF93EF93F8 +:10089000FF93E9EEF0E0108117701082E0EFF0E0D6 +:1008A0008081877F80837894C3D0F894A9EEB0E0EC +:1008B0001C92E0EFF0E08081886080831C93FF91C0 +:1008C000EF91BF91AF919F918F917F916F915F91C8 +:1008D0004F913F912F911F910F900FBE0F901F903E +:1008E00018951F920F920FB60F9211242F933F93DA +:1008F0004F935F936F937F938F939F93AF93BF9328 +:10090000EF93FF938091E10080FF1BC08091E20094 +:1009100080FF17C08091E1008E7F8093E10080917D +:10092000E2008E7F8093E2008091E20080618093FC +:10093000E2008091D80080628093D80019BC1EBA72 +:10094000D1D18091E10084FF29C08091E20084FF31 +:1009500025C084E089BD89B5826089BD09B400FEE7 +:10096000FDCF8091D8008F7D8093D8008091E100E9 +:100970008F7E8093E1008091E2008F7E8093E20081 +:100980008091E20081608093E200809125028823BB +:1009900011F481E001C084E08EBBA4D18091E1001C +:1009A00083FF27C08091E20083FF23C08091E10094 +:1009B000877F8093E10082E08EBB109225028091B8 +:1009C000E1008E7F8093E1008091E2008E7F809332 +:1009D000E2008091E20080618093E200AADD80E085 +:1009E00060E042E093DD8091F00088608093F00049 +:1009F00079D18091E10082FF0AC08091E20082FFFC +:100A000006C08091E1008B7F8093E1006BD1FF9164 +:100A1000EF91BF91AF919F918F917F916F915F9176 +:100A20004F913F912F910F900FBE0F901F901895EF +:100A30001F93DF93CF93CDB7DEB7AC970FB6F89483 +:100A4000DEBF0FBECDBFE7E2F2E08091F1008193FF +:100A500022E0EF32F207C9F7809127023091280295 +:100A6000353009F487C0363040F43130C9F13130C7 +:100A700070F0333009F01DC133C0383009F4EFC0D5 +:100A8000393009F4FEC0363009F013C192C0803805 +:100A900021F0823809F00DC108C0909123028091A5 +:100AA0002402882399F0926011C080912B028770F4 +:100AB0008093E9008091EB0090E025E09695879582 +:100AC0002A95E1F7982F91701092E9008091E80043 +:100AD000877F8093E8009093F1001092F100CAC0E4 +:100AE000882319F0823009F0E4C090E08F71907093 +:100AF000009721F0029709F0DDC00CC08091290217 +:100B0000813009F0D7C010922402333069F5809308 +:100B100024022AC080912902882331F520912B02DA +:100B2000277009F4C7C02093E9008091EB0080FF93 +:100B3000C1C0333021F48091EB00806213C08091FA +:100B4000EB0080618093EB0081E090E002C0880FB1 +:100B5000991F2A95E2F78093EA001092EA008091AB +:100B6000EB0088608093EB001092E9008091E80030 +:100B7000877F83C0882309F09CC01091290280914F +:100B8000E800877F8093E800E8DC04C08EB3882308 +:100B900009F490C08091E80080FFF8CF812F8F7713 +:100BA00011F492E001C093E09EBB80688093E30063 +:100BB00081C08058823008F07CC0809129029091D9 +:100BC0002A0223E08C3D920799F55FB7F894DE0185 +:100BD00015964EE020E030E061E2E42FF0E0609313 +:100BE0005700849120FF03C082958F704F5F982F2C +:100BF0009F70892F805D8A3308F0895F8C931196EE +:100C00001C9211972F5F3F4F12962431310529F71F +:100C10005FBF8AE28B8383E08C838091E800877FCB +:100C20008093E800CE0103966AE270E0E4DC11C034 +:100C300060912B02AE014F5F5F4F2CDCBC0100972F +:100C4000C9F18091E800877F8093E80089819A81CB +:100C50002BDD8091E8008B778093E8002BC08038F3 +:100C600041F58091E800877F8093E800809125021C +:100C70008093F1008091E8008E778093E8006DDC2E +:100C800019C08823B1F490912902923098F4809190 +:100C9000E800877F8093E800909325025EDC8091D6 +:100CA0002502882311F483E001C084E08EBB2DDB94 +:100CB00001C028DB8091E80083FF0AC08091EB002F +:100CC00080628093EB008091E800877F8093E8004A +:100CD000AC960FB6F894DEBF0FBECDBFCF91DF91BB +:100CE0001F91089508951F938EB3882361F010918A +:100CF000E9001092E9008091E80083FF01C098DECE +:100D000017701093E9001F9108950895FC018EB3A8 +:100D1000843021F587859089A189B2890097A10542 +:100D2000B105E1F085818093E9008091E80082FFC0 +:100D300015C08091F200882319F42FEF3FEF04C013 +:100D40008091F100282F30E08091F200882341F457 +:100D50008091E8008B778093E80002C02FEF3FEF8F +:100D6000C9010895FC018EB3843011F587859089FF +:100D7000A189B2890097A105B105D1F08181809345 +:100D8000E9008091F2008823A9F09091E800809119 +:100D9000E8008E778093E80095FD0CC0FDDB982F6E +:100DA000882349F48091E8008E778093E80003C09F +:100DB00092E001C090E0892F0895FC018EB3843049 +:100DC00051F487859089A189B2890097A105B10561 +:100DD00011F0CF01C7CF08951F93FC01162F8EB3DA +:100DE0008430D9F487859089A189B2890097A105BB +:100DF000B10599F081818093E9008091E80085FD3B +:100E000008C08091E8008E778093E800C5DB8823D6 +:100E100029F41093F10080E001C082E01F91089551 +:100E20000F931F93CF93DF93EC010D96FC0189E0A4 +:100E3000DF011D928A95E9F72A813B8109818C8126 +:100E4000882311F410E001C014E0C90151DB182B14 +:100E50001260802F61E8412F59DB882329F12E8110 +:100E60003F810D818885882311F410E001C014E0D2 +:100E7000C9013EDB182B1260802F60E8412F46DB52 +:100E8000882391F02A853B8509858C85882311F478 +:100E900010E001C014E0C9012BDB182B1260802F79 +:100EA00061EC412F33DB01C080E0DF91CF911F91D6 +:100EB0000F910895CF93DF93EC018091E80083FFB9 +:100EC00060C0888190E020912B0230912C0228177D +:100ED000390709F056C080912802813261F08232D0 +:100EE00020F4803209F04DC019C0823269F183329A +:100EF00009F047C038C080912702813A09F041C00B +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E071DB8091E8008B7713C0809127022D +:100F2000813279F58091E800877F8093E800CE01D7 +:100F30000F9667E070E013DCCE013ED98091E800A7 +:100F40008E778093E8001DC0809127028132C9F41A +:100F50008091E800877F8093E800809129028D8747 +:100F6000CE01C8D90DC080912702813251F4809101 +:100F7000E800877F8093E800CE0160912902C5DEFA +:100F8000ECDADF91CF910895A1E21A2EAA1BBB1BC8 +:100F9000FD010DC0AA1FBB1FEE1FFF1FA217B30745 +:100FA000E407F50720F0A21BB30BE40BF50B661F5B +:100FB000771F881F991F1A9469F76095709580951F +:100FC00090959B01AC01BD01CF010895F894FFCF2E +:100FD0000003400000044000000208000000000080 +:060FE0000000000000000B +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-uno.hex b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-uno.hex index ca51dfaee4b..6c59d3fd1e7 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-uno.hex +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-uno.hex @@ -1,256 +1,256 @@ -:100000009CC00000B5C00000B3C00000B1C000003B -:10001000AFC00000ADC00000ABC00000A9C0000030 -:10002000A7C00000A5C00000A3C0000054C4000089 -:1000300018C400009DC000009BC0000099C00000D3 -:1000400097C0000095C0000093C0000091C0000060 -:100050008FC000008DC000008BC000000EC10000EA -:1000600087C0000085C0000083C0000081C0000080 -:100070007FC000007DC000007BC0000079C0000090 -:1000800077C0000075C0000073C0000071C00000A0 -:100090006FC000006DC000001201100102000008D6 -:1000A0004123010001000102DC0109023E000201BE -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:100120001803410072006400750069006E006F00E2 -:10013000200055006E006F00000011241FBECFEF9D -:10014000D2E0DEBFCDBF11E0A0E0B1E0E4ECFFE023 -:1001500002C005900D92A631B107D9F712E0A6E1D1 -:10016000B1E001C01D92AF32B107E1F7F1D028C76D -:1001700047CF9C01DC01AE57BF4FED91FC91119729 -:1001800041911196FC93EE9380589F4FE817F90721 -:1001900011F42D933C939FB7F894F901EC57FF4F5E -:1001A0008081815080839FBF842F0895DF92EF92DA -:1001B000FF920F931F93FC018489813019F08230E4 -:1001C00021F405C040E3D42E04C0DD2402C030E297 -:1001D000D32E8389823011F488E0D82A858987302C -:1001E00031F0883031F0863031F482E003C084E0B1 -:1001F00001C086E0D82A1092C9001092C80010925F -:10020000CA00E784F0880189128980E0E81681EE4F -:10021000F80680E0080780E0180719F420E130E0D4 -:100220000FC0C801B7019695879577956795605877 -:100230007B47814E9F4FA8019701A0D621503040A7 -:100240003093CD002093CC00D092CA0080E0E81615 -:1002500081EEF80680E0080780E0180711F082E0E0 -:1002600001C080E08093C80088E98093C9001F9195 -:100270000F91FF90EF90DF9008951F920F920FB6AD -:100280000F9211242F938F939F93EF93FF9390914D -:10029000CE008EB38430F1F4E0919901F0919A018F -:1002A0009083E0919901F0919A01CF01019690938A -:1002B0009A01809399018959914021F489E191E053 -:1002C000928381839FB7F89480919D018F5F809383 -:1002D0009D019FBFFF91EF919F918F912F910F9063 -:1002E0000FBE0F901F901895FC01858580FF02C0FE -:1002F0005F9808955F9A089580E091E0D5C580E009 -:1003000091E088C584B7877F84BF28E10FB6F89451 -:1003100020936000109260000FBE87E690E09093FB -:10032000CD008093CC0086E08093CA001092C80074 -:100330002093C900539A5A9A8AB180638AB98BB1C3 -:1003400080638BB983D284E085BD5F9A579A089504 -:100350000F931F93CF93DF93D5DF2FB7F8948EE9D8 -:1003600091E090931F0280931E029093210280934C -:1003700020022FBF2FB7F89489E191E090939A0162 -:100380008093990190939C0180939B012FBF789457 -:10039000CEE9D1E003E08FB7F894909122028FBFAD -:1003A000903809F180E091E0ABD497FD1CC0E0915A -:1003B0001E02F0911F028083E0911E02F0911F0245 -:1003C000CF01019690931F0280931E028E5192409E -:1003D00011F4D283C1839FB7F894809122028F5F7A -:1003E000809322029FBF8FB7F89410919D018FBF19 -:1003F000A89902C0113678F1A89A80919D018823AE -:1004000061F05D980093160108C089E191E0B1DECA -:10041000682F80E091E0DAD411501123B1F7809178 -:100420001601882351F080911601815080931601A6 -:1004300080911601882309F45D9A80911701882321 -:1004400051F080911701815080931701809117011D -:10045000882309F45C9A8FB7F894909122028FBF99 -:10046000992369F08EE991E084DE982F8091C8008D -:1004700085FFFCCF9093CE005C980093170180E03D -:1004800091E095D42AD487CFDA01923049F09330A5 -:1004900061F09130F9F4E8E9F0E022E130E01EC0CB -:1004A000EAEAF0E02EE330E019C0813049F0813013 -:1004B00018F0823079F408C0E8EEF0E0849107C0CB -:1004C000ECEEF0E0849103C0E0E2F1E08491282FAB -:1004D00030E004C0E0E0F0E020E030E0ED93FC9399 -:1004E000C901089528E030E040E003C04F5F220FCB -:1004F000331F28173907D0F3842F8295807F089502 -:100500008093E9008091EB0081608093EB00109272 -:10051000ED006093EC004093ED008091EE00881FA9 -:100520008827881F08951092F40090E09093E900C6 -:100530001092F0001092E8001092ED008091EB0014 -:100540008E7F8093EB009F5F953081F708958091B7 -:10055000270288238CF403C08EB38823B1F08091E6 -:10056000E80082FFF9CF8091E8008B778093E80064 -:1005700008958EB3882349F08091E80080FFF9CF79 -:100580008091E8008E778093E800089594E680914A -:10059000EC0080FF05C08091E80080FF05C023C00B -:1005A0008091E80082FD1FC08EB3882311F482E0A1 -:1005B00008958EB3853011F483E008958091EB00A7 -:1005C00085FF02C081E008958091E10082FFDFCFC6 -:1005D0008091E1008B7F8093E100992311F484E006 -:1005E00008959150D4CF80E008959C0140912D0250 -:1005F00050912E024617570718F4F90120E038C031 -:100600006115710511F0AB01F8CF8091E8008E778C -:100610008093E80040E050E0F0CF8091E80083FF55 -:1006200002C081E008958091E80082FD2DC08EB364 -:10063000882381F18EB3853079F18091E80080FFC5 -:1006400017C09091F20006C081918093F100415053 -:1006500050409F5F4115510511F09830A8F320E0FC -:10066000983009F421E08091E8008E778093E800CB -:100670004115510591F6222381F606C08EB38823D9 -:1006800049F08EB3853041F08091E80082FFF6CFCB -:1006900080E0089582E0089583E008959C014091F0 -:1006A0002D0250912E024617570710F490E03BC0E0 -:1006B0006115710511F0AB01F9CF8091E8008E77DB -:1006C0008093E80040E050E0F1CF8091E80083FFA4 -:1006D00002C081E008958091E80082FD30C08EB3B1 -:1006E000882399F18EB3853091F18091E80080FFE5 -:1006F0001AC08091F20009C0F9012F5F3F4FE491C9 -:10070000E093F100415050408F5F4115510511F0C9 -:10071000883090F390E0883009F491E08091E8000F -:100720008E778093E8004115510579F6992369F693 -:1007300006C08EB3882349F08EB3853041F0809196 -:10074000E80082FFF6CF80E0089582E0089583E01C -:1007500008959C016115710529F48091E8008B775B -:100760008093E800F90120C08091E80083FF02C077 -:1007700081E008958EB3882339F18EB3853031F14D -:100780008091E80082FFF0CF06C08091F100819354 -:100790006150704021F08091F2008823B1F7809180 -:1007A000E8008B778093E80061157105E9F606C0D3 -:1007B0008EB3882349F08EB3853041F08091E800F4 -:1007C00080FFF6CF80E0089582E0089583E00895E9 -:1007D00042D044D01EBA10922502109224021092E8 -:1007E000230284E089BD89B5826089BD09B400FE19 -:1007F000FDCF8091D800982F9F779093D800806884 -:100800008093D800809163008E7F809363008091F5 -:10081000D8008F7D8093D8008091E0008E7F8093F8 -:10082000E0008091E1008E7F8093E1008091E20002 -:1008300081608093E2008091E100877F8093E100F6 -:100840008091E20088608093E2000895C1DF81E03A -:100850008093260208951092E20008951092E1001C -:1008600008951F920F920FB60F9211241F932F938A -:100870003F934F935F936F937F938F939F93AF9328 -:10088000BF93EF93FF93E9EEF0E0108117701082B1 -:10089000E0EFF0E08081877F80837894C3D0F89484 -:1008A000A9EEB0E01C92E0EFF0E0808188608083E8 -:1008B0001C93FF91EF91BF91AF919F918F917F9189 -:1008C0006F915F914F913F912F911F910F900FBEAC -:1008D0000F901F9018951F920F920FB60F92112430 -:1008E0002F933F934F935F936F937F938F939F9338 -:1008F000AF93BF93EF93FF938091E10080FF1BC004 -:100900008091E20080FF17C08091E1008E7F80938C -:10091000E1008091E2008E7F8093E2008091E2000E -:1009200080618093E2008091D80080628093D8003B -:1009300019BC1EBAD1D18091E10084FF29C08091F9 -:10094000E20084FF25C084E089BD89B5826089BD4D -:1009500009B400FEFDCF8091D8008F7D8093D80030 -:100960008091E1008F7E8093E1008091E2008F7E94 -:100970008093E2008091E20081608093E2008091A8 -:100980002502882311F481E001C084E08EBBA4D14C -:100990008091E10083FF27C08091E20083FF23C0A4 -:1009A0008091E100877F8093E10082E08EBB10920E -:1009B00025028091E1008E7F8093E1008091E2002A -:1009C0008E7F8093E2008091E20080618093E2005C -:1009D000AADD80E060E042E093DD8091F000886075 -:1009E0008093F00079D18091E10082FF0AC080916C -:1009F000E20082FF06C08091E1008B7F8093E100DE -:100A00006BD1FF91EF91BF91AF919F918F917F91AA -:100A10006F915F914F913F912F910F900FBE0F906B -:100A20001F9018951F93DF93CF93CDB7DEB7AC9788 -:100A30000FB6F894DEBF0FBECDBFE7E2F2E08091C3 -:100A4000F100819322E0EF32F207C9F7809127028B -:100A500030912802353009F487C0363040F4313007 -:100A6000C9F1313070F0333009F01DC133C0383076 -:100A700009F4EFC0393009F4FEC0363009F013C173 -:100A800092C0803821F0823809F00DC108C09091E1 -:100A9000230280912402882399F0926011C08091F2 -:100AA0002B0287708093E9008091EB0090E025E0B5 -:100AB000969587952A95E1F7982F91701092E90005 -:100AC0008091E800877F8093E8009093F100109276 -:100AD000F100CAC0882319F0823009F0E4C090E028 -:100AE0008F719070009721F0029709F0DDC00CC063 -:100AF00080912902813009F0D7C01092240233304E -:100B000069F5809324022AC080912902882331F557 -:100B100020912B02277009F4C7C02093E90080912F -:100B2000EB0080FFC1C0333021F48091EB00806284 -:100B300013C08091EB0080618093EB0081E090E036 -:100B400002C0880F991F2A95E2F78093EA0010925D -:100B5000EA008091EB0088608093EB001092E9003E -:100B60008091E800877F83C0882309F09CC01091A2 -:100B700029028091E800877F8093E800E8DC04C0C8 -:100B80008EB3882309F490C08091E80080FFF8CFED -:100B9000812F8F7711F492E001C093E09EBB8068B3 -:100BA0008093E30081C08058823008F07CC080913F -:100BB000290290912A0223E08C3D920799F55FB7B4 -:100BC000F894DE0115964EE020E030E061E2E42F7B -:100BD000F0E060935700849120FF03C082958F70EE -:100BE0004F5F982F9F70892F805D8A3308F0895F4F -:100BF0008C9311961C9211972F5F3F4F12962431C0 -:100C0000310529F75FBF8AE28B8383E08C83809173 -:100C1000E800877F8093E800CE0103966AE270E0E7 -:100C2000E4DC11C060912B02AE014F5F5F4F2CDC02 -:100C3000BC010097C9F18091E800877F8093E800AC -:100C400089819A812BDD8091E8008B778093E80081 -:100C50002BC0803841F58091E800877F8093E800C1 -:100C6000809125028093F1008091E8008E77809337 -:100C7000E8006DDC19C08823B1F49091290292300C -:100C800098F48091E800877F8093E8009093250294 -:100C90005EDC80912502882311F483E001C084E0AA -:100CA0008EBB2DDB01C028DB8091E80083FF0AC0EA -:100CB0008091EB0080628093EB008091E800877F59 -:100CC0008093E800AC960FB6F894DEBF0FBECDBFA0 -:100CD000CF91DF911F91089508951F938EB38823BC -:100CE00061F01091E9001092E9008091E80083FF23 -:100CF00001C098DE17701093E9001F9108950895C0 -:100D0000FC018EB3843021F587859089A189B28951 -:100D10000097A105B105E1F085818093E9008091FC -:100D2000E80082FF15C08091F200882319F42FEFAC -:100D30003FEF04C08091F100282F30E08091F20055 -:100D4000882341F48091E8008B778093E80002C00B -:100D50002FEF3FEFC9010895FC018EB3843011F5E8 -:100D600087859089A189B2890097A105B105D1F045 -:100D700081818093E9008091F2008823A9F090910D -:100D8000E8008091E8008E778093E80095FD0CC024 -:100D9000FDDB982F882349F48091E8008E778093BB -:100DA000E80003C092E001C090E0892F0895FC01A3 -:100DB0008EB3843051F487859089A189B2890097D8 -:100DC000A105B10511F0CF01C7CF08951F93FC0114 -:100DD000162F8EB38430D9F487859089A189B28982 -:100DE0000097A105B10599F081818093E900809178 -:100DF000E80085FD08C08091E8008E778093E800C8 -:100E0000C5DB882329F41093F10080E001C082E063 -:100E10001F9108950F931F93CF93DF93EC010D96CD -:100E2000FC0189E0DF011D928A95E9F72A813B8167 -:100E300009818C81882311F410E001C014E0C901FC -:100E400051DB182B1260802F61E8412F59DB88237A -:100E500029F12E813F810D818885882311F410E0CE -:100E600001C014E0C9013EDB182B1260802F60E83E -:100E7000412F46DB882391F02A853B8509858C85A7 -:100E8000882311F410E001C014E0C9012BDB182BFA -:100E90001260802F61EC412F33DB01C080E0DF91D5 -:100EA000CF911F910F910895CF93DF93EC01809123 -:100EB000E80083FF60C0888190E020912B02309190 -:100EC0002C022817390709F056C080912802813278 -:100ED00061F0823220F4803209F04DC019C08232B4 -:100EE00069F1833209F047C038C080912702813A06 -:100EF00009F041C08091E800877F8093E800CE012F -:100F00000F9667E070E071DB8091E8008B7713C08B -:100F100080912702813279F58091E800877F809364 -:100F2000E800CE010F9667E070E013DCCE013ED9F9 -:100F30008091E8008E778093E8001DC080912702A1 -:100F40008132C9F48091E800877F8093E800809126 -:100F500029028D87CE01C8D90DC080912702813228 -:100F600051F48091E800877F8093E800CE01609182 -:100F70002902C5DEECDADF91CF910895A1E21A2EA5 -:100F8000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F2D -:100F9000A217B307E407F50720F0A21BB30BE40B7D -:100FA000F50B661F771F881F991F1A9469F76095C4 -:100FB0007095809590959B01AC01BD01CF0108957E -:040FC000F894FFCFD3 -:100FC400000340000004400000020800000000008C -:060FD40000000000000017 -:00000001FF +:100000009CC00000B5C00000B3C00000B1C000003B +:10001000AFC00000ADC00000ABC00000A9C0000030 +:10002000A7C00000A5C00000A3C0000054C4000089 +:1000300018C400009DC000009BC0000099C00000D3 +:1000400097C0000095C0000093C0000091C0000060 +:100050008FC000008DC000008BC000000EC10000EA +:1000600087C0000085C0000083C0000081C0000080 +:100070007FC000007DC000007BC0000079C0000090 +:1000800077C0000075C0000073C0000071C00000A0 +:100090006FC000006DC000001201100102000008D6 +:1000A0004123010001000102DC0109023E000201BE +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:100120001803410072006400750069006E006F00E2 +:10013000200055006E006F00000011241FBECFEF9D +:10014000D2E0DEBFCDBF11E0A0E0B1E0E4ECFFE023 +:1001500002C005900D92A631B107D9F712E0A6E1D1 +:10016000B1E001C01D92AF32B107E1F7F1D028C76D +:1001700047CF9C01DC01AE57BF4FED91FC91119729 +:1001800041911196FC93EE9380589F4FE817F90721 +:1001900011F42D933C939FB7F894F901EC57FF4F5E +:1001A0008081815080839FBF842F0895DF92EF92DA +:1001B000FF920F931F93FC018489813019F08230E4 +:1001C00021F405C040E3D42E04C0DD2402C030E297 +:1001D000D32E8389823011F488E0D82A858987302C +:1001E00031F0883031F0863031F482E003C084E0B1 +:1001F00001C086E0D82A1092C9001092C80010925F +:10020000CA00E784F0880189128980E0E81681EE4F +:10021000F80680E0080780E0180719F420E130E0D4 +:100220000FC0C801B7019695879577956795605877 +:100230007B47814E9F4FA8019701A0D621503040A7 +:100240003093CD002093CC00D092CA0080E0E81615 +:1002500081EEF80680E0080780E0180711F082E0E0 +:1002600001C080E08093C80088E98093C9001F9195 +:100270000F91FF90EF90DF9008951F920F920FB6AD +:100280000F9211242F938F939F93EF93FF9390914D +:10029000CE008EB38430F1F4E0919901F0919A018F +:1002A0009083E0919901F0919A01CF01019690938A +:1002B0009A01809399018959914021F489E191E053 +:1002C000928381839FB7F89480919D018F5F809383 +:1002D0009D019FBFFF91EF919F918F912F910F9063 +:1002E0000FBE0F901F901895FC01858580FF02C0FE +:1002F0005F9808955F9A089580E091E0D5C580E009 +:1003000091E088C584B7877F84BF28E10FB6F89451 +:1003100020936000109260000FBE87E690E09093FB +:10032000CD008093CC0086E08093CA001092C80074 +:100330002093C900539A5A9A8AB180638AB98BB1C3 +:1003400080638BB983D284E085BD5F9A579A089504 +:100350000F931F93CF93DF93D5DF2FB7F8948EE9D8 +:1003600091E090931F0280931E029093210280934C +:1003700020022FBF2FB7F89489E191E090939A0162 +:100380008093990190939C0180939B012FBF789457 +:10039000CEE9D1E003E08FB7F894909122028FBFAD +:1003A000903809F180E091E0ABD497FD1CC0E0915A +:1003B0001E02F0911F028083E0911E02F0911F0245 +:1003C000CF01019690931F0280931E028E5192409E +:1003D00011F4D283C1839FB7F894809122028F5F7A +:1003E000809322029FBF8FB7F89410919D018FBF19 +:1003F000A89902C0113678F1A89A80919D018823AE +:1004000061F05D980093160108C089E191E0B1DECA +:10041000682F80E091E0DAD411501123B1F7809178 +:100420001601882351F080911601815080931601A6 +:1004300080911601882309F45D9A80911701882321 +:1004400051F080911701815080931701809117011D +:10045000882309F45C9A8FB7F894909122028FBF99 +:10046000992369F08EE991E084DE982F8091C8008D +:1004700085FFFCCF9093CE005C980093170180E03D +:1004800091E095D42AD487CFDA01923049F09330A5 +:1004900061F09130F9F4E8E9F0E022E130E01EC0CB +:1004A000EAEAF0E02EE330E019C0813049F0813013 +:1004B00018F0823079F408C0E8EEF0E0849107C0CB +:1004C000ECEEF0E0849103C0E0E2F1E08491282FAB +:1004D00030E004C0E0E0F0E020E030E0ED93FC9399 +:1004E000C901089528E030E040E003C04F5F220FCB +:1004F000331F28173907D0F3842F8295807F089502 +:100500008093E9008091EB0081608093EB00109272 +:10051000ED006093EC004093ED008091EE00881FA9 +:100520008827881F08951092F40090E09093E900C6 +:100530001092F0001092E8001092ED008091EB0014 +:100540008E7F8093EB009F5F953081F708958091B7 +:10055000270288238CF403C08EB38823B1F08091E6 +:10056000E80082FFF9CF8091E8008B778093E80064 +:1005700008958EB3882349F08091E80080FFF9CF79 +:100580008091E8008E778093E800089594E680914A +:10059000EC0080FF05C08091E80080FF05C023C00B +:1005A0008091E80082FD1FC08EB3882311F482E0A1 +:1005B00008958EB3853011F483E008958091EB00A7 +:1005C00085FF02C081E008958091E10082FFDFCFC6 +:1005D0008091E1008B7F8093E100992311F484E006 +:1005E00008959150D4CF80E008959C0140912D0250 +:1005F00050912E024617570718F4F90120E038C031 +:100600006115710511F0AB01F8CF8091E8008E778C +:100610008093E80040E050E0F0CF8091E80083FF55 +:1006200002C081E008958091E80082FD2DC08EB364 +:10063000882381F18EB3853079F18091E80080FFC5 +:1006400017C09091F20006C081918093F100415053 +:1006500050409F5F4115510511F09830A8F320E0FC +:10066000983009F421E08091E8008E778093E800CB +:100670004115510591F6222381F606C08EB38823D9 +:1006800049F08EB3853041F08091E80082FFF6CFCB +:1006900080E0089582E0089583E008959C014091F0 +:1006A0002D0250912E024617570710F490E03BC0E0 +:1006B0006115710511F0AB01F9CF8091E8008E77DB +:1006C0008093E80040E050E0F1CF8091E80083FFA4 +:1006D00002C081E008958091E80082FD30C08EB3B1 +:1006E000882399F18EB3853091F18091E80080FFE5 +:1006F0001AC08091F20009C0F9012F5F3F4FE491C9 +:10070000E093F100415050408F5F4115510511F0C9 +:10071000883090F390E0883009F491E08091E8000F +:100720008E778093E8004115510579F6992369F693 +:1007300006C08EB3882349F08EB3853041F0809196 +:10074000E80082FFF6CF80E0089582E0089583E01C +:1007500008959C016115710529F48091E8008B775B +:100760008093E800F90120C08091E80083FF02C077 +:1007700081E008958EB3882339F18EB3853031F14D +:100780008091E80082FFF0CF06C08091F100819354 +:100790006150704021F08091F2008823B1F7809180 +:1007A000E8008B778093E80061157105E9F606C0D3 +:1007B0008EB3882349F08EB3853041F08091E800F4 +:1007C00080FFF6CF80E0089582E0089583E00895E9 +:1007D00042D044D01EBA10922502109224021092E8 +:1007E000230284E089BD89B5826089BD09B400FE19 +:1007F000FDCF8091D800982F9F779093D800806884 +:100800008093D800809163008E7F809363008091F5 +:10081000D8008F7D8093D8008091E0008E7F8093F8 +:10082000E0008091E1008E7F8093E1008091E20002 +:1008300081608093E2008091E100877F8093E100F6 +:100840008091E20088608093E2000895C1DF81E03A +:100850008093260208951092E20008951092E1001C +:1008600008951F920F920FB60F9211241F932F938A +:100870003F934F935F936F937F938F939F93AF9328 +:10088000BF93EF93FF93E9EEF0E0108117701082B1 +:10089000E0EFF0E08081877F80837894C3D0F89484 +:1008A000A9EEB0E01C92E0EFF0E0808188608083E8 +:1008B0001C93FF91EF91BF91AF919F918F917F9189 +:1008C0006F915F914F913F912F911F910F900FBEAC +:1008D0000F901F9018951F920F920FB60F92112430 +:1008E0002F933F934F935F936F937F938F939F9338 +:1008F000AF93BF93EF93FF938091E10080FF1BC004 +:100900008091E20080FF17C08091E1008E7F80938C +:10091000E1008091E2008E7F8093E2008091E2000E +:1009200080618093E2008091D80080628093D8003B +:1009300019BC1EBAD1D18091E10084FF29C08091F9 +:10094000E20084FF25C084E089BD89B5826089BD4D +:1009500009B400FEFDCF8091D8008F7D8093D80030 +:100960008091E1008F7E8093E1008091E2008F7E94 +:100970008093E2008091E20081608093E2008091A8 +:100980002502882311F481E001C084E08EBBA4D14C +:100990008091E10083FF27C08091E20083FF23C0A4 +:1009A0008091E100877F8093E10082E08EBB10920E +:1009B00025028091E1008E7F8093E1008091E2002A +:1009C0008E7F8093E2008091E20080618093E2005C +:1009D000AADD80E060E042E093DD8091F000886075 +:1009E0008093F00079D18091E10082FF0AC080916C +:1009F000E20082FF06C08091E1008B7F8093E100DE +:100A00006BD1FF91EF91BF91AF919F918F917F91AA +:100A10006F915F914F913F912F910F900FBE0F906B +:100A20001F9018951F93DF93CF93CDB7DEB7AC9788 +:100A30000FB6F894DEBF0FBECDBFE7E2F2E08091C3 +:100A4000F100819322E0EF32F207C9F7809127028B +:100A500030912802353009F487C0363040F4313007 +:100A6000C9F1313070F0333009F01DC133C0383076 +:100A700009F4EFC0393009F4FEC0363009F013C173 +:100A800092C0803821F0823809F00DC108C09091E1 +:100A9000230280912402882399F0926011C08091F2 +:100AA0002B0287708093E9008091EB0090E025E0B5 +:100AB000969587952A95E1F7982F91701092E90005 +:100AC0008091E800877F8093E8009093F100109276 +:100AD000F100CAC0882319F0823009F0E4C090E028 +:100AE0008F719070009721F0029709F0DDC00CC063 +:100AF00080912902813009F0D7C01092240233304E +:100B000069F5809324022AC080912902882331F557 +:100B100020912B02277009F4C7C02093E90080912F +:100B2000EB0080FFC1C0333021F48091EB00806284 +:100B300013C08091EB0080618093EB0081E090E036 +:100B400002C0880F991F2A95E2F78093EA0010925D +:100B5000EA008091EB0088608093EB001092E9003E +:100B60008091E800877F83C0882309F09CC01091A2 +:100B700029028091E800877F8093E800E8DC04C0C8 +:100B80008EB3882309F490C08091E80080FFF8CFED +:100B9000812F8F7711F492E001C093E09EBB8068B3 +:100BA0008093E30081C08058823008F07CC080913F +:100BB000290290912A0223E08C3D920799F55FB7B4 +:100BC000F894DE0115964EE020E030E061E2E42F7B +:100BD000F0E060935700849120FF03C082958F70EE +:100BE0004F5F982F9F70892F805D8A3308F0895F4F +:100BF0008C9311961C9211972F5F3F4F12962431C0 +:100C0000310529F75FBF8AE28B8383E08C83809173 +:100C1000E800877F8093E800CE0103966AE270E0E7 +:100C2000E4DC11C060912B02AE014F5F5F4F2CDC02 +:100C3000BC010097C9F18091E800877F8093E800AC +:100C400089819A812BDD8091E8008B778093E80081 +:100C50002BC0803841F58091E800877F8093E800C1 +:100C6000809125028093F1008091E8008E77809337 +:100C7000E8006DDC19C08823B1F49091290292300C +:100C800098F48091E800877F8093E8009093250294 +:100C90005EDC80912502882311F483E001C084E0AA +:100CA0008EBB2DDB01C028DB8091E80083FF0AC0EA +:100CB0008091EB0080628093EB008091E800877F59 +:100CC0008093E800AC960FB6F894DEBF0FBECDBFA0 +:100CD000CF91DF911F91089508951F938EB38823BC +:100CE00061F01091E9001092E9008091E80083FF23 +:100CF00001C098DE17701093E9001F9108950895C0 +:100D0000FC018EB3843021F587859089A189B28951 +:100D10000097A105B105E1F085818093E9008091FC +:100D2000E80082FF15C08091F200882319F42FEFAC +:100D30003FEF04C08091F100282F30E08091F20055 +:100D4000882341F48091E8008B778093E80002C00B +:100D50002FEF3FEFC9010895FC018EB3843011F5E8 +:100D600087859089A189B2890097A105B105D1F045 +:100D700081818093E9008091F2008823A9F090910D +:100D8000E8008091E8008E778093E80095FD0CC024 +:100D9000FDDB982F882349F48091E8008E778093BB +:100DA000E80003C092E001C090E0892F0895FC01A3 +:100DB0008EB3843051F487859089A189B2890097D8 +:100DC000A105B10511F0CF01C7CF08951F93FC0114 +:100DD000162F8EB38430D9F487859089A189B28982 +:100DE0000097A105B10599F081818093E900809178 +:100DF000E80085FD08C08091E8008E778093E800C8 +:100E0000C5DB882329F41093F10080E001C082E063 +:100E10001F9108950F931F93CF93DF93EC010D96CD +:100E2000FC0189E0DF011D928A95E9F72A813B8167 +:100E300009818C81882311F410E001C014E0C901FC +:100E400051DB182B1260802F61E8412F59DB88237A +:100E500029F12E813F810D818885882311F410E0CE +:100E600001C014E0C9013EDB182B1260802F60E83E +:100E7000412F46DB882391F02A853B8509858C85A7 +:100E8000882311F410E001C014E0C9012BDB182BFA +:100E90001260802F61EC412F33DB01C080E0DF91D5 +:100EA000CF911F910F910895CF93DF93EC01809123 +:100EB000E80083FF60C0888190E020912B02309190 +:100EC0002C022817390709F056C080912802813278 +:100ED00061F0823220F4803209F04DC019C08232B4 +:100EE00069F1833209F047C038C080912702813A06 +:100EF00009F041C08091E800877F8093E800CE012F +:100F00000F9667E070E071DB8091E8008B7713C08B +:100F100080912702813279F58091E800877F809364 +:100F2000E800CE010F9667E070E013DCCE013ED9F9 +:100F30008091E8008E778093E8001DC080912702A1 +:100F40008132C9F48091E800877F8093E800809126 +:100F500029028D87CE01C8D90DC080912702813228 +:100F600051F48091E800877F8093E800CE01609182 +:100F70002902C5DEECDADF91CF910895A1E21A2EA5 +:100F8000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F2D +:100F9000A217B307E407F50720F0A21BB30BE40B7D +:100FA000F50B661F771F881F991F1A9469F76095C4 +:100FB0007095809590959B01AC01BD01CF0108957E +:040FC000F894FFCFD3 +:100FC400000340000004400000020800000000008C +:060FD40000000000000017 +:00000001FF diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.c b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.c index 4de73c8a470..efa9998fa4e 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.c +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.c @@ -1,242 +1,242 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the Arduino-usbserial project. This file contains the main tasks of - * the project and is responsible for the initial application hardware configuration. - */ - -#include "Arduino-usbserial.h" - -/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ -RingBuff_t USBtoUSART_Buffer; - -/** Circular buffer to hold data from the serial port before it is sent to the host. */ -RingBuff_t USARTtoUSB_Buffer; - -/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ -volatile struct -{ - uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ - uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ - uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ -} PulseMSRemaining; - -/** LUFA CDC Class driver interface configuration and state information. This structure is - * passed to all CDC Class driver functions, so that multiple instances of the same class - * within a device can be differentiated from one another. - */ -USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = - { - .Config = - { - .ControlInterfaceNumber = 0, - - .DataINEndpointNumber = CDC_TX_EPNUM, - .DataINEndpointSize = CDC_TXRX_EPSIZE, - .DataINEndpointDoubleBank = false, - - .DataOUTEndpointNumber = CDC_RX_EPNUM, - .DataOUTEndpointSize = CDC_TXRX_EPSIZE, - .DataOUTEndpointDoubleBank = false, - - .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, - .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, - .NotificationEndpointDoubleBank = false, - }, - }; - -/** Main program entry point. This routine contains the overall program flow, including initial - * setup of all components and the main program loop. - */ -int main(void) -{ - SetupHardware(); - - RingBuffer_InitBuffer(&USBtoUSART_Buffer); - RingBuffer_InitBuffer(&USARTtoUSB_Buffer); - - sei(); - - for (;;) - { - /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ - if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) - { - int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); - - /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ - if (!(ReceivedByte < 0)) - RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); - } - - /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ - RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); - if ((TIFR0 & (1 << TOV0)) || (BufferCount > BUFFER_NEARLY_FULL)) - { - TIFR0 |= (1 << TOV0); - - if (USARTtoUSB_Buffer.Count) { - LEDs_TurnOnLEDs(LEDMASK_TX); - PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; - } - - /* Read bytes from the USART receive buffer into the USB IN endpoint */ - while (BufferCount--) - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); - - /* Turn off TX LED(s) once the TX pulse period has elapsed */ - if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) - LEDs_TurnOffLEDs(LEDMASK_TX); - - /* Turn off RX LED(s) once the RX pulse period has elapsed */ - if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) - LEDs_TurnOffLEDs(LEDMASK_RX); - } - - /* Load the next byte from the USART transmit buffer into the USART */ - if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { - Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); - - LEDs_TurnOnLEDs(LEDMASK_RX); - PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; - } - - CDC_Device_USBTask(&VirtualSerial_CDC_Interface); - USB_USBTask(); - } -} - -/** Configures the board hardware and chip peripherals for the demo's functionality. */ -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Hardware Initialization */ - Serial_Init(9600, false); - LEDs_Init(); - USB_Init(); - - /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ - TCCR0B = (1 << CS02); - - /* Pull target /RESET line high */ - AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; - AVR_RESET_LINE_DDR |= AVR_RESET_LINE_MASK; -} - -/** Event handler for the library USB Configuration Changed event. */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); -} - -/** Event handler for the library USB Unhandled Control Request event. */ -void EVENT_USB_Device_UnhandledControlRequest(void) -{ - CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); -} - -/** Event handler for the CDC Class driver Line Encoding Changed event. - * - * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced - */ -void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - uint8_t ConfigMask = 0; - - switch (CDCInterfaceInfo->State.LineEncoding.ParityType) - { - case CDC_PARITY_Odd: - ConfigMask = ((1 << UPM11) | (1 << UPM10)); - break; - case CDC_PARITY_Even: - ConfigMask = (1 << UPM11); - break; - } - - if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) - ConfigMask |= (1 << USBS1); - - switch (CDCInterfaceInfo->State.LineEncoding.DataBits) - { - case 6: - ConfigMask |= (1 << UCSZ10); - break; - case 7: - ConfigMask |= (1 << UCSZ11); - break; - case 8: - ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); - break; - } - - /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ - UCSR1B = 0; - UCSR1A = 0; - UCSR1C = 0; - - /* Special case 57600 baud for compatibility with the ATmega328 bootloader. */ - UBRR1 = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) - ? SERIAL_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS) - : SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - - UCSR1C = ConfigMask; - UCSR1A = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) ? 0 : (1 << U2X1); - UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); -} - -/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer - * for later transmission to the host. - */ -ISR(USART1_RX_vect, ISR_BLOCK) -{ - uint8_t ReceivedByte = UDR1; - - if (USB_DeviceState == DEVICE_STATE_Configured) - RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); -} - -/** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event. - * - * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced - */ -void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); - - if (CurrentDTRState) - AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; - else - AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; -} +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the Arduino-usbserial project. This file contains the main tasks of + * the project and is responsible for the initial application hardware configuration. + */ + +#include "Arduino-usbserial.h" + +/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ +RingBuff_t USBtoUSART_Buffer; + +/** Circular buffer to hold data from the serial port before it is sent to the host. */ +RingBuff_t USARTtoUSB_Buffer; + +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ +volatile struct +{ + uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ + uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ + uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ +} PulseMSRemaining; + +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = + { + .Config = + { + .ControlInterfaceNumber = 0, + + .DataINEndpointNumber = CDC_TX_EPNUM, + .DataINEndpointSize = CDC_TXRX_EPSIZE, + .DataINEndpointDoubleBank = false, + + .DataOUTEndpointNumber = CDC_RX_EPNUM, + .DataOUTEndpointSize = CDC_TXRX_EPSIZE, + .DataOUTEndpointDoubleBank = false, + + .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, + .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, + .NotificationEndpointDoubleBank = false, + }, + }; + +/** Main program entry point. This routine contains the overall program flow, including initial + * setup of all components and the main program loop. + */ +int main(void) +{ + SetupHardware(); + + RingBuffer_InitBuffer(&USBtoUSART_Buffer); + RingBuffer_InitBuffer(&USARTtoUSB_Buffer); + + sei(); + + for (;;) + { + /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ + if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) + { + int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); + + /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ + if (!(ReceivedByte < 0)) + RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); + } + + /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ + RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); + if ((TIFR0 & (1 << TOV0)) || (BufferCount > BUFFER_NEARLY_FULL)) + { + TIFR0 |= (1 << TOV0); + + if (USARTtoUSB_Buffer.Count) { + LEDs_TurnOnLEDs(LEDMASK_TX); + PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; + } + + /* Read bytes from the USART receive buffer into the USB IN endpoint */ + while (BufferCount--) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); + + /* Turn off TX LED(s) once the TX pulse period has elapsed */ + if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_TX); + + /* Turn off RX LED(s) once the RX pulse period has elapsed */ + if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_RX); + } + + /* Load the next byte from the USART transmit buffer into the USART */ + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); + + LEDs_TurnOnLEDs(LEDMASK_RX); + PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; + } + + CDC_Device_USBTask(&VirtualSerial_CDC_Interface); + USB_USBTask(); + } +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Hardware Initialization */ + Serial_Init(9600, false); + LEDs_Init(); + USB_Init(); + + /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ + TCCR0B = (1 << CS02); + + /* Pull target /RESET line high */ + AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; + AVR_RESET_LINE_DDR |= AVR_RESET_LINE_MASK; +} + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); +} + +/** Event handler for the library USB Unhandled Control Request event. */ +void EVENT_USB_Device_UnhandledControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); +} + +/** Event handler for the CDC Class driver Line Encoding Changed event. + * + * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced + */ +void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + uint8_t ConfigMask = 0; + + switch (CDCInterfaceInfo->State.LineEncoding.ParityType) + { + case CDC_PARITY_Odd: + ConfigMask = ((1 << UPM11) | (1 << UPM10)); + break; + case CDC_PARITY_Even: + ConfigMask = (1 << UPM11); + break; + } + + if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) + ConfigMask |= (1 << USBS1); + + switch (CDCInterfaceInfo->State.LineEncoding.DataBits) + { + case 6: + ConfigMask |= (1 << UCSZ10); + break; + case 7: + ConfigMask |= (1 << UCSZ11); + break; + case 8: + ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); + break; + } + + /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ + UCSR1B = 0; + UCSR1A = 0; + UCSR1C = 0; + + /* Special case 57600 baud for compatibility with the ATmega328 bootloader. */ + UBRR1 = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) + ? SERIAL_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS) + : SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); + + UCSR1C = ConfigMask; + UCSR1A = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) ? 0 : (1 << U2X1); + UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); +} + +/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer + * for later transmission to the host. + */ +ISR(USART1_RX_vect, ISR_BLOCK) +{ + uint8_t ReceivedByte = UDR1; + + if (USB_DeviceState == DEVICE_STATE_Configured) + RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); +} + +/** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event. + * + * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced + */ +void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); + + if (CurrentDTRState) + AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; + else + AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; +} diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.h b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.h index 99fde3914b4..2183512c891 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.h +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.h @@ -1,79 +1,79 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Arduino-usbserial.c. - */ - -#ifndef _ARDUINO_USBSERIAL_H_ -#define _ARDUINO_USBSERIAL_H_ - - /* Includes: */ - #include - #include - #include - #include - - #include "Descriptors.h" - - #include "Lib/LightweightRingBuff.h" - - #include - #include - #include - #include - #include - - /* Macros: */ - /** LED mask for the library LED driver, to indicate TX activity. */ - #define LEDMASK_TX LEDS_LED1 - - /** LED mask for the library LED driver, to indicate RX activity. */ - #define LEDMASK_RX LEDS_LED2 - - /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ - #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) - - /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ - #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) - - /* Function Prototypes: */ - void SetupHardware(void); - - void EVENT_USB_Device_Connect(void); - void EVENT_USB_Device_Disconnect(void); - void EVENT_USB_Device_ConfigurationChanged(void); - void EVENT_USB_Device_UnhandledControlRequest(void); - - void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); - void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); - -#endif /* _ARDUINO_USBSERIAL_H_ */ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Arduino-usbserial.c. + */ + +#ifndef _ARDUINO_USBSERIAL_H_ +#define _ARDUINO_USBSERIAL_H_ + + /* Includes: */ + #include + #include + #include + #include + + #include "Descriptors.h" + + #include "Lib/LightweightRingBuff.h" + + #include + #include + #include + #include + #include + + /* Macros: */ + /** LED mask for the library LED driver, to indicate TX activity. */ + #define LEDMASK_TX LEDS_LED1 + + /** LED mask for the library LED driver, to indicate RX activity. */ + #define LEDMASK_RX LEDS_LED2 + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ + #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) + + /* Function Prototypes: */ + void SetupHardware(void); + + void EVENT_USB_Device_Connect(void); + void EVENT_USB_Device_Disconnect(void); + void EVENT_USB_Device_ConfigurationChanged(void); + void EVENT_USB_Device_UnhandledControlRequest(void); + + void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + +#endif /* _ARDUINO_USBSERIAL_H_ */ diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Board/LEDs.h b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Board/LEDs.h index 152e8f571c4..41465f22ddf 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Board/LEDs.h +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Board/LEDs.h @@ -1,110 +1,110 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/* - Board LEDs driver for the Benito board, from www.dorkbotpdx.org. -*/ - -#ifndef __LEDS_ARDUINOUNO_H__ -#define __LEDS_ARDUINOUNO_H__ - - /* Includes: */ - #include - -/* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(INCLUDE_FROM_LEDS_H) - #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** LED mask for the first LED on the board. */ - #define LEDS_LED1 (1 << 5) - - /** LED mask for the second LED on the board. */ - #define LEDS_LED2 (1 << 4) - - /** LED mask for all the LEDs on the board. */ - #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) - - /** LED mask for the none of the board LEDs */ - #define LEDS_NO_LEDS 0 - - /* Inline Functions: */ - #if !defined(__DOXYGEN__) - static inline void LEDs_Init(void) - { - DDRD |= LEDS_ALL_LEDS; - PORTD |= LEDS_ALL_LEDS; - } - - static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) - { - PORTD &= ~LEDMask; - } - - static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) - { - PORTD |= LEDMask; - } - - static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) - { - PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); - } - - static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) - { - PORTD = ((PORTD | ActiveMask) & ~LEDMask); - } - - static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) - { - PORTD ^= LEDMask; - } - - static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; - static inline uint8_t LEDs_GetLEDs(void) - { - return (PORTD & LEDS_ALL_LEDS); - } - #endif - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/* + Board LEDs driver for the Benito board, from www.dorkbotpdx.org. +*/ + +#ifndef __LEDS_ARDUINOUNO_H__ +#define __LEDS_ARDUINOUNO_H__ + + /* Includes: */ + #include + +/* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the first LED on the board. */ + #define LEDS_LED1 (1 << 5) + + /** LED mask for the second LED on the board. */ + #define LEDS_LED2 (1 << 4) + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the none of the board LEDs */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRD |= LEDS_ALL_LEDS; + PORTD |= LEDS_ALL_LEDS; + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + PORTD &= ~LEDMask; + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + PORTD |= LEDMask; + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) + { + PORTD = ((PORTD | ActiveMask) & ~LEDMask); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + PORTD ^= LEDMask; + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return (PORTD & LEDS_ALL_LEDS); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.c b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.c index 705dddf9aed..ff033e093ad 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.c +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.c @@ -1,277 +1,277 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/* On some devices, there is a factory set internal serial number which can be automatically sent to the host as - * the device's serial number when the Device Descriptor's .SerialNumStrIndex entry is set to USE_INTERNAL_SERIAL. - * This allows the host to track a device across insertions on different ports, allowing them to retain allocated - * resources like COM port numbers and drivers. On demos using this feature, give a warning on unsupported devices - * so that the user can supply their own serial number descriptor instead or remove the USE_INTERNAL_SERIAL value - * from the Device Descriptor (forcing the host to generate a serial number for each device from the VID, PID and - * port location). - */ -#if (USE_INTERNAL_SERIAL == NO_DESCRIPTOR) - #warning USE_INTERNAL_SERIAL is not available on this AVR - please manually construct a device serial descriptor. -#endif - -/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ -USB_Descriptor_Device_t PROGMEM DeviceDescriptor = -{ - .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - - .USBSpecification = VERSION_BCD(01.10), - .Class = 0x02, - .SubClass = 0x00, - .Protocol = 0x00, - - .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - - .VendorID = 0x03EB, // Atmel - - .ProductID = 0x204B, // LUFA USB to Serial Demo Application - .ReleaseNumber = 0x0001, - - .ManufacturerStrIndex = 0x01, - .ProductStrIndex = 0x02, - .SerialNumStrIndex = USE_INTERNAL_SERIAL, - - .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS -}; - -/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ -USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = -{ - .Config = - { - .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 2, - - .ConfigurationNumber = 1, - .ConfigurationStrIndex = NO_DESCRIPTOR, - - .ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED), - - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) - }, - - .CDC_CCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 0, - .AlternateSetting = 0, - - .TotalEndpoints = 1, - - .Class = 0x02, - .SubClass = 0x02, - .Protocol = 0x01, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_Functional_IntHeader = - { - .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, - .SubType = 0x00, - - .Data = {0x01, 0x10} - }, - - .CDC_Functional_AbstractControlManagement = - { - .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), .Type = 0x24}, - .SubType = 0x02, - - .Data = {0x06} - }, - - .CDC_Functional_Union = - { - .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, - .SubType = 0x06, - - .Data = {0x00, 0x01} - }, - - .CDC_NotificationEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_NOTIFICATION_EPSIZE, - .PollingIntervalMS = 0xFF - }, - - .CDC_DCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 1, - .AlternateSetting = 0, - - .TotalEndpoints = 2, - - .Class = 0x0A, - .SubClass = 0x00, - .Protocol = 0x00, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_DataOutEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - }, - - .CDC_DataInEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - } -}; - -/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests - * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -USB_Descriptor_String_t PROGMEM LanguageString = -{ - .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, - - .UnicodeString = {LANGUAGE_ID_ENG} -}; - -/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable - * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -USB_Descriptor_String_t PROGMEM ManufacturerString = -{ - .Header = {.Size = USB_STRING_LEN(24), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino (www.arduino.cc)" -}; - -/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, - * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -USB_Descriptor_String_t PROGMEM ProductString = -{ - #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) - .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Uno" - #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) - .Header = {.Size = USB_STRING_LEN(17), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Mega 2560" - #endif - -}; - -/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" - * documentation) by the application code so that the address and size of a requested descriptor can be given - * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function - * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the - * USB host. - */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = (void*)&DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = (void*)&ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - switch (DescriptorNumber) - { - case 0x00: - Address = (void*)&LanguageString; - Size = pgm_read_byte(&LanguageString.Header.Size); - break; - case 0x01: - Address = (void*)&ManufacturerString; - Size = pgm_read_byte(&ManufacturerString.Header.Size); - break; - case 0x02: - Address = (void*)&ProductString; - Size = pgm_read_byte(&ProductString.Header.Size); - break; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/* On some devices, there is a factory set internal serial number which can be automatically sent to the host as + * the device's serial number when the Device Descriptor's .SerialNumStrIndex entry is set to USE_INTERNAL_SERIAL. + * This allows the host to track a device across insertions on different ports, allowing them to retain allocated + * resources like COM port numbers and drivers. On demos using this feature, give a warning on unsupported devices + * so that the user can supply their own serial number descriptor instead or remove the USE_INTERNAL_SERIAL value + * from the Device Descriptor (forcing the host to generate a serial number for each device from the VID, PID and + * port location). + */ +#if (USE_INTERNAL_SERIAL == NO_DESCRIPTOR) + #warning USE_INTERNAL_SERIAL is not available on this AVR - please manually construct a device serial descriptor. +#endif + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +USB_Descriptor_Device_t PROGMEM DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = 0x02, + .SubClass = 0x00, + .Protocol = 0x00, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x03EB, // Atmel + + .ProductID = 0x204B, // LUFA USB to Serial Demo Application + .ReleaseNumber = 0x0001, + + .ManufacturerStrIndex = 0x01, + .ProductStrIndex = 0x02, + .SerialNumStrIndex = USE_INTERNAL_SERIAL, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED), + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = 0x02, + .SubClass = 0x02, + .Protocol = 0x01, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_IntHeader = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, + .SubType = 0x00, + + .Data = {0x01, 0x10} + }, + + .CDC_Functional_AbstractControlManagement = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), .Type = 0x24}, + .SubType = 0x02, + + .Data = {0x06} + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, + .SubType = 0x06, + + .Data = {0x00, 0x01} + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = 0x0A, + .SubClass = 0x00, + .Protocol = 0x00, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +USB_Descriptor_String_t PROGMEM LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable + * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t PROGMEM ManufacturerString = +{ + .Header = {.Size = USB_STRING_LEN(24), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino (www.arduino.cc)" +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t PROGMEM ProductString = +{ + #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Uno" + #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) + .Header = {.Size = USB_STRING_LEN(17), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Mega 2560" + #endif + +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = (void*)&DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = (void*)&ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case 0x00: + Address = (void*)&LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case 0x01: + Address = (void*)&ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case 0x02: + Address = (void*)&ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.h b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.h index 3ac4e525779..2bce3d78efb 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.h +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.h @@ -1,88 +1,88 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - #include - #include - - /* Product-specific definitions: */ - #define ARDUINO_UNO_PID 0x0001 - #define ARDUINO_MEGA2560_PID 0x0010 - - /* Macros: */ - /** Endpoint number of the CDC device-to-host notification IN endpoint. */ - #define CDC_NOTIFICATION_EPNUM 2 - - /** Endpoint number of the CDC device-to-host data IN endpoint. */ - #define CDC_TX_EPNUM 3 - - /** Endpoint number of the CDC host-to-device data OUT endpoint. */ - #define CDC_RX_EPNUM 4 - - /** Size in bytes of the CDC device-to-host notification IN endpoint. */ - #define CDC_NOTIFICATION_EPSIZE 8 - - /** Size in bytes of the CDC data IN and OUT endpoints. */ - #define CDC_TXRX_EPSIZE 64 - - /* Type Defines: */ - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - USB_Descriptor_Interface_t CDC_CCI_Interface; - CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; - CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement; - CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; - USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; - USB_Descriptor_Interface_t CDC_DCI_Interface; - USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; - USB_Descriptor_Endpoint_t CDC_DataInEndpoint; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + #include + #include + + /* Product-specific definitions: */ + #define ARDUINO_UNO_PID 0x0001 + #define ARDUINO_MEGA2560_PID 0x0010 + + /* Macros: */ + /** Endpoint number of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number of the CDC device-to-host data IN endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number of the CDC host-to-device data OUT endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size in bytes of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /** Size in bytes of the CDC data IN and OUT endpoints. */ + #define CDC_TXRX_EPSIZE 64 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + USB_Descriptor_Interface_t CDC_CCI_Interface; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; + CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Lib/LightweightRingBuff.h b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Lib/LightweightRingBuff.h index fb48c1f7398..5a9a125c18b 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Lib/LightweightRingBuff.h +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Lib/LightweightRingBuff.h @@ -1,197 +1,197 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Ultra lightweight ring buffer, for fast insertion/deletion. - */ - -#ifndef _ULW_RING_BUFF_H_ -#define _ULW_RING_BUFF_H_ - - /* Includes: */ - #include - - #include - #include - - /* Defines: */ - /** Size of each ring buffer, in data elements - must be between 1 and 255. */ - #define BUFFER_SIZE 128 - - /** Maximum number of data elements to buffer before forcing a flush. - * Must be less than BUFFER_SIZE - */ - #define BUFFER_NEARLY_FULL 96 - - /** Type of data to store into the buffer. */ - #define RingBuff_Data_t uint8_t - - /** Datatype which may be used to store the count of data stored in a buffer, retrieved - * via a call to \ref RingBuffer_GetCount(). - */ - #if (BUFFER_SIZE <= 0xFF) - #define RingBuff_Count_t uint8_t - #else - #define RingBuff_Count_t uint16_t - #endif - - /* Type Defines: */ - /** Type define for a new ring buffer object. Buffers should be initialized via a call to - * \ref RingBuffer_InitBuffer() before use. - */ - typedef struct - { - RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */ - RingBuff_Data_t* In; /**< Current storage location in the circular buffer */ - RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */ - RingBuff_Count_t Count; - } RingBuff_t; - - /* Inline Functions: */ - /** Initializes a ring buffer ready for use. Buffers must be initialized via this function - * before any operations are called upon them. Already initialized buffers may be reset - * by re-initializing them using this function. - * - * \param[out] Buffer Pointer to a ring buffer structure to initialize - */ - static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) - { - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Buffer->In = Buffer->Buffer; - Buffer->Out = Buffer->Buffer; - } - } - - /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed - * by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that - * the buffer cannot be modified while the computation takes place. This value should be cached - * when reading out the contents of the buffer, so that as small a time as possible is spent - * in an atomic lock. - * - * \note The value returned by this function is guaranteed to only be the minimum number of bytes - * stored in the given buffer; this value may change as other threads write new data and so - * the returned number should be used only to determine how many successive reads may safely - * be performed on the buffer. - * - * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed - */ - static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer) - { - RingBuff_Count_t Count; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Count = Buffer->Count; - } - - return Count; - } - - /** Atomically determines if the specified ring buffer contains any free space. This should - * be tested before storing data to the buffer, to ensure that no data is lost due to a - * buffer overrun. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to insert into - * - * \return Boolean true if the buffer contains no free space, false otherwise - */ - static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer) - { - return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE); - } - - /** Atomically determines if the specified ring buffer contains any data. This should - * be tested before removing data from the buffer, to ensure that the buffer does not - * underflow. - * - * If the data is to be removed in a loop, store the total number of bytes stored in the - * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable - * to reduce the time spent in atomicity locks. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to insert into - * - * \return Boolean true if the buffer contains no free space, false otherwise - */ - static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer) - { - return (RingBuffer_GetCount(Buffer) == 0); - } - - /** Inserts an element into the ring buffer. - * - * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer - * otherwise data corruption may occur. Insertion and removal may occur from different execution - * threads. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to insert into - * \param[in] Data Data element to insert into the buffer - */ - static inline void RingBuffer_Insert(RingBuff_t* const Buffer, - const RingBuff_Data_t Data) - { - *Buffer->In = Data; - - if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) - Buffer->In = Buffer->Buffer; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Buffer->Count++; - } - } - - /** Removes an element from the ring buffer. - * - * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer - * otherwise data corruption may occur. Insertion and removal may occur from different execution - * threads. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from - * - * \return Next data element stored in the buffer - */ - static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) - { - RingBuff_Data_t Data = *Buffer->Out; - - if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) - Buffer->Out = Buffer->Buffer; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Buffer->Count--; - } - - return Data; - } - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Ultra lightweight ring buffer, for fast insertion/deletion. + */ + +#ifndef _ULW_RING_BUFF_H_ +#define _ULW_RING_BUFF_H_ + + /* Includes: */ + #include + + #include + #include + + /* Defines: */ + /** Size of each ring buffer, in data elements - must be between 1 and 255. */ + #define BUFFER_SIZE 128 + + /** Maximum number of data elements to buffer before forcing a flush. + * Must be less than BUFFER_SIZE + */ + #define BUFFER_NEARLY_FULL 96 + + /** Type of data to store into the buffer. */ + #define RingBuff_Data_t uint8_t + + /** Datatype which may be used to store the count of data stored in a buffer, retrieved + * via a call to \ref RingBuffer_GetCount(). + */ + #if (BUFFER_SIZE <= 0xFF) + #define RingBuff_Count_t uint8_t + #else + #define RingBuff_Count_t uint16_t + #endif + + /* Type Defines: */ + /** Type define for a new ring buffer object. Buffers should be initialized via a call to + * \ref RingBuffer_InitBuffer() before use. + */ + typedef struct + { + RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */ + RingBuff_Data_t* In; /**< Current storage location in the circular buffer */ + RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */ + RingBuff_Count_t Count; + } RingBuff_t; + + /* Inline Functions: */ + /** Initializes a ring buffer ready for use. Buffers must be initialized via this function + * before any operations are called upon them. Already initialized buffers may be reset + * by re-initializing them using this function. + * + * \param[out] Buffer Pointer to a ring buffer structure to initialize + */ + static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) + { + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->In = Buffer->Buffer; + Buffer->Out = Buffer->Buffer; + } + } + + /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed + * by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that + * the buffer cannot be modified while the computation takes place. This value should be cached + * when reading out the contents of the buffer, so that as small a time as possible is spent + * in an atomic lock. + * + * \note The value returned by this function is guaranteed to only be the minimum number of bytes + * stored in the given buffer; this value may change as other threads write new data and so + * the returned number should be used only to determine how many successive reads may safely + * be performed on the buffer. + * + * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed + */ + static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer) + { + RingBuff_Count_t Count; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Count = Buffer->Count; + } + + return Count; + } + + /** Atomically determines if the specified ring buffer contains any free space. This should + * be tested before storing data to the buffer, to ensure that no data is lost due to a + * buffer overrun. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * + * \return Boolean true if the buffer contains no free space, false otherwise + */ + static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer) + { + return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE); + } + + /** Atomically determines if the specified ring buffer contains any data. This should + * be tested before removing data from the buffer, to ensure that the buffer does not + * underflow. + * + * If the data is to be removed in a loop, store the total number of bytes stored in the + * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable + * to reduce the time spent in atomicity locks. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * + * \return Boolean true if the buffer contains no free space, false otherwise + */ + static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer) + { + return (RingBuffer_GetCount(Buffer) == 0); + } + + /** Inserts an element into the ring buffer. + * + * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer + * otherwise data corruption may occur. Insertion and removal may occur from different execution + * threads. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * \param[in] Data Data element to insert into the buffer + */ + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, + const RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->Count++; + } + } + + /** Removes an element from the ring buffer. + * + * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer + * otherwise data corruption may occur. Insertion and removal may occur from different execution + * threads. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from + * + * \return Next data element stored in the buffer + */ + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->Count--; + } + + return Data; + } + +#endif diff --git a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/makefile b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/makefile index 79d6be23147..de518efcbc1 100644 --- a/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/makefile +++ b/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/makefile @@ -1,776 +1,776 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# MCU name(s) -# Since the ATMEGA8U2 part is not directly supported by the current -# versions of either avrdude or dfu-programmer, we specify a dummy -# part; AT90USB82 which is close enough in memory size and organization -MCU = atmega8u2 -MCU_AVRDUDE = at90usb82 -MCU_DFU = at90usb82 - -# Specify the Arduino model using the assigned PID. This is used by Descriptors.c -# to set PID and product descriptor string -# Uno PID: -ARDUINO_MODEL_PID = 0x0001 -# Mega 2560 PID: -#ARDUINO_MODEL_PID = 0x0010 - - -# Target board (see library "Board Types" documentation, NONE for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USER - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_CLOCK below, as it is sourced by -# F_CLOCK after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# Input clock frequency. -# This will define a symbol, F_CLOCK, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_CLOCK = $(F_CPU) - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = Arduino-usbserial - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Path to the LUFA library -LUFA_PATH = ../.. - - -# LUFA library compile-time options -LUFA_OPTS = -D USB_DEVICE_ONLY -LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 -LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 -LUFA_OPTS += -D USE_FLASH_DESCRIPTORS -LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT -LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" - - -# Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - $(LUFA_SRC_USBCLASS) \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Device.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/HostStandardReq.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Pipe.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBController.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/Events.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBInterrupt.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBTask.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/CDC.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/CDC.c - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(LUFA_PATH)/ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=gnu99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -CDEFS += -DF_CLOCK=$(F_CLOCK)UL -CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) -CDEFS += -DBOARD=BOARD_$(BOARD) -CDEFS += $(LUFA_OPTS) -CDEFS += -DAVR_RESET_LINE_PORT="PORTD" -CDEFS += -DAVR_RESET_LINE_DDR="DDRD" -CDEFS += -DAVR_RESET_LINE_MASK="(1 << 7)" -CDEFS += -DTX_RX_LED_PULSE_MS=3 -CDEFS += -DPING_PONG_LED_PULSE_MS=100 - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) -ADEFS += -DF_CLOCK=$(F_CLOCK)UL -ADEFS += -DBOARD=BOARD_$(BOARD) -ADEFS += $(LUFA_OPTS) - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL -CPPDEFS += -DBOARD=BOARD_$(BOARD) -CPPDEFS += $(LUFA_OPTS) -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CPPFLAGS += -Wundef -CFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = avrispmkii - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FORCE = -F - -AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) -AVRDUDE_FLAGS += $(AVRDUDE_FORCE) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -#all: begin gccversion sizebefore build checkinvalidevents showliboptions showtarget sizeafter end -all: begin gccversion sizebefore build showliboptions showtarget sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym asm -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -asm: $(TARGET).s -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -#$(LUFA_PATH)/LUFA/LUFA_Events.lst: -# @make -C $(LUFA_PATH)/LUFA/ LUFA_Events.lst - -#checkinvalidevents: $(LUFA_PATH)/LUFA/LUFA_Events.lst -# @echo -# @echo Checking for invalid events... -# @$(shell) avr-nm $(OBJ) | sed -n -e 's/^.*EVENT_/EVENT_/p' | \ -# grep -F -v --file=$(LUFA_PATH)/LUFA/LUFA_Events.lst > InvalidEvents.tmp || true -# @sed -n -e 's/^/ WARNING - INVALID EVENT NAME: /p' InvalidEvents.tmp -# @if test -s InvalidEvents.tmp; then exit 1; fi - -showliboptions: - @echo - @echo ---- Compile Time Library Options ---- - @for i in $(LUFA_OPTS:-D%=%); do \ - echo $$i; \ - done - @echo -------------------------------------- - -showtarget: - @echo - @echo --------- Target Information --------- - @echo AVR Model: $(MCU) - @echo Board: $(BOARD) - @echo Clock: $(F_CPU)Hz CPU, $(F_CLOCK)Hz Master - @echo -------------------------------------- - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - -flip: $(TARGET).hex - batchisp -hardware usb -device $(MCU_DFU) -operation erase f - batchisp -hardware usb -device $(MCU_DFU) -operation loadbuffer $(TARGET).hex program - batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 - -dfu: $(TARGET).hex - dfu-programmer $(MCU_DFU) erase - dfu-programmer $(MCU_DFU) flash --debug 1 $(TARGET).hex - dfu-programmer $(MCU_DFU) reset - - -flip-ee: $(TARGET).hex $(TARGET).eep - $(COPY) $(TARGET).eep $(TARGET)eep.hex - batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM erase - batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program - batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 - $(REMOVE) $(TARGET)eep.hex - -dfu-ee: $(TARGET).hex $(TARGET).eep - dfu-programmer $(MCU_DFU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep - dfu-programmer $(MCU_DFU) reset - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -z $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list clean_binary end - -clean_binary: - $(REMOVE) $(TARGET).hex - -clean_list: - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - -doxygen: - @echo Generating Project Documentation... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff doxygen clean \ -clean_list clean_doxygen program dfu flip flip-ee dfu-ee \ -debug gdb-config +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# MCU name(s) +# Since the ATMEGA8U2 part is not directly supported by the current +# versions of either avrdude or dfu-programmer, we specify a dummy +# part; AT90USB82 which is close enough in memory size and organization +MCU = atmega8u2 +MCU_AVRDUDE = at90usb82 +MCU_DFU = at90usb82 + +# Specify the Arduino model using the assigned PID. This is used by Descriptors.c +# to set PID and product descriptor string +# Uno PID: +ARDUINO_MODEL_PID = 0x0001 +# Mega 2560 PID: +#ARDUINO_MODEL_PID = 0x0010 + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_CLOCK below, as it is sourced by +# F_CLOCK after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_CLOCK, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_CLOCK = $(F_CPU) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Arduino-usbserial + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../.. + + +# LUFA library compile-time options +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_FLASH_DESCRIPTORS +LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + $(LUFA_SRC_USBCLASS) \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Device.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/HostStandardReq.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Pipe.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBController.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/Events.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBInterrupt.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBTask.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/CDC.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/CDC.c + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=gnu99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_CLOCK=$(F_CLOCK)UL +CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) +CDEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += $(LUFA_OPTS) +CDEFS += -DAVR_RESET_LINE_PORT="PORTD" +CDEFS += -DAVR_RESET_LINE_DDR="DDRD" +CDEFS += -DAVR_RESET_LINE_MASK="(1 << 7)" +CDEFS += -DTX_RX_LED_PULSE_MS=3 +CDEFS += -DPING_PONG_LED_PULSE_MS=100 + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_CLOCK=$(F_CLOCK)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += $(LUFA_OPTS) + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +CFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkii + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FORCE = -F + +AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) +AVRDUDE_FLAGS += $(AVRDUDE_FORCE) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +#all: begin gccversion sizebefore build checkinvalidevents showliboptions showtarget sizeafter end +all: begin gccversion sizebefore build showliboptions showtarget sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym asm +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +asm: $(TARGET).s +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +#$(LUFA_PATH)/LUFA/LUFA_Events.lst: +# @make -C $(LUFA_PATH)/LUFA/ LUFA_Events.lst + +#checkinvalidevents: $(LUFA_PATH)/LUFA/LUFA_Events.lst +# @echo +# @echo Checking for invalid events... +# @$(shell) avr-nm $(OBJ) | sed -n -e 's/^.*EVENT_/EVENT_/p' | \ +# grep -F -v --file=$(LUFA_PATH)/LUFA/LUFA_Events.lst > InvalidEvents.tmp || true +# @sed -n -e 's/^/ WARNING - INVALID EVENT NAME: /p' InvalidEvents.tmp +# @if test -s InvalidEvents.tmp; then exit 1; fi + +showliboptions: + @echo + @echo ---- Compile Time Library Options ---- + @for i in $(LUFA_OPTS:-D%=%); do \ + echo $$i; \ + done + @echo -------------------------------------- + +showtarget: + @echo + @echo --------- Target Information --------- + @echo AVR Model: $(MCU) + @echo Board: $(BOARD) + @echo Clock: $(F_CPU)Hz CPU, $(F_CLOCK)Hz Master + @echo -------------------------------------- + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +flip: $(TARGET).hex + batchisp -hardware usb -device $(MCU_DFU) -operation erase f + batchisp -hardware usb -device $(MCU_DFU) -operation loadbuffer $(TARGET).hex program + batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 + +dfu: $(TARGET).hex + dfu-programmer $(MCU_DFU) erase + dfu-programmer $(MCU_DFU) flash --debug 1 $(TARGET).hex + dfu-programmer $(MCU_DFU) reset + + +flip-ee: $(TARGET).hex $(TARGET).eep + $(COPY) $(TARGET).eep $(TARGET)eep.hex + batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM erase + batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program + batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 + $(REMOVE) $(TARGET)eep.hex + +dfu-ee: $(TARGET).hex $(TARGET).eep + dfu-programmer $(MCU_DFU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep + dfu-programmer $(MCU_DFU) reset + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list clean_binary end + +clean_binary: + $(REMOVE) $(TARGET).hex + +clean_list: + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program dfu flip flip-ee dfu-ee \ +debug gdb-config diff --git a/hardware/arduino/avr/firmwares/wifishield/binary/wifi_dnld.hex b/hardware/arduino/avr/firmwares/wifishield/binary/wifi_dnld.hex index bf2c05cf68b..e099ccab096 100644 --- a/hardware/arduino/avr/firmwares/wifishield/binary/wifi_dnld.hex +++ b/hardware/arduino/avr/firmwares/wifishield/binary/wifi_dnld.hex @@ -1,10470 +1,10470 @@ -:0200000480007A -:10000000E08F100000000000000000000000000071 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:08200000481F0000800026309B -:10200800D40148D8E3B80001D553FE6A100030194E -:102018007508F1D9D202F5480040F01F0008F01FFA -:102028000008D503E06CF980EA1C0337F01F0005AF -:10203800D8020000800032008000259880002B68BC -:10204800800026D4EBCD40FC169518961492129B6E -:10205800580AE08A003B0B893008F0091800C520AF -:102068003009129A2FF9EA090708F4081800CFB1C5 -:102078001232E08900493002EDBB0001C26133032E -:10208800EDBB0000C2613004C0A85806C3806C09CB -:10209800B28C6C082FF88D082FF52FF40B8C580C88 -:1020A800CF515802E08A000F04975806C2406C09C5 -:1020B800B2836C082FF88D0820175807FE99FFF790 -:1020C8000404089CE3CD80FC3203EDBB0000CDC0C6 -:1020D8005802FE9AFFDA04975806C1706C09B28359 -:1020E8006C082FF88D0820175807FE99FFF70494FD -:1020F8003002CD5B069CF01F0007CDFBF01F0005EA -:10210800CCCB30091212CB9B069CF01F0002CECB21 -:1021180080002680EBCD40FC203DFACEFFD81497F6 -:102128007C037C1A10941892169E580BC4405809C8 -:102138005F1858A75F091268C34130063008FB686A -:10214800000B580EC430F4CC003AFAC9FFF5FC076E -:102158000D0A16985898F1DCE9082D0812F8149E13 -:10216800580ACF6112955806C0C10C970699089A6B -:102178000A9B049CF01F001A0E0C2FDDE3CD80FC97 -:102188005804C140EDB30001C1115802C230640ABD -:1021980032D9B48964082FF8850820143017CE7B0B -:1021A800580BCCC45C3E3016CCAB129532D83007F5 -:1021B8000AF8CDDB109A3308BA9B0699BA881A9B9D -:1021C800F01F00072FDDE3CD80FCFAC9FFF512955B -:1021D800CCBB32DCF01F0003CE1B00008000204C7B -:1021E80080002680D431201D189516971496178CD8 -:1021F800580CE08000B43004325132D033033092AE -:10220800E20C1800C1705805C6E06A09B28C6A0869 -:102218002FF88B082FF42FF70F8C580CCF21580567 -:10222800EBF91000F9B80100F3F81E00089C2FFD27 -:10223800D8322FF70F8A580ACF30E20A1800C500A3 -:10224800E00A1800F9BC0100F7B700FFF9BC00016B -:10225800EFFA0800C0482FF7A1BC0F8AE60A180059 -:10226800CFB0F4C80030E4081800E08B0063300BEE -:10227800F60B0028F40800182FF7F0CB00300F8A6F -:10228800F4C80030E4081800FE98FFF43738F00A64 -:102298001800C2C03648F00A1800C3403708F00AD0 -:1022A8001800C3E03788F00A1800C4503588F00ACF -:1022B8001800C4903758F00A1800C4803638F00A5D -:1022C8001800CAA16C08BA8830081899169ABA98E2 -:1022D8001A9B0A9C2FC6F01F00231804C9DB325C26 -:1022E8005805C941F01F0020C96B0D081899169AA6 -:1022F8000A9C49EB5808F00B1710F01F001A180435 -:10230800C8BB361916981AD930AA1ADC30196C0BC2 -:102318000A9C2FC6F01F00162FED1804C7DB3619CC -:10232800308A1AD916981ADA30096C0B310ACF1B81 -:10233800300BCADB169836191AD9310A1ADC30095B -:102348006C0BCE7B16983419CF8B361916981AD980 -:1023580030AA1ADC30096C0BCDCB1894C61B0000D0 -:102368008000204C80002680800034008000211CE2 -:10237800D401189BFACAFFFC300CF01F0002D802E7 -:10238800800021ECEBCD40E014951696A98CF01F47 -:1023980000095805C0A03007F01F0007EC070B0C18 -:1023A8002FF70E35FE9BFFFAF01F0004E3CD80E007 -:1023B80080002E7C80002F3080002D14EBCD40E073 -:1023C80014951696A98CF01F00095805C0A030076F -:1023D800EC07070C2FF7F01F00060E35FE9BFFFADF -:1023E800F01F0004E3CD80E080002D9C80002E20AB -:1023F80080002CC8EBCD4040204D49BCF8E80008CF -:10240800FAE90008F8EA0000498CFAEB0000304BC2 -:10241800F01F00171A9BFE7C2800F01F00163009D9 -:10242800FE7C2800129A129BF01F0013FE7C2800E5 -:10243800F01F0012302CF01F00121A96204DECE805 -:102448000008FAE90008ECEA0000E06CF980EA1CF0 -:102458000337FAEB0000F01F000B2FCD2FCDE3CD93 -:1024680080400000800034088000341880002C4030 -:1024780080002874800028B480002A2480002C70F2 -:1024880080002FF8EBCD40F8F01F0033F01F003329 -:102498004B3CF01F0034F01F00343018F00C1800CB -:1024A800C5204B2CF01F002FE06701004B0C3006B5 -:1024B800F01F002C4AF40E95C088E2675A4C0C179E -:1024C800E0470100EA0717B0E806000B0C9C0E9ADB -:1024D8000E06F01F0029E2465A4BFE98FFF0E0670F -:1024E80001004A6C3006F01F001F4A550E930E9AE1 -:1024F8004A3B0C9CF01F0023E80600093008EA0854 -:10250800070B138AF40B1800C1312FF82FF9103775 -:10251800FE9BFFF70E06E2465A4BE08B0019E26776 -:102528005A4C0C17E0470100E60717B0CE1BEC0821 -:1025380000081ADA494C1ADB1AD8F01F000A2FDDF6 -:10254800E3CF80F8491CF01F0007CAFB490CF01FB5 -:102558000005CF7B80002008800023FC80028E6C61 -:102568008000237880002FA480028E8480028E8CC5 -:1025780080003420800023C480028EAC0000000854 -:102588008000238C80028EC880028E7C80028EF4AC -:10259800EBCD4040303AE06B1B00EA1B00B7FE7CF5 -:1025A8000C00F01F001A30083019109B308AFE7C8E -:1025B8000C0031061AD6F01F001630083019109B8F -:1025C800129AFE7C0C00F01F0013300BFE7C0C00EE -:1025D800F01F0011FE7C0C00F01F00103009FE7C7B -:1025E8000C001AD9129B1AD91298129AF01F000CD3 -:1025F800301CF01F000C302BFE7C0C00F01F000A72 -:102608002FDDE3CD8040000080002B0C80002AB035 -:1026180080002AD280002AEA80002AF880002A6AEC -:1026280080002C8A80002B0248CD48D0E3B00001FE -:10263800D55348C048C10230C06248C2A505A1248C -:102648000230CFD348A048B10230C0623002300314 -:10265800A1220230CFE3488F000100008000320041 -:10266800000000080000000880028FC00000000879 -:10267800000001E88000248CD401189BFE7C18001F -:10268800F01F0002D802000080002742EBCD404036 -:10269800203D30083049FB680008BA383088500CB3 -:1026A8001696BAC8302BBAD9486CF01F00070C9A96 -:1026B8001A9BFE7C1800F01F00052FDDE3CD80403B -:1026C80080028F1C80002C40800027ACD401189B0E -:1026D800E06CE100F01F0002D802000080002694A0 -:1026E800D401F6081503A56B143BF9BE0810F00BCE -:1026F80017B0F9BE0B08F6091601F20A0039F20BF9 -:102708000D08109AF00B1603F6C80001E048FFFE0A -:10271800E08B00147818E8690000E418FFF7E01867 -:10272800FECF590EF9B9000010499919F1DAC00322 -:10273800F7E811089988D80ADA0A58ABC0F0E069B6 -:10274800270F7858EDB80001C051F1DBC00999781E -:102758005EFD5809C1002019CF5BE069270F785842 -:10276800EDB80001C04130D89978CEAB5809C030D7 -:102778002019CF6B5EFEE1B80000EDB80010C0E094 -:10278800D3033FF899387858D503300899189998A1 -:1027980099A8EA69610C99095EFC3FF8993878585C -:1027A800CF5BD703D421169714951896F01F002EE7 -:1027B8005807C2000FC93048F0091800E088001B0C -:1027C8003094E8091800E08B00160FD93078F0092A -:1027D8001800E08B00108E39E0680101F00919003B -:1027E800E08B0009EF3900083038F0091800E0885C -:1027F8000003DA2A0A9A6E0B0C9CF01F001C581C66 -:10280800CF900FC9E8091800C2906C182059F1E957 -:1028180010688D18EF3900086C1A0FD8A978F1E9FB -:1028280010E814488D1830288E39F0091900E0880E -:1028380000106C18ADB88D188EB920298DA96C18A8 -:10284800E018FFF08D183509300C8D09D8226C1866 -:102858005C79F1E910C88D18CF3B6C18B1B88D18A8 -:10286800CDAB00008000277E800026E8D401301818 -:10287800F739000DF0091800E0880005302E1C9C7F -:10288800D802E068008030199908300A7818F73BB8 -:10289800000D149EF1D9D00130F9F1DBD081F1DAC5 -:1028A800D0E1F1D9D20499181C9CD802EBCD408014 -:1028B8003018149E1297F00A18005FBAF00B18002F -:1028C8005FB91449C0B17818F1DBD021F1DED041ED -:1028D800F1D7D3089918E3CF8080302CE3CD8080DE -:1028E800D4017818189EEA18000F9918781CE21C71 -:1028F8000004C08030E8F00B1800E0880013302C8A -:10290800D8023038F00B1800FE9BFFFB7C1AF6C883 -:10291800FFF03019F20809495CD914699D19D802E9 -:102928007C19F6081510300CEA18FFF0E818FFFFBC -:1029380012689D18D802E0692710C0485809C0E0FD -:1029480020197848EDB80009CFA17818EA18000FC7 -:102958009918FC19010099095EFD5EFFEBCD40FC5A -:1029680030321893F73C000CE40C1800E08B000997 -:10297800F735000B3014E8051800E0880005302C06 -:10298800E3CD80FCF73E00083078F00E1800FE9882 -:10299800FFF83108F00E1800FE9BFFF37618F009D7 -:1029A8001601F4090009F2080D06ECCA0001E04A14 -:1029B80000FEFE9BFFE65806CE35FCC90008F80865 -:1029C8001601300AEC1C0001F5D8D001178EF5DC91 -:1029D800D021F7380009F5D5D061F5D9D084F73979 -:1029E800000AF5D6D108F5D8D208F5D9D308E80EEB -:1029F8001800C0F0C0B33028F00E1800C0D0E40EA4 -:102A08001800CBE187FAE3CF80FC87CAE3CF80FCCC -:102A180087DAE3CF80FC87EAE3CF80FC3018990897 -:102A28005EFCE0692710C0485809C0A02019784802 -:102A3800EDB80001CFA1F1DBC01099385EFD5EFF53 -:102A4800E0692710C0485809C0C020197848E21822 -:102A58000201E0480201CF817828300CB6085EFCFC -:102A68005EFFEBCD40E0FAC5FFF018976A166A0ED4 -:102A7800EDD6C003FDDEC001300CF9D6D003F9DE77 -:102A8800D0E1F9D6D103F9DED1E1F9DAD203F9DBE5 -:102A9800D2E1F9D8D303F9D9D3E18F1C6F58EDB837 -:102AA8000005CFD1E3CD80E0EBCD4040300E40268D -:102AB8002F8BFDD8D021FDD9D104FDDAD204FDD663 -:102AC800D306F80B092EE3CD80402F8BF5E91019BA -:102AD800F3E81029F80B0328F1D9D043F80B09289B -:102AE8005EFC2F8BF80B0328A1A8F80B09285EFCC5 -:102AF8007958EDB80000CFD15EFC7808F1DBD00240 -:102B080099085EFCEC5BBB9FE08B0018304B78A803 -:102B1800F1DBD00399A878A9F3DAD10399A9780849 -:102B2800A3A899087958EDB80007CFD178083019CB -:102B3800F1D9D00299085EFCE068C6BFEA18002DFA -:102B4800103BE088000CE0681200EA18007A103B9D -:102B5800F9BB0306F9BB0207CDBB305BCD9BC008B0 -:102B6800EBCD40C048E8E3B8000148E9300C7206F4 -:102B780048DE48E9FE770800720B580BC070721ADD -:102B8800300814AE2FF81638CFD3EE0C09262F894B -:102B98002FFC594CCF21E3CD80C0000080003200CB -:102BA8008000333C80002B6680028F20E068008321 -:102BB800FE790800F00C010CF20C032AF4C8FFC0DF -:102BC800F208032C580C5E0CF80812004859F0085B -:102BD800111FF20A0039721AF408032C5EFC000077 -:102BE80080028F20F8081605F0091508E029F00082 -:102BF800581BC150C0823018F00C094C936C93AC30 -:102C0800932C5EFD582BC110583BC0205EFF301836 -:102C1800F00C094C935C939C932C5EFDF60C094CCC -:102C2800935C93AC932C5EFD3018F00C094C936CBC -:102C3800939C932C5EFDD703D42118961694580BB9 -:102C4800C0F030050A970D9B0D8C2FF72FE6F01F6B -:102C5800000618450E34FE9BFFF80A9CD8221695EC -:102C6800CFDB000080002BEC3018F00C0948A59C45 -:102C7800A96CE02CF000F9480054F9480044991870 -:102C88005EFCFE6914007208F1DCD0C193085EFC9A -:102C9800D401580BC091F8CBFFFEFE7C28005C5B8A -:102CA800F01F0006D802F8CBFFFEFE7C28005C5B14 -:102CB800F01F0003D80200008000293E800028E8A9 -:102CC800EBCD408048E76E0CF1DCC008C0D0300B7B -:102CD800FE7C2800F01F000B6E08F0CCFFFF8F0C65 -:102CE800F1DCC008CF51F9DCC288300BF01F0006B8 -:102CF80030194868B089E3CD80800000000001E009 -:102D080080002A2A80002C98000001E4D401486839 -:102D1800300B700CF9DCC288F01F000430094848F9 -:102D2800B089D802000001E080002C98000001E47E -:102D3800EBCD40C0201D301B49366C0CF9DCC28835 -:102D4800F01F0012E06B00D7FE7C2800F01F001077 -:102D5800FAC7FFFEE06B00FFFE7C2800F01F000CA6 -:102D68000E9BFE7C2800F01F000B9A98EDB8000718 -:102D7800CF216C0C300BF9DCC288F01F00042FFD4A -:102D8800E3CD80C0000001E080002C9880002A2A52 -:102D980080002A48EBCD40C0201D49B6A96C8D0C97 -:102DA80049A730080F89F0091800C030F01F001833 -:102DB80030086C0CAE88F9DCC288301BF01F001597 -:102DC800E06B0082FE7C2800F01F00136C08F7D827 -:102DD800C008F1D8C10CFAC6FFFCF7E8109BFE7CCE -:102DE80028000CDBB18BF01F000C0DABFE7C28001B -:102DF800F01F00090DBBFE7C2800F01F00072FFD07 -:102E0800E3CF90C0000001E0000001E480002D380D -:102E180080002C9880002A2AEBCD40E049151896AE -:102E28000B893008F0091800C16148F70C9BFE7C3B -:102E38002800F01F000E6E08F0CCFFFF8F0CF7DCA7 -:102E4800C008C071F9DCC288F01F00093018AA88D0 -:102E5800E3CF90E048476E0CA98CF01F0006CE7BAC -:102E6800000001E4000001E080002A2A80002C987C -:102E780080002D9CEBCD40C0201D4A76A96C8D0C9E -:102E88004A6730080F89F0091800C030F01F002485 -:102E980030086C0CAE88F9DCC288301BF01F0021AA -:102EA800E06B00D2FE7C2800F01F001F6C08F7D8EA -:102EB800C008F1D8C10CFAC6FFFCF7E8109BFE7CED -:102EC80028000CDBB18BF01F00180DABFE7C28002E -:102ED800F01F00150DBBFE7C2800F01F0013E06BEF -:102EE80000FFFE7C2800F01F0010E06B00FFFE7C56 -:102EF8002800F01F000DE06B00FFFE7C2800F01F8B -:102F0800000AE06B00FFFE7C2800F01F00072FFD81 -:102F1800E3CF90C0000001E0000001E480002D38FC -:102F280080002C9880002A2AEBCD40C0201D4966DD -:102F380030090D88F2081800C1F14947E06B00FF1D -:102F4800FE7C2800F01F0012FACBFFFEFE7C280052 -:102F5800F01F00106E08F0CCFFFF8F0CF7DCC008E4 -:102F6800C071F9DCC288F01F000C3018AC881BBC9B -:102F78002FFDE3CD80C04857AC896E0CA98CF01F9B -:102F88000007CDDB000001E4000001E080002A2AF0 -:102F980080002A4880002C9880002E7CEBCD404091 -:102FA800201D3008FAC6FFFC301B0CE8300CF01F5F -:102FB800000EE06B00D7FE7C2800F01F000CE06BD1 -:102FC80000FFFE7C2800F01F00090C9BFE7C2800F7 -:102FD800F01F0007300B169CF01F00032FFDE3CFF6 -:102FE8009040000080002C9880002A2A80002A48FF -:102FF800EBCD40E03028FAC7FFF01896AE88109560 -:10300800C028AE880C9A0E9BFE7C2800F01F000892 -:10301800C0C10F882FF85C58EA081800FE98FFF323 -:103028004848B08CE3CF90E0E3CF80E0800029648B -:04303800000001E4AF -:10320000C0080000C0080000C0080000C00800009E -:10321000C0080000C0080000C0080000C00800008E -:10322000C0080000C0080000C0080000C00800007E -:10323000C0080000C0080000C0080000C00800006E -:10324000C0080000C00800000000000000000000EE -:10325000C0080000000000000000000000000000A6 -:10326000C008000000000000000000000000000096 -:10327000C008000000000000000000000000000086 -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:10330000C0080000300CF01F0012580CF80F171006 -:10331000D603301CF01F000E580CF80F1710D60300 -:10332000302CF01F000B580CF80F1710D603303C50 -:10333000F01F0007580CF80F1710D6030000010407 -:103340004000011280000120C000012E80002BB43B -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:10340000286E756C6C2900000200000000B71B00DC -:1034100008000001000100000F011101100113015B -:103420001061040000000000300000001061040082 -:103430003861040000000000020000002061040068 -:10344000306104000000000004000000306104004E -:1034500000000000000000000000000010610400F7 -:103460003C0000000000EEEEEEEE18F09FE518F0D4 -:103470009FE518F09FE518F09FE50000A0E118F027 -:103480009FE518F09FE544000000B4080000B40870 -:103490000000B4080000B408000000000000E408C8 -:1034A00000003C003C00000000090000000000009B -:1034B00000000FE11F00C0E3130080E3C00080E3C1 -:1034C00000F02FE11CF09FE53D0200EB5A0200EBFB -:1034D0008D0200EB01008FE210FF2FE141F0DEFBD7 -:1034E00001F0DCFD3C0078000000FEE700005C001D -:1034F00000007847C046010000EA7847C046170040 -:1035000000EA8C119FE5002091E500300FE1841165 -:103510009FE5FD20A1E880019FE580219FE5012036 -:1035200042E00D0040E03C00B4000000020050E129 -:10353000280000AA68019FE50D0050E1020000BAD2 -:10354000042010E4042081E4FAFFFFEA58119FE50B -:1035500058019FE5000081E53C119FE550019FE582 -:10356000000081E51EFF2FE13C00F0000000481143 -:103570009FE5000091E524119FE5000081E52C11F5 -:103580009FE538019FE5000081E51EFF2FE17402F1 -:1035900000EB10019FE528119FE5042091E4042031 -:1035A00000E404219FE5020051E13C002C010000F1 -:1035B000FAFFFF1AF0109FE5FD20B1E803F02FE1BC -:1035C000E0109FE5002081E5E8109FE5F4209FE5ED -:1035D000002081E5021080E2000020E0010040E2CE -:1035E00011FF2FE101008FE210FF2FE13C00680185 -:1035F000000001F09CF87847000001008FE210FF06 -:103600002FE101F094F87847000003002DE9001045 -:103610000FE1001080E5B8109FE5041080E5001070 -:10362000A0E1100080E2FC1FA0E80020A0E13C0027 -:10363000A40100000130A0E10300BDE8080083E51B -:103640000C1083E5D300A0E300F021E10060A2E8C4 -:1036500000104FE1041082E4D200A0E300F021E169 -:103660000060A2E800104FE1041082E4D100A0E362 -:103670003C00E001000000F021E1007FA2E8001022 -:103680004FE1041082E4D700A0E300F021E10060E4 -:10369000A2E800104FE1041082E4DB00A0E300F098 -:1036A00021E10060A2E800104FE1001082E5000077 -:1036B00093E53C001C02000000F02FE11EFF2FE10B -:1036C000200000000403000020EE0100D8030000E9 -:1036D0000000000018F09FE5100100000803000042 -:1036E000EEEEEEEE2403000020020000B0B5041C54 -:1036F000631C0B4D3C005802000001D16C6910E0C6 -:1037000000F06CFB0948FFF70CFFEC60084A5168B9 -:1037100050688842FCD00220287001218A2001F0E4 -:1037200012F8201CB0BD3000070051020000000359 -:103730000700B0B5051C3C0094020000002400F016 -:1037400050FB1448FFF7F0FE13491448C1600121F3 -:10375000134A490391601349CA7808239A43CA70EF -:10376000CA7804231A43CA706B1C0DD00E4B5A68DA -:1037700059689142FCD0BE213C00D0020000197370 -:10378000197A112291431972197AC907FCD40221BE -:103790000170FFF7D0FE201CB0BD91020000FFFFBA -:1037A000FF003000070000100700000007000003C2 -:1037B000070000000000000000003C000C030000B7 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F0000000000000000000000000003C00480342 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:1038300000000000000000000000000000003C004C -:1038400084030000000000000000000000000000F1 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880003C00C00300000000000000000000000039 -:1038900000000000000000000000000000000047E1 -:1038A000084710471847204728473047384710B582 -:1038B000041C101C00F023F903C410BC08BC1847FA -:1038C00000003C00FC03000010B4042A0ED3031CCB -:1038D0000B439B070AD108C810C9A34202D1043A7E -:1038E000042AF8D2A34201D004380439002A02D1B4 -:1038F000002010BC7047D30701D5013205E00378E2 -:103900000C7801313C00380400000130A34207D19B -:1039100003780C7801310130A34201D1023AF1D190 -:10392000181BE9E70000784700000020A0E304002E -:1039300051E30800003A03C010E20D00000A04C081 -:103940006CE202005CE33C00740400000120C0E46F -:103950000120C0A40120C0C40C1041E0060000EA10 -:1039600081CFB0E10120C0240120C0240120C04447 -:103970001EFF2FE1784700000020A0E300402DE962 -:103980000230A0E102C0A0E13C00B004000002E06F -:10399000A0E1201051E20C50A0280C50A0282010CB -:1039A0005122FBFFFF2A011EB0E10C50A0280C00A1 -:1039B000A0480040BDE80111B0E1042080241EFFB2 -:1039C0002F010120C0440120C0443C00EC04000051 -:1039D000400411E30120C0141EFF2FE178470000CE -:1039E000030052E33E00009A03C010E20800000A00 -:1039F0000130D1E402005CE30C2082E001C0D194EC -:103A00000130C0E40130D134042042E23C002805FA -:103A1000000001C0C0940130C034033011E21E0028 -:103A2000000A042052E22F00003A03C031E70200EE -:103A300053E30800000A0F00008A2C34A0E104C000 -:103A4000B1E5042052E20C3C83E1043080E43C0008 -:103A500064050000F9FFFF2A011081E2230000EA5B -:103A60002C38A0E104C0B1E5042052E20C3883E117 -:103A7000043080E4F9FFFF2A021081E21B0000EA13 -:103A80002C3CA0E104C0B1E5042052E20C3483E1F7 -:103A90003C00A0050000043080E4F9FFFF2A031079 -:103AA00081E2130000EA7847000010402DE9202051 -:103AB00052E20500003A1850B1281850A0281850BA -:103AC000B1281850A02820205222F9FFFF2A02CE48 -:103AD000B0E13C00DC0500001850B1281850A028C7 -:103AE0001800B1481800A0481040BDE802CFB0E16E -:103AF00004309124043080241EFF2F01822FB0E176 -:103B00000120D1440130D12401C0D1240120C0447E -:103B10000130C0243C001806000001C0C0241EFF74 -:103B20002FE178470000FF3001E20210A0E10324FA -:103B300083E1022882E188FFFFEA784700008024C1 -:103B400010E200006042413032E000106122A1C169 -:103B500070E02000003A3C005406000021C470E0F0 -:103B60000F00003A0004A0E1FF2482E321C270E0CC -:103B70001700003A21C470E00900003A0004A0E1F7 -:103B8000FF2882E321C470E00004A021FF2C8223DF -:103B900021C270E00E00003A3C009006000000C018 -:103BA00070E28300002A2004A021A1C370E08013EA -:103BB00041200220A2E021C370E000134120022036 -:103BC000A2E0A1C270E0801241200220A2E021C246 -:103BD00070E0001241200220A2E03C00CC06000070 -:103BE000A1C170E0801141200220A2E021C170E05B -:103BF000001141200220A2E0A1C070E0801041200D -:103C00000220A2E001C070E0001041200220B2E0DA -:103C1000E5FFFF2AC30F32E0A30F80E03C00080756 -:103C20000000001061221EFF2FE1784700000020F5 -:103C3000A0E3A1C170E02000003A21C470E00F00B1 -:103C4000003A0004A0E1FF2482E321C270E01700E3 -:103C5000003A21C470E00900003A0004A0E13C00F1 -:103C600044070000FF2882E321C470E00004A02183 -:103C7000FF2C822321C270E00E00003A00C070E2E7 -:103C80005000002A2004A021A1C370E0801341202D -:103C90000220A2E021C370E0001341200220A2E034 -:103CA0003C0080070000A1C270E080124120022089 -:103CB000A2E021C270E0001241200220A2E0A1C1D6 -:103CC00070E0801141200220A2E021C170E00011CB -:103CD00041200220A2E0A1C070E08010412002201B -:103CE000A2E03C00BC07000001C070E000104120D1 -:103CF0000220B2E0E5FFFF2A0200A0E11EFF2FE153 -:103D0000784700000A1040E2200140E0200280E0F5 -:103D1000200480E0200880E0A001A0E1002180E0F4 -:103D2000821051E03C00F8070000010080520A10A8 -:103D300081421EFF2FE130B4441C810708D0017876 -:103D40000130002902D1001B30BC70478107F6D139 -:103D50000B4AD50102C88B1A8B432B40FAD0001BAB -:103D60000A0601D103383C0034080000EFE70A04DA -:103D7000120E01D10238EAE70902090EE7D1013833 -:103D8000E5E7000001010101F0B4031C041C0C4331 -:103D9000A4070CD1104DEF0102E00431043A10C326 -:103DA000042A04D30C68661B3C0070080000A6437C -:103DB0003E40F5D0002A07D00C7801311C70013349 -:103DC000002C03D0013AF7D1F0BC7047012AFBD98F -:103DD000511E00221A7001330139FBD1F4E70101B1 -:103DE0000101784700000200A0E33C00AC0800009D -:103DF0000210A0E32EFEFFEA1F402DE900000FE1B4 -:103E0000C00080E300F02FE18100A0E30210A0E3F6 -:103E100001208FE212FF2FE100F0E6FC784700005E -:103E20001F40BDE8FEFFFFEA1F502DE93C00E808F7 -:103E3000000001008FE210FF2FE100F040FB784707 -:103E400000001F50BDE804F05EE21F502DE90100A4 -:103E50008FE210FF2FE100F018FB784700001F50A1 -:103E6000BDE804F05EE200BD01B500A000473C00E3 -:103E70002409000000300FE1C030C3E303F021E16A -:103E800001008FE210FF2FE101BD01B500A0004746 -:103E900000300FE1C03083E303F021E101008FE245 -:103EA00010FF2FE101BD000018009FE5041090E411 -:103EB0003C0060090000000051E30200000A0420F9 -:103EC00090E4002081E5F9FFFFEA0EF0A0E17C0913 -:103ED0000000000000004400000044000000D8037F -:103EE0000000D8030000D80300000000000000001C -:103EF00000003C009C090000440000004400000059 -:103F0000440000000080010000800100108E0100CC -:103F1000108E010088F8010001000000001004006C -:103F2000C433040000000400000000000E50A0E1B3 -:103F300058409FE53C00D8090000040094E40100CB -:103F400050E305F0A001041094E4042094E403007D -:103F500000EB040094E4041094E4070000EBF5FF88 -:103F6000FFEA010050E10EF0A001020051E104302F -:103F70009014043081143C00140A0000FBFFFF1A67 -:103F80000EF0A0E114209FE5002092E5010050E131 -:103F900004208014FCFFFF1A0EF0A0E1800900004D -:103FA000CC0900000008000020E60100130000001A -:103FB0005356435F000400003C00500A000020EE0E -:103FC0000100120000004952515F0002000020F27F -:103FD0000100110000004649515F8000000020F4FC -:103FE0000100170000004142545F00000000A0F4EF -:103FF00001001B000000554E445F3C008C0A00008D -:1040000000000000A0F401001F0000005553525FA3 -:10401000010000000E50A0E100600FE18C409FE520 -:10402000041094E4010051E30900000A040094E440 -:10403000011080E00310C1E3042094E43C00C80AAE -:104040000000C02082E302F02FE104D041E204200E -:1040500094E4130000EBF2FFFFEA06F02FE105F015 -:10406000A0E10E50A0E100600FE144409FE5041084 -:1040700094E4010051E30800000A040094E43C00C9 -:10408000040B0000011080E00310C1E3042094E45D -:10409000C02082E302F02FE104D041E2042094E446 -:1040A000F3FFFFEA06F02FE105F0A0E1010050E187 -:1040B00004208014FCFFFF1A0EF0A0E13C0A00006F -:1040C0003C00400B00000160C046C046C04670473F -:1040D0000000101E10EE020011E3FCFFFF1A100E8C -:1040E00001EE101E10EE020011E3FCFFFF1A1EFF8E -:1040F0002FE1101E10EE010011E30300000A101E54 -:1041000011EE3C007C0B0000001080E50100A0E3F4 -:104110001EFF2FE1000020E01EFF2FE18D46974695 -:104120007847C04678FDFFEA10B5041C032801D982 -:1041300000F0ACFB0C484068002800D003240B487A -:10414000016809483C00B80B00001230002905D076 -:1041500006216143405CC300181804E00621614356 -:10416000405C142358430A300006000E10BDD47A78 -:104170000100A869010080B5094A0949032000F03F -:10418000F2F9084908203C00F40B00000860486080 -:1041900007491D2001F0B2FC06491E2001F0AEFCCB -:1041A00080BD0000006C01003127000000100700F6 -:1041B0002925000031250000054980B508208860C8 -:1041C0001D2001F0BFFC1E203C00300C000001F05F -:1041D000BCFC80BD000000100700021C081CD12A96 -:1041E00080B501D105F019FC80BD034980B50020E0 -:1041F0000880052005F0D5FB80BDB074010080B5B6 -:10420000542801D106F0CDF880BD3C006C0C0000B4 -:10421000B0B5104D021C0124012A0D48296806D0B2 -:10422000C42A03D16A68002A05D0AC60B0BD0EF084 -:1042300089FB6C6008E00022AA606C600EF082FBD3 -:104240000021042012F0C8FC06F0D8F83C00A80CAD -:104250000000B0BD0000C4600100BC740100054A4C -:104260005169081A116909681031814201D85061F9 -:104270007047002070478C6E010001494968401A60 -:1042800070478C6E010001484069704700003C0097 -:10429000E40C00008C6E0100024A5169081850615C -:1042A000704700008C6E01000E490F4810B51922AE -:1042B000920141608918C1600B4900220C310160F4 -:1042C0000A49826009680123DB03C918084C41616F -:1042D0003C00200D00002168002902D0074901613F -:1042E00001E000F00CF8226010BD44DC01008C6E8F -:1042F0000100C809000034580100C4090000014849 -:10430000024908617047C80900008C6E0100082846 -:1043100005D23C005C0D0000034B8000195002499F -:1043200020310A5070470000646D010070B5061C12 -:104330000D480D1C0068141C002803D1201C00F03F -:1043400009FC70BD280601D500F022FE221C291CA4 -:10435000301C08F03C00980D0000DDFD011C0348F6 -:1043600054304369321CFFF71BFB70BD0000506DD9 -:104370000100F8B5061C0D481F1C0068151C0C1C1C -:10438000002802D1281C00F0E8FB200601D500F02F -:1043900002FE2A1C211C3C00D40D0000301C08F039 -:1043A000BDFD011C0348543043693A1CFFF7FBFA7A -:1043B000F8BD0000506D0100F8B5F1284ED12A4833 -:1043C00069468269FFF7EEFA274900265439C86822 -:1043D0008B68C2000130D5183C00100E0000072881 -:1043E000C86000D1CE6022486C680068002803D005 -:1043F0000021201C08F03BFB6E6025682089A9780D -:104400000239401AE978401A2081A8782818023821 -:1044100020606E782878082817D23C004C0E0000E7 -:10442000300607D5271C201C00F07AFC041C381C21 -:1044300000F09CFB28780F49403980000A58002A78 -:1044400004D0311C201CFFF7B3FA08E0052100E07E -:104450000421062000F010FA201C00F03C00880E19 -:10446000000087FB300601D500F0A1FDF8BD012159 -:10447000062000F004FAF9E70000A46D0100CC5C0E -:104480000100F8B51A4D194F01245435291C032099 -:104490007C60174B184A05F0F4FB002802D03C0062 -:1044A000C40E0000002038601FE03C600721281C7B -:1044B000EA69FFF783FA382000F080FC0024B86036 -:1044C000B868E60035186846022100F075FB2860E0 -:1044D000281C00F0A5FDB868815906485430026ACE -:1044E0003C00000F0000FFF76CFA0134072CEADBF8 -:1044F0000020F8603861F8BD0000506D0100819A1D -:104500000000619A0000054880B50068002805D0C9 -:1045100003485430426A0021FFF753FA80BD506DC2 -:1045200001003C003C0F00007047000070B50A4ECF -:10453000094D084C083EA169002907D03068416048 -:10454000007B81006958FFF73EFAF4E70349022037 -:10455000087070BD00100700E07E01000002070037 -:1045600070B50A4E3C00780F0000094D084C083E1B -:10457000E169002907D070684160007B81006958BB -:10458000FFF724FAF4E703490220087070BD001019 -:104590000700E07E010000020700B0B5094D041CD1 -:1045A000281C202240303C00B40F00000549FFF7D2 -:1045B0009FFAE068E86020692861A06AA8626068E4 -:1045C0006860B0BD7052010000100700F8B500240B -:1045D0000023202801DB012407E0084E8000355825 -:1045E000074FBD4200D02B1C3C00F00F00003150A3 -:1045F0001360002C03D0211C822000F052F9201CF3 -:10460000F8BDE07E010075750000B0B50B4D041CCF -:10461000286800280FD0201C12F0B7FD00280AD00F -:10462000217A287A0A070007000F3C002C100000AE -:10463000120F9042297201D00120B0BD0020B0BD00 -:1046400070780100F0B5424E051C306885B0002836 -:1046500063D000240020002D06D06978182903D1EA -:10466000E979012900D10120002845D03C006810DB -:1046700000000020B07281004A19937A5906890F10 -:10468000DB0604D5B37A01278F403B43B372D27A5D -:1046900013091207120F934205D301228A401443D3 -:1046A00001AA8900505001300428E4DBB07A3C00B4 -:1046B000A4100000204001070DD5410709D5C1070E -:1046C00005D5810701D5002405E0029902E0019992 -:1046D00000E003990491410709D5C10705D5810779 -:1046E00001D5002403E0029900E001990391C1077C -:1046F0003C00E010000005D5810701D5002401E051 -:1047000002990191800701D5002422E00F2C20D1CD -:10471000706800280BD0049A02AB00920ACB019A71 -:10472000281C0BF08AFB0020706010E017E0307A44 -:10473000297A3C001C11000000070907090F000F2F -:10474000884207D0049A02AB00920ACB019A281C37 -:104750000BF076FB287A307201200F2C00D000205D -:1047600005B0F0BD0120FBE7707801000D4A70B57F -:10477000116800203C005811000000290ED0117A69 -:1047800009060BD5537A947A032101252A1C8A4005 -:104790001E1C164003D0224001D1012070BDFF3104 -:1047A00009060916F2D570BD00007078010010B539 -:1047B000084C206800283C009411000004D0606878 -:1047C000002801D10BF0C0FB00200021002207C40B -:1047D0000C3C0120606010BD70780100014901208F -:1047E0000860704770780100F8B50E4D041C002079 -:1047F0006872201C12F0DEFC3C00D0110000002882 -:1048000012D00020032101220F1A161C237ABE4069 -:10481000334004D06B7A161C864033436B720130F0 -:104820000006000E0328EFD9F8BD70780100920051 -:1048300051188A7A1207120F02703C000C12000005 -:10484000CA7A1207120F4270CA7A12098270097B63 -:1048500081807047034A0F21527A0120914300D092 -:10486000002070477078010040070549400F054A55 -:104870000956527A01200A4000D100203C0048121B -:104880000000704700005E46010070780100124A87 -:1048900070B5537A947AFF20032101252A1C8A409F -:1048A0001E1C164014D0224012D10806000E07D05C -:1048B000012807D0022807D0032807D107203C0091 -:1048C0008412000070BD032070BD012070BD052062 -:1048D00070BDFF2070BDFF3109060916E1D570BD1E -:1048E00070780100F8B5041C13480D1C816800297C -:1048F00005D0017B002901D104734573F8BD0F4E2B -:104900003C00C0120000311C20318A7900AB1A70C3 -:10491000C97959704268002A07D020022843011C37 -:104920000020FFF77EF8002804D12A1C211C00205B -:1049300011F00FF800AB1888F084E2E70000885A05 -:1049400001003C00FC1200000010070080B50121AE -:104950008120FFF7CDFF80BD0149012088607047AD -:10496000885A0100054980B500208860087B00282E -:1049700002D0497BFFF7BCFF80BD0000885A0100D0 -:10498000024A011C3C003813000050685160704717 -:104990000000885A010010B50C1C07F064FA04618D -:1049A000002010BD0000FFB50E1C1F1C382081B078 -:1049B00000F03DFA1D49041C4869002801D14C61F2 -:1049C00000E0046030013C0074130000009000041B -:1049D000000C00F015FA051C0099FFF78BF8002079 -:1049E000731E04E001014A1910326A5001309842E6 -:1049F000F8D300012D503821201CFFF77BF8A5606B -:104A00006560E6850C2060863C00B0130000AF2096 -:104A10008001E0610E20E086002020600198E060C7 -:104A2000386860610399044808600448386005B03C -:104A30000020F0BD0000FC5A0100DD150100FD164C -:104A40000100021C081CF02A80B53C00EC13000099 -:104A500004D0F12A07D106F009FB80BD07F00CFA5B -:104A60000DF0A8FA80BD01210220FFF74DFF80BDA7 -:104A70000149002048617047FC5A0100002802D01B -:104A8000002900D0C1607047F8B5171C3C002814FD -:104A900000000E1C051C1C1C1C3007F0C8F8016926 -:104AA000426980688919891A814206D2231C3A1CFE -:104AB000311C281C00F005F8F8BD0020386020608B -:104AC000FAE7FFB585B0059801270E1C1C303C00A5 -:104AD0006414000007F0AEF8041C808804300390D2 -:104AE0002C48049080790290A069B04217D2351A00 -:104AF00011E00398FFF716FC002806D101218E2053 -:104B0000FFF708FF0025002705E02168016020600D -:104B10003C00A0140000A0690130A061013DEBD26F -:104B2000002F35D0A069801BA06120698019206109 -:104B30006169401AE168884203D907218E20FFF796 -:104B4000ECFE25682F1C701E019500E03F680138BF -:104B5000FCD23C00DC140000386820600298049904 -:104B600088712E682C60321D0092291C2031012290 -:104B7000281D059B08F07AFCBD4201D0351CF0E7EA -:104B800000203861019807990430086008980437BC -:104B9000076009B03C0018150000F0BD02980499A8 -:104BA0008871F9E700002010070038B5041C151CB7 -:104BB00000200C6009E0E268201C0092A38A2168B2 -:104BC000A26908F056FC201CE468002CF3D1286090 -:104BD00038BD80B50CE03C0054150000C2688A4224 -:104BE00008D10021C160002803D106218E20FFF7E3 -:104BF0009DFE80BD101C0028F7D0EFE710B5041C07 -:104C00000CD0A069002806D12069002803D006F046 -:104C1000F7FD00202061201C3C009015000006F0EC -:104C2000F2FD10BD000010B5002809D0C46803E0F3 -:104C3000FFF7E7FF201CF9E7002CF9D1FFF7E1FFB0 -:104C400010BD011C002004E00A89C9681018000486 -:104C5000000C0029F8D1704700003C00CC15000082 -:104C600000E0081CC1680029FBD17047F8B5061C9C -:104C70000C1C1C2000F068FA051C002E01D1002C31 -:104C800002D1301C012103E0201C00F05DFA00215C -:104C9000002200920A1C011C231C281C3C00081640 -:104CA000000008F0F2FB281CF8BDB0B503329208F2 -:104CB00092001404240C09191D1CC9180904090CBC -:104CC000FFF7D7FF018902681219091B491B02600F -:104CD0000181B0BD0000F8B50A4CA021201C3C00A9 -:104CE00044160000FEF72AFF0020261CA036074DC0 -:104CF00007E00C21414349190EC9271D0EC7203476 -:104D00000130A642F5D1F8BDD05C0100C83F0100DA -:104D1000F7B5C468061C0025002C82B023D020897A -:104D20003C0080160000904220D3E168871A019170 -:104D30000021E16003990020FFF7A1FF051C2089F5 -:104D4000C01B20812A680399301C00F016F82089C6 -:104D5000C01920810199201CFFF7B1FE211C281CDD -:104D6000FFF73C00BC160000ADFE291C301CFFF70D -:104D7000A9FE0120002D00D1002005B0F0BD0000EB -:104D8000F7B5041C0E1C002001E0201C0C1CE1687F -:104D90000029FAD12789B7420AD3B81B0004000CB6 -:104DA000208121683C00F816000009180298321C86 -:104DB000FEF7FBFEFEBDF11B0D042D0C002819D0E3 -:104DC0000189A94216D3491B0904090C0181006815 -:104DD000411802982A1CFEF7E8FE21680298721B0F -:104DE0004019FEF7E2FE3C00341700002089C01B8A -:104DF00020812068C0192060DFE703218E20FFF7A3 -:104E0000ADFDDAE7F8B5041C002613E02189002087 -:104E1000FFF73EFF051C228921680068FEF7C8FEE7 -:104E2000002E01D12E1C03E03C0070170000291C4D -:104E3000381CFFF750FEE4682F1C002CE9D1301C11 -:104E4000F8BDB0B5041C0089401A050420682D0C7B -:104E50004018291CFFF71FFF2189491B2181E168A8 -:104E6000C160E060B0BD10B503303C00AC1700007D -:104E7000094A810810683D24084B6401890009181B -:104E80001B19994201D8116010BD0F218020FFF736 -:104E90006BFD002010BD0000B4CF010014C801005C -:104EA00010B511F061FF041C03D10D213C00E8177F -:104EB00000008020FFF75BFD201C10BD0000B0B596 -:104EC000011F0B680D480022834204D001321030CC -:104ED000032AF9D301E0032A06D30924211C8020E8 -:104EE000FFF745FD201CB0BD054B00249A793C001E -:104EF0002418000085680D6081609A71F5E7000054 -:104F00002057010020100700B0B50021104A0023EF -:104F1000D468844204D201331032032BF8D301E069 -:104F2000032B01D304210EE00A4CA37990680028DA -:104F30003C006018000002D1A371032106E005685F -:104F40009560A371002901D104C0B0BD8020FFF796 -:104F500014FD0020B0BD2057010020100700A03034 -:104F6000008A4007400F08280FD201A31B5C5B009A -:104F70009F443C009C18000005030305070709092E -:104F800001207047002070470220704703207047BF -:104F900004207047B0B5104D6869002807D00E494D -:104FA00000222C3103C90143032006F0CFFF0B4C34 -:104FB000002203CC3C00D8180000083C0143032029 -:104FC00006F0AFFF03CC084307494A6802434A6032 -:104FD0008A681043886001206861B0BD0000647376 -:104FE0000100B058010010000700B0B50C1C0FF014 -:104FF000A8FA054DE86A3C0014190000002806D103 -:10500000002C04D0201C0FF0B7FD01202870B0BD8B -:10501000F46E0100054980B5886A002804DA002092 -:10502000886201210DF042FD80BD0000AC7E0100D0 -:10503000F8B51E4D041C00203C00501900006862A9 -:10504000A8701C480078C00722D5B82003591A4818 -:1050500000780E2809D10A1C803206D0184E0D2087 -:10506000325C8A4201DD0138FAD1591E0B061B0E53 -:10507000AB70AB620E280BD208E03C008C1900002C -:105080006218B032127B824202D8581AA86202E03B -:1050900001390029F4DA0EF035F9009000AB1878E8 -:1050A0005978814200D95878ED30E8700121201CF0 -:1050B0000DF002FDF8BD0000AC7E01003C00C819F7 -:1050C00000001D75010011670100C75201000E4963 -:1050D00010B508698B68C200D4186268002A0FD125 -:1050E00001300861072801D100200861201C00F070 -:1050F00024F8054821685430026AFEF7ECFC3C00B5 -:10510000041A000010BD06210620FFF74BFC10BD5D -:10511000506D010008490979C907084A08D400E020 -:10512000081CC1680029FBD101890431018100E01C -:105130000020D0627047000060800700046C01000E -:105140003C00401A000010B5041C19218901002000 -:10515000FFF7C5FD011C60602068FFF7E0FC606898 -:1051600021680830086010BD00000A2801DA042018 -:1051700004E0502801DA052000E00720044A1178F5 -:1051800038233C007C1A0000C000184099430843B3 -:105190001070704788000700B0B5051C07484068CC -:1051A00008E00169A94204D1446805F0C7FD201C4C -:1051B00000E040680028F4D1B0BD0000587501003F -:1051C000F8B500253C00B81A000006F084FD114F28 -:1051D000041CBE792068002807D1A0880430FFF79E -:1051E000F2F8002806D101210FE001682160A169D1 -:1051F0000139A16110C0051C20690130206161697D -:10520000401AE16888423C00F41A000003D90721E3 -:105210008E20FFF7D3FBBE71281CF8BD20100700BD -:10522000B0B509F0BBFF2F4C0028207403D001213A -:1052300001200AF071FC2B4D1435286800284DD050 -:1052400001210F2011F082FD3C00301B0000288955 -:1052500008F0FBFF011C01220F2011F040FDE07857 -:105260000125022836D10AF0C6F800280AD00BF032 -:1052700092FB1E490968401811F05FF8002801D11F -:1052800002202FE0E078022824D13C006C1B0000B3 -:1052900060702570606801281CD015481038817B2B -:1052A000002904D185730F20134910F001FC08F088 -:1052B0004FFE002807D00E4801219838006901F000 -:1052C000B7FD002805D001200EF00CFD3C00A81B06 -:1052D000000001200EF01DFCB0BD05F0DCFEB0BDED -:1052E000E078002801D12570F7E7032000E00420D2 -:1052F0000DF08DFAB0BD846601006C570100E90322 -:10530000010070B5041C002100200A4D00E03C00A3 -:10531000E41B00000131CB005A191679012E02D08E -:105320005279A24202D00B29F4D370BD0B29FCD2D2 -:10533000C80001215A192858117170BD3858010050 -:10534000054880B5007F2423044958434018006A6B -:105350003C00201C0000FEF7DAFB80BD0000D47981 -:1053600001009446010080B504F037FF002011F0E1 -:1053700084FC002080BDB0B5054C051C206BE16AA3 -:1053800002F0E3FD291CA06A02F011FBB0BDA46C81 -:1053900001003C005C1C0000B0B5031C081C141C80 -:1053A000002B0C4D09D06969890001310A04120CE7 -:1053B0002280291CFEF73EFC0AE0011C281C2288E2 -:1053C000FEF738FC2088012802D98008013868617E -:1053D0000120B0BD3C00981C0000206E0100F1B51A -:1053E00000980026C168086809891C2934D3C1883F -:1053F000FF23013399422FD10188C91A2CD141884A -:10540000082929D10179062926D14179042923D1F6 -:1054100000250024071C3C00D41C000018370BE0BA -:10542000A000411804310422381CFEF78BFB002831 -:1054300001D1012504E001340A494869A042EFD8AE -:105440000849087800280AD0012801D0022806D18E -:10545000002D04D10098C0683C00101D0000FFF72B -:1054600042FC0126301CF8BD0000206E01000148FE -:10547000406870470000206E01000249486001202A -:10548000486170470000206E010070B5041C0126C1 -:1054900003F0EFFA251C103500283C004C1D0000DD -:1054A00004D00020207703F0F1FB07E003F038FD83 -:1054B000002809D00120207703F0CEFC011C062231 -:1054C000281CFEF7C3FB02E0022020770026301CD8 -:1054D00070BD00000348807AC00703493C00881D66 -:1054E0000000C00F88627047000040900700A46C65 -:1054F00001000149012088627047A46C0100064840 -:10550000807AC107064AC90F91622021800700D422 -:105510000021A032117070470000409007003C004D -:10552000C41D0000A46C0100074A1268074B9B6968 -:105530001A4001D0012200E000220A600121002A65 -:1055400000D000210160704710000700A46C01002A -:10555000012202600A607047B0B50D1C011C583171 -:105560003C00001E0000041C0622281DFEF777FBED -:10557000211C5E310622281C0A30FEF770FB211C1C -:1055800064310622281C1030FEF769FBB0BDFEB561 -:1055900000251D72171C0E1CB26D0021921950328D -:1055A000D27A3C003C1E00001C1C5A720078321C4F -:1055B0008032C007C017013001900898029200287D -:1055C00001D1307F2BE037480068002800DD011C46 -:1055D0000198002802D00898012810D1029A906BF7 -:1055E000002806D03C00781E0000884201D9451AE8 -:1055F000013D7019B03003E0B56D013D70195030B8 -:10560000007B0FE0029A106A002807D0884201D977 -:10561000451A013D7019A030007903E0BD69013DD4 -:105620007819007FA0723C00B41E00000EF00CF848 -:105630000E2811D1A07A08F067FF00280CD07868F6 -:10564000002805D11B480025007808F04BFF02E038 -:10565000451E7819007AA072029A5069002817D066 -:105660000898012814D0A07A3C00F01E000008F031 -:105670004EFF00280FD00198002807D0022020728A -:10568000706C80194030C079607204E07D68013D23 -:105690007819007AA072029AA07A916908F051FFF5 -:1056A0002060029A607A916908F03C002C1F00008B -:1056B0004BFF6060A07AE0722573FEBDD47E0100CE -:1056C000905701000006000E002A8CB501D08A22F6 -:1056D00000E0882200AB1A800CF0C2F80190684606 -:1056E0000BF0BCFA8CBD0000011C08483C00681F90 -:1056F000000080B50068002809D049680220002910 -:1057000000D101200106090E002006F0D8FF80BD5F -:105710000000206701001CB50190041C443001AA60 -:10572000694611F0B8FD00280BD0A06900213C00AB -:10573000A41F0000C207D20F0220FFF7C9FF0021FB -:10574000201C0FF0D9FE1CBD04219820FFF772F930 -:10575000F9E700008CB500AB84211980054B021CD1 -:10576000181C998A0CF08EF8019068460BF07CFAB0 -:105770003C00E01F00008CBD0000707C0100704701 -:105780000000064980B5C96814234031897A044A6B -:105790005943891880000858FEF7E9F980BD707CEC -:1057A00001005447010080B50020FFF7D6FF80BDFF -:1057B00000003C001C20000080B512481149808A7E -:1057C0000A8B00210028C2B00CD1012A05D0022A80 -:1057D00015D000AB5A800E2207E0022200AB5A809F -:1057E000998004E000AB5A800D2200AB9A8000AB98 -:1057F0001880FF203C00582000009871D97168463D -:1058000000F0D1F942B080BD0000707C010010B5FD -:1058100009F05FFC002005F02AF9034CE08A05F04E -:1058200036F9201C0FF0B3FE10BD707C01001CB5D2 -:1058300009F04FFC07203C009420000000AB074C0F -:105840001880E18A201C0CF00BF8019068460BF0E0 -:1058500017FA201C0FF09EFE1CBD0000707C01009A -:1058600080B502219820FFF7F1F880BD10B5154CE6 -:10587000C2B0A08A002803D03C00D020000001283C -:105880001ED1022000E00120E168403188722069C9 -:1058900008F023FD021C0C4818388088E1680FF0DE -:1058A000A4FEA08A00AB18800120588000209880B8 -:1058B000FF219971D871684600F03C000C2100006E -:1058C0007BF942B010BD03219820FFF7C5F8F8E737 -:1058D000707C01007047000080B503480FF060FE47 -:1058E000002005F0CDF880BD707C010080B5024835 -:1058F0000FF056FE80BD0000707C01003C00482186 -:10590000000080B502219820FFF7A9F880BD80B57E -:105910000320FFF734FF80BD0000F0B5214E0027C3 -:10592000B18A301C002504240029008BC3B01ED18D -:10593000012807D0311C498B022812D100293C00D4 -:105940008421000007D1002405E000240125022065 -:1059500000ABD8801F810FF07FFF002C10D1F168C1 -:105960000520403188720EE000291AD100ABD880A2 -:105970000E2002E000ABD8800D2000AB188107E0BC -:105980003C00C0210000301C0FF013FE201CFFF76C -:10599000FCFE002D08D0B08A00AB9880FF209872E2 -:1059A000DF7201A800F011F943B0F0BD0000707C77 -:1059B000010010B5002005F06CF8044CE08A05F0F9 -:1059C00078F83C00FC2100000FF04CFF201C0FF089 -:1059D000F3FD10BD707C010080B50420FFF7D8FEF8 -:1059E00001480FF0E9FD80BD707C010080B5022008 -:1059F000FFF7CEFE012005F05FF802480FF0DCFD56 -:105A000080BD00003C0038220000707C010080B5A1 -:105A10000320FFF7C0FE80BD0000B0B51D4DC2B031 -:105A2000288B00ABFF21588099710021D971AA8A77 -:105A30000024012A18D12A1C528B02280FD1002AD7 -:105A400016D1032058803C007422000099802C1C41 -:105A5000FF22981DE969FEF73BF9E1680420403117 -:105A6000887210E0002A06D101240E2001E00124F2 -:105A70000D2000AB9880281C0FF0A4FD0420FFF738 -:105A80008DFE002C05D0A88A3C00B022000000AB9F -:105A90001880684600F0A5F842B0B0BD0000707CE8 -:105AA000010010B5002005F000F8034CE08A05F075 -:105AB0000CF8201C0FF089FD10BD707C010080B532 -:105AC0000420FFF76EFE01480FF03C00EC220000BE -:105AD0007FFD80BD707C010080B50220FFF764FE71 -:105AE000012004F0F5FF02480FF072FD80BD0000B8 -:105AF000707C010080B50320FFF756FE80BD0000DA -:105B0000B0B5194D0424A98A281C028B3C00282317 -:105B10000000C2B0012914D1408B042A0BD1002807 -:105B200000D100240FF0ADFE002C19D1E96805204A -:105B30004031887217E0002810D100AB5A800E2047 -:105B400002E000AB5A800D2000AB988019803C0029 -:105B500064230000FF2098710020D871684600F08F -:105B600049F842B0B0BD281C0FF038FD201CFFF7EB -:105B700021FEF6E7707C010010B5002004F09EFFC6 -:105B8000034CE08A04F0AAFF201C0FF027FD10BD93 -:105B90003C00A0230000707C010080B50420FFF7CA -:105BA0000CFE01480FF01DFD80BD707C010080B52A -:105BB0000220FFF702FE012004F093FF02480FF0DD -:105BC00010FD80BD0000707C0100B0B50A4D011CC5 -:105BD00044313C00DC230000041C0622281CFEF794 -:105BE00089F8EC60206903F097F8011C0622A818D8 -:105BF000FEF780F80420FFF7F7FDB0BD707C0100D0 -:105C000090B5041C808893B0002806D01549062260 -:105C1000488018313C0018240000881FFEF76DF8FA -:105C200068460CF014F82088012808D16088032801 -:105C300005D1A088002802D106200CA90870A079FF -:105C40000621FF2804D0E079002801D0011C08318A -:105C50000B2008AA50723C0054240000201C08F0BD -:105C60003BFF039068460BF031F813B090BD000085 -:105C7000587C0100074B1A78824201D0002907D0D6 -:105C8000FF201870044801880122520391430180CB -:105C9000704700004C7B01003C00902400003280E3 -:105CA000070010B5041C0C2307495843401800791D -:105CB0000AF04FF901200349A04008390A7810433F -:105CC000087010BD0000747A0100034A00211154CD -:105CD000800030321058017070473C00CC24000026 -:105CE000E07A010010B5041C052801D3FEF712FF6D -:105CF000201CFFF7EDFF0021201C0EF089FB10BDDA -:105D0000054980B58860087F242304495843085812 -:105D1000FDF76CFF80BD0000D47901003C00082530 -:105D200000009446010080B501219120FEF7C7FED6 -:105D300080BD024A11688143116070470000786E8F -:105D4000010080B5FEF7E9FE80BD80B5FEF7E5FEF7 -:105D500080BD80B500F031FA80BD034980B53C00BC -:105D6000442500000420886000F0D0F980BD0000C8 -:105D70000030070080B500F099FA80BD80B500F0D2 -:105D800099FB80BD38B5202815D20D4C221C20323D -:105D9000957900AB1D70D2795A700A4B82009950E8 -:105DA0003C008025000001218140084801604268D4 -:105DB0001143416000AB1888E08438BD0121FF2009 -:105DC000FEF783FEF9E70010070030740100004081 -:105DD0000700202809D20549064B82009950054A40 -:105DE00051683C00BC250000012383409943516069 -:105DF00070470000A97500003074010000400700E2 -:105E0000024A11680843106070470000786E010074 -:105E10000B48016803221204114301600168072244 -:105E2000120691433C00F825000001225206891811 -:105E300001600168120C11430160016852081143AE -:105E400001607047000080000700FEB51C4E051C75 -:105E5000B08AF26812D00124002909D1116D02AA7A -:105E600001ABFEF7F8FE3C00342600000298002843 -:105E700001D000240BE001AA02A9281CFEF770FF44 -:105E800005E0116D02AA002401ABFEF701FF0E49E7 -:105E9000081C2030827900AB1A70C07958703068C5 -:105EA000002802D1029830603C007026000002E019 -:105EB00002987268D060019800AB70601888C8843E -:105EC000F068C06CF060201CFEBD247E0100001054 -:105ED0000700F8B5041C54271D4E00203060706088 -:105EE00067433804151C000CB1823C00AC2600004E -:105EF000FFF796F8082130610026174A14E0031CCA -:105F0000243342610361C661018308330360B12316 -:105F10004360031C6433C3600C230381031C5433AC -:105F20004C3028C0013C181C002CE8D13C00E8266D -:105F30000000094E07223069D243C1195050021C9B -:105F4000103280398A63F060B06000210020FFF7D2 -:105F500088FF3069F060B060F8BD247E01009100D8 -:105F600005000148406A70470000E87D01003C00E0 -:105F7000242700000148008870470000FC6B0100E6 -:105F8000064980B508880130088005490820086066 -:105F900004498869886100F021F880BDFC6B01002C -:105FA0000010070000300700034A0120121D06CA36 -:105FB0003C0060270000914200D100207047E87D3E -:105FC0000100064800B5C07C002803D1FFF7EFFFB1 -:105FD000002801D0012000BD002000BD0000A080ED -:105FE000070010B5041C800702D506F03EFD03E053 -:105FF000E0073C009C27000001D506F0E3FD6007A8 -:1060000001D5FEF7ABFD10BD024A011C10681160FE -:1060100070470000E87D010038B5204D2C1C20346D -:10602000A07900AB1870E0795870FEF727FA00AB42 -:106030001888E8843C00D82700001A488178082294 -:1060400091438170817811438170174841688022A3 -:1060500091434160016811430160002001306428D0 -:10606000FCD3A0790F4D00AB1870E079104C58703C -:10607000201C103000F03C0014280000DFFB002042 -:10608000C043A061FFF79CFF002809D00A490869B6 -:106090000130086100203C318968486306F0EEFC5D -:1060A00000AB1888E88438BD001007000000070026 -:1060B000F4000700003007003C0050280000E87D95 -:1060C00001000A4880B5006A002801D0FEF7C1F936 -:1060D000074807493C30806810304861012008615A -:1060E0000549086880229043086080BD0000E87D73 -:1060F000010000300700F40007003C008C2800007D -:1061000080B50CF0CBFE06F0BFFC80BD0149C86233 -:1061100070470000E87D0100024A916A08439062DE -:1061200070470000E87D01001823064958434018D5 -:106130000021027903681A70013108303C00C82838 -:1061400000000329F8D370470000285201000349DA -:10615000002800D0011C024881627047000085754C -:106160000000046C0100F8B5FFF733FF284F00284A -:1061700004D0FFF7C8FF386A01303862F86A3C0083 -:1061800004290000002802D0018904390181386BFC -:106190000025002808D00B203D6310F0E5FA1E49C9 -:1061A000086821229043086038783C211B4A41430B -:1061B0008C18FF22796A3A7000290CD0B969013134 -:1061C0003C0040290000B9617D62BD68002D04D00B -:1061D000636B7A6B0021FDF747FDF8BD042803D3FC -:1061E00001218420FEF7A1FC3869261C01303861AA -:1061F00020363078022803D00C218420FEF795FC4D -:1062000035703C007C290000A1690029E8D0636B4F -:10621000303420780C1C00217A6BFDF727FDDFE776 -:10622000046C0100F400070018DB010010B50B4CF2 -:10623000606A00280ED00A4800F012FB002060625D -:10624000A468002C3C00B829000005D07E23DB4365 -:1062500000220121FDF70DFD10BDE0690130E06174 -:1062600010BD046C010000300700094841683F225E -:10627000120491430D2212048918416041680122E1 -:106280005202914341603C00F429000003488178A8 -:1062900081708178817070478000070000000700DE -:1062A000F0B50125082400200E4A0F4900263C23A2 -:1062B0004343D1529B185D719B605E611C82C02775 -:1062C000DF602027FE549E613C00302A000030270A -:1062D000FE54074F3F182037013005289F63E9D34C -:1062E0000548FF3201329062F0BD18DB0100BEBAF2 -:1062F000000030800700066C0100014948607047CB -:106300000000046C01000549085C3C006C2A000098 -:10631000054949684018C006C00E0449203048723B -:1063200070470000A0570100046C010000800700C6 -:1063300080B515218420FEF707FC80BDF8B54348E1 -:1063400084680334424D04E0201C10F03C00A82A6D -:106350000000B9F8002871D12869C007F7D53E4878 -:1063600028603E4A141C2034207900903C233C498C -:10637000584345182879FFF7CCFF281C3A490830C4 -:1063800048600126081C0660686A00280DD03C00A1 -:10639000E42A0000A96A926A354B9F68D71B1A68E5 -:1063A000511879188A425A6800D800E0013206C0B4 -:1063B000E86AFEF787FF2D49E86A4860301C0E60E6 -:1063C00066791FE02B484661047F2949201C50391B -:1063D0003C00202B0000896AFDF75AFC009884429B -:1063E00010D03C202249604340188769002F09D013 -:1063F0000021203001707E23DB4302210022201C7B -:10640000FDF74CFC0120A0408643002EDDD1E96958 -:1064100000293C005C2B000003D03020405DFDF7DC -:106420003AFC164C503C606A002803D00A218420B4 -:10643000FEF796FB20352878012803D00B21842015 -:10644000FEF78EFB02202870E068013000E007E0D4 -:10645000E06000983C00982B00002070009860706D -:106460000A4800686063F8BD0000000107000040B2 -:106470000700010000013080070018DB0100003038 -:106480000700546C010000A00700786E01003C2258 -:106490003C234A4309493C00D42B0000B0B55418B2 -:1064A00058434518211C3822281CFDF7E5FCA06B39 -:1064B0000078A96B0870002020342070B0BD000067 -:1064C00018DB01003C230749584310B54418203419 -:1064D0002078022803D10D213C00102C00008420DC -:1064E000FEF747FB0020207010BD18DB0100FFB550 -:1064F0003C2048431A4981B04418261C2036307885 -:10650000151C0F9F022803D104218420FEF731FBC4 -:106510000120307025710B9930223C004C2C00007A -:1065200061800A99E1620D99A1610C99E1610E996E -:106530006162A762019911557E21C9436163049983 -:10654000002900D10020061C281C08F08BF8002828 -:1065500001D0022000E00020A16B30433C00882CD9 -:106560000000087005B0F0BD000018DB010080B528 -:1065700014218420FEF703FB80BD0148407870475A -:106580000000046C010002480069C007C00F70479A -:10659000000000400700011C3C23044A59433C0012 -:1065A000C42C00008918203109780120002900D06E -:1065B0000020704718DB01000848406A00280AD113 -:1065C000074A002120239B5C022B04D001313C327E -:1065D0000529F7D37047012070470000046C0100C3 -:1065E0003C00002D000018DB0100F8B50E1C041C57 -:1065F000171CFEF782FE201C114C606001202060F9 -:10660000104D686901306861686A002803D007216D -:106610008420FEF7BAFAA068400703D5062184203B -:10662000FEF73C003C2D0000B3FA08480069002842 -:1066300003DAAA218420FEF7ABFA02206862AE607A -:106640002F70F8BD00300700046C01000040070007 -:10665000044A518010710348034908304860012002 -:10666000086070473C00782D00003C6C0100003051 -:1066700007000021002305E002894360C06851182B -:106680000904090C0028F7D104310804000C7047F4 -:106690000000024A516B0843506370470000046CCD -:1066A000010038B50A4C3C00B42D0000221C2032F9 -:1066B000957900AB1D70D2795A7003684068064A1C -:1066C0005065054813655030816000AB1888E08440 -:1066D00038BD000000100700046C010098B50D4C97 -:1066E000201C2030817900AB3C00F02D0000197097 -:1066F000C07958700A4800F0ECF809490020486257 -:10670000FFF769FF002803D012218420FEF749FA21 -:1067100000AB1888E08498BD00000010070000302E -:106720000700046C01000348017A3C002C2E000095 -:10673000FE2291430A310172704700000080070079 -:1067400090B50E4C85B0A078022814D10320A0701B -:106750000B4900200022049202900391E18801225B -:1067600001920091617820782269E3683C00682EEC -:10677000000008F094FD044809F07FF905B090BDD1 -:106780000000B4790100ADB6000071B60000B0B5EC -:106790000C4DAC790C490978002903D001290ED0A1 -:1067A000022908D1C288002A09D0012381683C004F -:1067B000A42E000002200FF0C1F803E00221862081 -:1067C000FEF7F8F9AC71B0BD20100700A079010008 -:1067D00080B5026807494A600379CA78CB700079AE -:1067E000904206D003481430008907F027FE06F0D7 -:1067F0003C00E02E0000ABFA80BD8466010070B55D -:10680000164C154DA0780026983D012803D1286923 -:1068100008F0FBFCA6706068012803D000212869FD -:1068200000F0FFFB0E4829690CF031FA01200CF052 -:10683000E4F83C001C2F0000E078012802D0012081 -:10684000607000E06670064814304168012906D186 -:106850000660416F002902D00020FDF74CFA70BDA0 -:10686000846601003463010030B500220023012555 -:106870002C1C94403C00582F0000044001D0CA5406 -:10688000013301320E2AF6DB181C30BD0000FFB5C3 -:1068900001270026051C022081B00090002D18D091 -:1068A0002878FF2815D0002410E0281980780A994C -:1068B000002901D001063C00942F000008D507F004 -:1068C000E9FE0E2803D0012181400E4300E000279D -:1068D00001346878A042EBDC0098029D01380090FA -:1068E000DFD10398311C814302D003980640002772 -:1068F0000498066005B0381C3C00D02F0000F0BDA5 -:10690000000002210160642101E0013902D0026827 -:106910009207FAD40120002900D10020704710B559 -:106920000020C443054B022201015A50C9188C6053 -:1069300001300828F8DB10BD00003C000C300000DE -:1069400000300700F0B5051C6035C76A041C287BC1 -:10695000002F8BB015D0082815D202A31B5C5B005A -:106960009F4400000704040709090C0C01260021BC -:1069700009E0002606E00226022104E03C0048303F -:1069800000000326032101E0042601218C22125974 -:1069900007912649069004910020039005970892DC -:1069A000E0692269211C7031019121490090700039 -:1069B0004018603002920388591C01801E483C0038 -:1069C000843000000288A1680AA809F0E1FF606035 -:1069D000E87AA16AC9070007000EC90D0843616A79 -:1069E0002269C907890D01430120002A00D1002036 -:1069F00080030843216AC9030843082108430A9910 -:106A00003C00C03000000880201CFEF798FE206982 -:106A1000002804D1201C0AF082F90BB0F0BD807967 -:106A2000062801D9FEF70FF9206906498079800010 -:106A30000958201CFDF774F9EFE7792F0100C469AC -:106A400001003C00FC3000000861010074570100A7 -:106A500010B5041C58308AB00EF07CFE221C803227 -:106A60005168002901D0117A07E0002804D080691C -:106A7000800701D5032100E00121D2680791224956 -:106A8000002008923C003831000004910022059259 -:106A900006900390E06922690090211C70311C4827 -:106AA000019102920389591C01811A480288A16848 -:106AB00009A809F076FF60606B20005DA16A226979 -:106AC000C9070007000E3C0074310000C90D0143E6 -:106AD0000120002A00D10020800308430999088082 -:106AE000201CFEF735FE2069002804D1201C0AF086 -:106AF0001FF90AB010BD8079062801D9FEF7ACF85D -:106B000020690749807980003C00B03100000958B5 -:106B1000201CFDF711F9EFE70000BD2F0100246AEA -:106B2000010008610100745701003EB5051C0069B1 -:106B3000042107F0D2FA002809D042780232011C61 -:106B40006846FDF788F9E86A6C463C00EC310000C5 -:106B5000029000E00024281C143002F003FB0028FF -:106B600004D0211C281C05F0A5FE3EBD002CFCD045 -:106B70000249201C4969FDF7E2F8F6E7447D01006F -:106B800070B51E1C18235843064B049D3C00283248 -:106B900000001950C418002060616260A660E560C2 -:106BA0000FF0B9FD206170BD0000B87D0100024A00 -:106BB000011C9069916170470000447D010001480B -:106BC000406B70470000447D01000449044B3C00C9 -:106BD00064320000CA6809695C3B5B68C91A4143BA -:106BE00050187047A07D01000148007870470000F0 -:106BF0007869010080B506220149FDF735F980BDAD -:106C0000FE670100F0B589B00093164F131C0E1CEF -:106C10003C00A0320000041C3A1C01F062FF01A9F4 -:106C200006A8A26802F00BF901AA06A9381C636A3B -:106C300002F081FC051C012814D10C48FC21C8512C -:106C4000381C02F00CF80321301C07F052FA00281F -:106C500007D03C00DC320000807800F033FC201CC0 -:106C600010300EF047FD00E00025281C09B0F0BDF3 -:106C7000F4670100C138000010B5074C0648062231 -:106C8000211D0838FDF7F6F801F0FCFF00F042FC8A -:106C9000201C02F03C001833000027FC10BDF467F4 -:106CA00001000849C96800290AD0064A0132517812 -:106CB00012784843002A01D108187047101870470D -:106CC000013070470000447D0100044B0549002855 -:106CD0005A6900D0011C3C0054330000101C59615B -:106CE00070470000447D0100B9750000074900208D -:106CF0000A78022A09D10A7C002A05D1CA68002A2A -:106D000003D04969002900D001207047786901004B -:106D10000C4A80B5012151603C009033000009F01D -:106D20006AF809481C308169002907D00023836173 -:106D300000220021002000F0D2F880BD00220021B6 -:106D4000034800F05CF980BD00005C69010051352A -:106D50000000B0B50C1C012816D13C00CC3300005B -:106D60000E4D022C09D100F02BFA00280ED06869D4 -:106D700000280BD1211C13200CE0032CFAD100F0C9 -:106D8000F9F9002802D0287C0028F3D0B0BD211CDE -:106D90000006000E04F062FCB0BD00003C000834A8 -:106DA000000078690100B0B50C4C002525746561C0 -:106DB000E56000F03CFA00F034FA07481C38056141 -:106DC00009F033FF2078002802D104F06EFAB0BD3C -:106DD0000228FCD104F0A5FBB0BD786901003C009D -:106DE000443400000C4880B50178002912D0C068F6 -:106DF00000280FD108481C38406900280AD10748EC -:106E00000068002806D000220721102010F0A0F909 -:106E100002F02CFC80BD000078690100D4670100FD -:106E20003C0080340000F8B51D4E1C4D041CF06879 -:106E300002271C3D002807D0E868002804D0FDF791 -:106E4000C2FE002800D0BC43002C14D03770F0687C -:106E5000144F002810D0E00717D4FDF7B4FE002827 -:106E600013D03C00BC3400007069002806D1E868EB -:106E7000002801D0FDF71AFF0DF00AFAF8BD686985 -:106E8000002805D109480068002801D0012C04D150 -:106E9000391C201C0EF052FDF0E704F01DFB02F03F -:106EA000EBFBEBE73C00F83400007869010050C3CD -:106EB0000000D467010005484169002904D0406AF8 -:106EC000002801D001207047002070470000786939 -:106ED000010010B5041C0649002048600860886065 -:106EE00008F09BFF07213C00343500001220227976 -:106EF00010F03AF910BD00005C6901000149012061 -:106F000008607047E8670100F8B5071C0E1C08F020 -:106F1000A3FA134D041C6868002817D0002F02D074 -:106F2000A868032813D300203C0070350000A86037 -:106F30006860211C0F200EF0F0FE2868002803D0A6 -:106F4000002C06D1012002E0012C02D10020FFF725 -:106F5000FAFEF8BD721C0021044800F068F8A86829 -:106F60000130A860F5E75C6901003C00AC35000029 -:106F7000513500000A4980B5CA68002A0BD0426822 -:106F8000002A09D000224A6202680A6202680721C8 -:106F9000172010F0EFF880BD0120486280BD00008E -:106FA0007869010070B5144D846CE9683C00E835DF -:106FB0000000002917D04030EC614078002801D152 -:106FC00001206862286A0E4E001BB0420CD208F005 -:106FD0003AFE296A401AB04203D202220721132046 -:106FE00009E004F0B6FA70BD0748A9680BF03C0050 -:106FF00024360000BDFE221C0721162010F0C0F828 -:1070000070BD000078690100A086010034630100B2 -:107010000A4980B500208861086900280CD007481B -:107020001C300078002807D001F0D2FF022803D1DD -:107030003C006036000000F012F900F0BCF880BDA2 -:1070400000005C690100F0B5061C0C1C151C91B019 -:1070500001A84021FCF70DFF00216846FDF7A7FFBE -:10706000049001A806220849FCF731FF062202A875 -:1070700002303C009C3600000649FCF72BFF00ABB9 -:10708000DC760C95311C01A807F04EF811B0F0BD6C -:1070900012610100F8670100031C081C191C114B48 -:1070A00080B506D0042111800422191CFCF712FFC0 -:1070B00016E004223C00D8360000011C181CFCF726 -:1070C0000CFF09481038006900280CD007480C3024 -:1070D0000078002807D001F084FF022803D100F0D7 -:1070E000C4F800F06EF8012080BD6C690100F8B5AD -:1070F000041C0F1C00253C0014370000002601F082 -:1071000073FF02282FD11949012F086807D1021CEB -:1071100022400AD120430860A04206D104E00028A2 -:1071200003D0A043086000D10125486800281AD187 -:10713000002D17D0012048603C0050370000381C5B -:1071400008F089FE0B481C308169002907D0002314 -:107150008361002200210020FFF7F1FE06E00022FB -:1071600000210448FFF77BFF00E00126301CF8BD3A -:1071700000005C690100513500003C008C370000C4 -:10718000031C081C191C124B80B506D00421118069 -:107190000422191CFCF7AAFE18E00422011C181C8A -:1071A000FCF7A4FE0A481030C16800290ED0007810 -:1071B00000280BD001F01EFF022807D13C00C83781 -:1071C000000000F064F800F02EF8002801D109F06A -:1071D0007AFD012080BD6869010010B50A4C206964 -:1071E000002809D0A169002906D17D21C9004143A9 -:1071F000032207200FF0E1FE2169012000293C0055 -:107200000438000000D1002010BD00005C690100BE -:1072100010B5054C002803D0FDF79AFCE06010BDC6 -:1072200001200021E16010BD786901000A480A4987 -:1072300010B5C0681C39C968002803D0002901D0E6 -:107240003C0040380000012400E00024002C03D062 -:10725000022207200FF0B7FE201C10BD0000786945 -:10726000010010B5094C0020216900290CD0064905 -:107270001C310978002907D000F009F80120A0612D -:1072800020693C007C3800007D23DB00584310BDA2 -:107290005C69010080B5032107200FF0D1FE80BD9D -:1072A00080B5022107200FF0CBFE80BD064880B5D7 -:1072B0000078002801D0FDF729FD002207211120C8 -:1072C0000FF07CFF3C00B838000080BD00007869FA -:1072D000010010B5041C101C064A516100F0A3F80F -:1072E0001020002C00D11120002207210FF069FF8F -:1072F00010BD5C6901000149486270470000447D8F -:10730000010010B5094C3C00F4380000E069002889 -:107310000CD1E0620120E0610BF008FD0BF074FE7F -:10732000012000F0B5F80FF04DFA606310BD0000C9 -:10733000447D0100054980B50020C861886300F0E4 -:1073400089F800F001F902F03C003039000091FBAF -:1073500080BD447D010010B5012838D10806000E1B -:10736000052832D11D4C2078012809D002281BD0D5 -:1073700003282AD102F07DFB00F06FF8012010E015 -:107380001748216B0BF01BFD0BF03C006C39000023 -:1073900041FE15480069032801D3C00703D5012128 -:1073A000206B07F019FF022000F078F810BD0F489D -:1073B000006820640A485C30C16802698918C160AD -:1073C00003F0CCFC032000F069F801203C00A83950 -:1073D0000000E06210BD092100E008210920FDF74E -:1073E00076FC10BD0000447D010034630100F468A8 -:1073F0000100786E0100B0B50F4C2078651E0128A1 -:107400000FD10020FFF7A1FC0C49098849083C0076 -:10741000E4390000401A0FF019F9002804D0287848 -:10742000012807D0022805D02078002804D1287828 -:10743000032801D10120B0BD0020B0BD457D010071 -:10744000F46701000149C86470470000447D0100F1 -:107450003C00203A00000449054A8968126D012069 -:10746000914200D3002070470000F4680100447D81 -:10747000010010B5064C206B07F0F9FEA06B002848 -:1074800003D10348216B0BF092FC10BD0000447D3A -:1074900001003C005C3A00003463010004480078BD -:1074A000022801D0032801D1012070470020704735 -:1074B000447D0100F8B5071CFFF7D0FF061C012F23 -:1074C000264D1FD0022F45D0032F12D12448254B23 -:1074D00000696A693C00983A000041085A43234B0E -:1074E000D4188C4200D90C1C002E05D01E495B39E3 -:1074F0000978002900D1041C0522211C09200FF065 -:1075000080FD184A5C3A1770F8BDFFF7D6FB0028DB -:1075100002D0286900283C00D43A00000ED004F0C4 -:10752000CFFB134B6969114A59435C3AD26B8918F6 -:10753000884201D9441A04E0002402E004F0AEFDC0 -:10754000041C002EDBD009485B3800780128D6D116 -:10755000084B9C4202D958423C00103B00002418C2 -:10756000D0E70024CEE704F0AEFBCAE70000F468E1 -:107570000100A07D0100983A00008813000080B54A -:10758000052109200FF07DFD02490020087080BD13 -:107590000000447D010070B5061C3C004C3B00001F -:1075A0000DF0BCFAFFF7CEFE094C0A48216B0BF038 -:1075B00021FC012501213006000EA56307F03AFEEB -:1075C000054829020958002900D1056170BD000055 -:1075D000447D010034630100F46701003C00883BF6 -:1075E0000000024A116C0843106470470000447D9B -:1075F000010080B5FFF7BFFE0BF0A1FB80BD024A82 -:10760000011C1069116170470000447D0100F3B551 -:10761000061C002089B0F84C0890E26908253C005F -:10762000C43B0000002A03D006A907A8FCF706FC0B -:10763000301CF34E0027203682286FD015DC01283D -:1076400018D080286BD1EE4D803DA868012867D105 -:1076500068680FF01BF8002863D1012101200DF0AC -:107660003C00003C00009DF808F0DBFD0BB0F0BDD5 -:1076700083286DD0842855D1E7E00A980A2804D2DF -:1076800003A31B181B5A5B009F44F6E00000EE00AA -:107690000B00F700F700F700F7002F0088008B00C1 -:1076A000AD003C003C3C000000F056FE002817D026 -:1076B000D64A803AD16A0698814216D0062100281F -:1076C00000D107210D062D0E00280ED0CF4A012033 -:1076D000803A50650FF0A0F8CC4A803A506604E03A -:1076E000002116203C00783C00000FF0DCFC012556 -:1076F000022005902EE2C6488038406D00282ED02A -:10770000C6492069C44D40180EF0C1FF002812D0B0 -:107710000FF085F8C14949424018BD4920618039C0 -:10772000486E40190EF03C00B43C0000BBFF00283E -:1077300011D00AE0F7E017E2B2E0B0E0B649206904 -:107740008039496E401AA84205DBB349B54D8039EE -:107750004F6503F027FB0622291C16200FF072FC50 -:1077600047E095E000F0FEFD3C00F03C0000002802 -:1077700042D1AA4DC43DEF6008F019FD03F015FB9E -:10778000A86A002802D0FFF74CFFAF62A4488038F7 -:1077900000680021FFF7F9FC08F03FF909211620E5 -:1077A0000FF087FC0022162183203C002C3D0000B6 -:1077B0000FF040FDFFF786FC21E000F01BFE1EE00D -:1077C00006F054FA974D803DA96F401A0490069830 -:1077D000002801D0AF6502E0A86D002808D19148CB -:1077E000C4380078800703D5924847603C00683D64 -:1077F000000000F002FE0498FF382338142802D25B -:107800000120E86353E0EF6351E0874AB57A803A9C -:10781000002D4CD00DF071FF00F0ADFD071C82482B -:107820008038406FFF305F300EF03DFF021C3C009F -:10783000A43D00007E488038406D00281AD100F039 -:10784000F1FD002816D1042D02D1002F12D11BE02A -:10785000002F06D0022D14D079484068002809D0A6 -:1078600012E0002A10D14B21C90001230922162061 -:107870003C00E03D00000FF0D6FC6E4A7348803AB1 -:1078800011680BF0D8FA18E00121002001E0012175 -:10789000012000F02AFE10E0674A6C49803A906EA1 -:1078A00040189066012508958BE104216CE1614A3E -:1078B00066483C001C3E0000803A11680BF0AAFAB2 -:1078C00088E1AF60A86FE8676348016DA967079A10 -:1078D0001420002A00D1002008181230A866707801 -:1078E000B0703078707002203070A069FCF7C2FA76 -:1078F000EF64A86F3C00583E0000E96F594B401AF6 -:10790000984212D2686D069988420ED030780228CB -:107910000BD80EF09CFFA96F0822401A5249091A91 -:107920003B1C16200FF085FC00E0AF6501200590A0 -:107930000890434802253C00943E0000C438C168CA -:10794000002972D10121C1604948006B00286CD028 -:1079500008F066FC69E03C480022019280388068AB -:10796000012804D1384880388760012048E13A482E -:10797000012343603448C4383C00D03E0000007806 -:1079800000280AD100F025FE002806D0FF21913101 -:107990000123092216200FF052FC2C498039486F30 -:1079A000896F421A039206F076F928498039896F67 -:1079B000039A401A0290372000013C000C3F00005F -:1079C000101A50280DD223488038406D002804D169 -:1079D0000298FF385538142801D2012200E0002215 -:1079E0000192039A0120FF3A0B3A502A00D300205B -:1079F000049000280AD017488038C06F3C00483FE8 -:107A00000000081A9B21C900401A142801D2012243 -:107A100000E000220092002A11D00F4D0120803D8D -:107A200068650EF020FF68660125012116200FF021 -:107A30005EFB002116200FF05AFB00E0BAE03C008C -:107A4000843F0000F07902283CD8054A803A516C06 -:107A5000002937D1136C111C002B33D116E0000024 -:107A6000246D010050C30000C05C15007099140023 -:107A7000B057010034630100E204000000900700E9 -:107A80003C00C03F0000530700001E020000C85722 -:107A900001004A6D002A02D0B27A022A15D1009A5A -:107AA000002A03D0CA6D0132CA6500E0CF65019A91 -:107AB000002A0BD08A6FCB6FD21A5A4B9A4202D24D -:107AC0008A6D3C00FC3F0000013200E001228A6523 -:107AD00000E08F650499002901D102280BD9544A8E -:107AE00002281ED9D06F616888421AD1916F081A96 -:107AF0005049884215DD4E4B986FE168401A7D2150 -:107B0000C90088423C00384000000BDD6169401A22 -:107B1000002804DD021140111018401801E0801007 -:107B200008186061586FE0600398FF382338142804 -:107B300009D20298FF382338142804D23E4A906FA5 -:107B40005064906A90643C00744000000EF09AFE0D -:107B50003A49496C401A3B49884201D937494F6438 -:107B6000394903984018142807D23449C86B0028B3 -:107B700003D0886F0864886A88640EF083FE2F49FA -:107B8000096C401A314988423C00B040000001D9DC -:107B90002C48076404200590082116200FF0B9FA3C -:107BA0002848406D002802D00499002908D02949AE -:107BB000002800D129493B1C062216200FF057FB54 -:107BC000022D09D0062D0AD0072D3C00EC40000004 -:107BD00013D107E001211620FDF7D6F81EE01A4A5E -:107BE00057639763184A0698D06207991163536BDD -:107BF00018435063906B084390630598002805D0A4 -:107C000005980CF05FFA05980CF0D2F93C00284179 -:107C10000000082D05D00D4844388570281C03F05D -:107C2000DCFD1149E069884200D161E5089800282F -:107C3000FBD0B07A0228F8D1012116200FF06FFA9C -:107C400002200DF0E8FE53E50000530700003C0061 -:107C500064410000A46C010020A10700204E000038 -:107C60003FFBFFFFA086010050C30000C05C150071 -:107C7000F11D00007047000070470000F8B5214872 -:107C80000068214D6969084001D1012700E0002703 -:107C90003C00A04100001D4D0126696A002900D06A -:107CA00000261B4D1A482C1CA030027A281C40309C -:107CB00080341023B74210D10125C580002900D09F -:107CC00000231A43111C017301200EF088FE0820C6 -:107CD00020703C00DC41000000221621802013E0CF -:107CE0001127C7802E1C0B4D002900D100231A43F9 -:107CF000111C017301200EF075FE08202070306DFC -:107D000000221621686782200FF0D0FAF8BD00002B -:107D1000100007003C0018420000A46C0100009015 -:107D20000700B0B50F4D041CAA7A0121081C002AD7 -:107D300000D00020002C00D0002188420AD0002C66 -:107D400004D100F042FB00F0D6FA03E000F0D9FACB -:107D500000F009F8A87A3C00544200000249E439D6 -:107D60004871AC72B0BD0000446D010080B53EF0BA -:107D700055F802490120087080BD0000687E0100AE -:107D8000F3B501208DB00F1C012408900EF092FD78 -:107D9000061C00F0B5FA09903C009042000000F08B -:107DA00080FB0790FEF73FFA051C00210C9108F0BC -:107DB000F0FB002801D1012000E000200A90FEF72E -:107DC00012FD05F0E0FE0B90002D23D0288841071E -:107DD00020D4291D04910A3500063C00CC42000045 -:107DE000800E01212028039500D000210D1C04984D -:107DF00006F038FD0C90049806F010FD002808D01D -:107E0000039801F087FA002803D0002D01D101204A -:107E100000E000200C9901430C91FCF73C00084362 -:107E2000000023FF00282FD007F099FF051C07F062 -:107E3000B2FF0490FFF7F3F80C990143002D06D030 -:107E40000498F04A301A904201D2012000E000204C -:107E500008430C900B980A9B1843011C0B913C00A3 -:107E60004443000005F0CEFE00281AD1002D06D0B4 -:107E70000498E749301A884201D2012000E000202E -:107E80000C990843051C00F01FFB284303E000F099 -:107E90001BFB0C9908430C9000F0D4FB0B99014399 -:107EA0003C00804300000B91DC49C868002801D0E9 -:107EB0000138C86008F0E7FB069008F090FD311A21 -:107EC00005910699D648814208D8002F08D1059916 -:107ED0004008814204D90699814201D900248BE0EF -:107EE000D0483C00BC4300000599D04D814226D2C9 -:107EF000E879102806D2002F21D1CC48A038806A1A -:107F000000281CD109F062FF0490002802D1002053 -:107F1000C34913E009F010FE002803D0C448C0692B -:107F20000028F4D03C00F84300000498052803D052 -:107F3000C148006A002865D1BB49486A002823D09F -:107F40000138486200F087FF002811D0BB4805992E -:107F500081420DD201F09BF804300DF0EEFC403070 -:107F6000C17A01294ED03C0034440000807A0028B8 -:107F700001D0052849D301F0DFF8022810D0002FE6 -:107F800002D10698002840D10020089082E1AA483A -:107F9000A038C068002838D0A8488069486234E01A -:107FA0000AA903C9084345D03C0070440000A34817 -:107FB0002978A038022940D8406D00280AD09F486F -:107FC000A2492038C06840180EF0C7FB002801D035 -:107FD000012100E00021964A906A002802DA640834 -:107FE00064002AE0002909D1954B3C00AC44000014 -:107FF000A03B5B6D002B02D005280DDB01E00728BC -:108000000ADB0120C043906264088E4964000020AE -:10801000A039886514E0D1E0394311D18949A039EC -:10802000CB6D002B02D1896D012909D93C00E844B0 -:108030000000079B002B01D1072801DB64086400C6 -:1080400001309062BDE07D4988690490002088611C -:108050000C9800282CD007F066FC002802D00220E3 -:10806000044325E07A48C06A002804D177483C00E0 -:1080700024450000A038C06800281CD104980028BE -:108080000DD12878102802D3E878022802D928795F -:10809000102804D304246B4901228A6194E06C48BF -:1080A000A038406D002871D005F0A2FD00286DD0E9 -:1080B0003C00604500006408640088E0FFF75BFA5C -:1080C00000281AD068480078022801D1002F14D166 -:1080D0000020FEF770FE301A0490FFF76CFA0028BB -:1080E00007D0FFF71EFA002803D05D4904988842A4 -:1080F0004FD33C009C45000005F06CFD00284BD19F -:1081000053490878032808D188680122D207301A19 -:10811000904241D201220A7057E054480078022868 -:1081200001D1002F51D14A4988685149801B8842AA -:1081300007D901203C00D8450000FEF742FE7D2112 -:1081400009014018444988604A480078022804D14F -:10815000079B002B01D1012000E00020474B47493D -:10816000584340183C498968891B884230D9079B8D -:108170000020039300F03C001446000079FF0290B9 -:10818000FFF7D8F9049001F057F80499029A514387 -:108190004843019000F0DCFF411C01980122484354 -:1081A000111C00E01BE0314B5B6A834200D30021CD -:1081B000039B0122002B00D03C005046000000220F -:1081C0002C4B51439B6A0122834200D30022500072 -:1081D000081803D023490320087003E00998C068F9 -:1081E000062808D90224089800286ED01D490020CE -:1081F000C8614861A5E01A4948693C008C46000006 -:1082000000280AD1002F05D001224A61C8698018D0 -:10821000C8610AE00020C86103E0002F05D10020FA -:1082200048610D98002800D1C8680020089008789F -:1082300001282FD002284BD1002F08D13C00C8467E -:108240000000E878002802D12878102843D2287945 -:10825000102840D248680A69301A904267D3012238 -:108260000A7038E00000E204000010270000687E79 -:108270000100A086010088130000446D01003C004D -:1082800004470000C857010050C30000983A00009E -:10829000C0570100400D0300C4090000B20C0000EB -:1082A00000200B9A0A9BC0431A4337D0002F35D1C8 -:1082B000079B002B08D06A78022A2FD92A78102A27 -:1082C0003C00404700002CD22A79102A29D2254BA5 -:1082D0001A6C002A06D09A6A9F6CBA4202D11F20FB -:1082E0001FE02EE0204B5A6C002A03D01F4FB31A18 -:1082F000BB4216D31C4B002A05D09A6A9F6CBA4227 -:1083000001D13C007C4700000F200DE0079A002AB5 -:1083100004D0EA79202A01D1002005E0EA79102A68 -:1083200001D3032000E09A6A124A126802400BD17E -:1083300001200890022008700F4808614E6064E731 -:10834000FFE701203C00B8470000089060E70C49B7 -:10835000886A002801DA013002E0002801DD0020EF -:108360008862002008620899200408430FB0F0BD1D -:108370000000A46C010071020000082007005307F0 -:108380000000687E01003C00F447000070470000D8 -:1083900000487047507E010080B53DF07FFD0249E6 -:1083A0000120087080BD00003C7E0100F8B50D1C66 -:1083B0000EF0C8FA2649041C886A264E002801D00F -:1083C000042003E0706A00283C003048000001D01F -:1083D000013870620027002D02D0B761F7610AE012 -:1083E000B0691C490130B061496D002903D00328F0 -:1083F00001D90120F061B460F168009108F0F7FC48 -:10840000F0600099884202D030623C006C48000065 -:1084100034610BE000F090F8002801D0114800E032 -:1084200011483169611A814200D937620B4A0C4800 -:10843000D16C2030002901D00A2103E0017A002903 -:1084400001D0FF310172002D03D1017A3C00A84810 -:108450000000002900D0916A007A002800D1176539 -:10846000F8BDA46C01003C7E0100A60E0000A861CE -:10847000000070470000064980B58968002907D0D0 -:108480000521002800D104210806000E03F03C005D -:10849000E448000005FA80BD606C010007480068F0 -:1084A00007494A69104001D0012000E00020496AD4 -:1084B000884201D10120704700207047100007005A -:1084C000A46C010070B50EF049FA021C00F03AF8F5 -:1084D0003C0020490000104900280ED0081CA031A3 -:1084E0000E780E4B102E01D3806F03E049781029CF -:1084F0000ED3C06FC018841A0AE0081C803045698A -:1085000008498D4201D90C1C05E0C068101A2C1ACC -:10851000002C3C005C49000000DA6419201C70BD8E -:10852000A46C0100A60E000050C3000080B505F049 -:10853000B7FB002802D007F01FFF80BD034800787A -:108540000028FAD007F070FB80BD0000606C0100CD -:10855000034901203C00984900004969032900D8DB -:10856000002070470000606C0100B0B50A4D002487 -:108570002878012803D005F06AFB0406240EFEF7D4 -:10858000D2FC0002204302D1686A002801D10120F8 -:10859000B0BD0020B0BD3C00D4490000606C0100BB -:1085A0000121012800D000210148416270470000EC -:1085B000606C0100154810B504681548006A002871 -:1085C00014D0FFF7CBFF00280ED111481149C43059 -:1085D0004069884208D2CC083C00104A0000A04202 -:1085E00005D3FFF77EFFA04201DA0C4C01E0FF2427 -:1085F00091347D200001844204D900221621832079 -:108600000EF0BDFE01230922211C16200EF0A7FE4C -:1086100010BDB0570100606C01003C004C4A0000E6 -:10862000C05D00001027000070B5051C0E1C00F096 -:1086300043F800280FD0084C2078C00703D405F079 -:10864000ABF909F031FE002D05D02078800702D467 -:10865000301C02F0FDFE70BD606C01003C00884AD9 -:108660000000B0B5002818D01148814215D210483A -:108670000C1C0D1807F0DFFA81000918A14201D285 -:10868000400003E041000918A14201D2241A06E08B -:108690004100A14203D24008F8E7064D074C3C00D8 -:1086A000C44A00000EF072F90019291C07F0DCFA28 -:1086B000B0BD000080B92A00530700004C1D000027 -:1086C00088130000B0B505F0FDFA002813D1FEF7BD -:1086D000B5FE0A4C0A4D0028606300D028600EF0F9 -:1086E0003C00004B000055F9216A002904D1E169E2 -:1086F000401A2968884201D90120B0BD0020B0BDD0 -:108700000000606C0100B057010080B5FFF7DDFF8D -:10871000002805D005F0B7FA002801D1012080BD5E -:1087200000203C003C4B000080BD000010B50A4C0E -:108730000021A268002A03D0A16002F083F910BDD5 -:108740006160011C002204200EF036FD0348216800 -:108750000AF008FC10BD0000BC740100C4600100F8 -:1087600070B5051C3C00784B000001D1FCF7C1FB43 -:10877000204CE06A002815D01F4BA0695843C60B57 -:1087800020884643F0008019E660FBF71CFEA842F3 -:1087900005D8301CFBF717FE8019A84202D2002032 -:1087A000E06020E0E5603C00B44B0000002D1DD0EF -:1087B0002688A0697043C103281CFBF7A5FD6061F2 -:1087C0000D48321C291C3030FBF70AFC0C4B606949 -:1087D0005843C00B606201F0B7FDA062E06800285A -:1087E00004D02069A168FBF73C00F04B0000F4FBCB -:1087F00070BD0548A168FBF7EFFB70BD0000C874B1 -:10880000010040420F00C0C62D0088130000F1B5E2 -:108810003E4800AB8178C0783E4F0A07040758787D -:108820003B49120F085C1439240F3C002C4C00000B -:10883000801878600130B8601878354D085C0019F0 -:10884000B8610130F861EB7833481E09334B1838B2 -:1088500081785E43AB781D09C8236B43002908D19A -:108860002B4D2D783D60C5607D25ED003C00684CAA -:1088700000005D1B2C4B07E0274D6D783D60C56007 -:108880004B252D015D1B284BF618022000F057F8F0 -:10889000281AF8602248221C18388178032000F03A -:1088A0004EF8301A3862396800AB79615A783C006A -:1088B000A44C00005623F9685A43891AF960C8315C -:1088C00039611849183989780029B96911D100AB83 -:1088D0001A78134B143B9A5C531C59430A2359438F -:1088E000144B591A51430A235943401A386212490A -:1088F0003C00E04C000010E000AB1A780A4B143B3F -:108900009A5C531C59430A2359430D4B591A51433E -:108910000A235943401A0B49386240187862F8BD5F -:1089200000000C5A0100665A010094780100A086EC -:1089300001003C001C4D000000487100B0D68C00C6 -:1089400088100000803801005812000070110100EA -:1089500030B5194B0228DD6806D1002904D12B1C43 -:108960000C339C1A64235C43022809D1012907D1E6 -:1089700064237D243C00584D0000E4006B431C1927 -:10898000A0235343E41A0A235A43032809D1002998 -:1089900007D11323FF24E4006B431B199B1A1C1CF3 -:1089A0005C43032808D1012906D10E2005496843FC -:1089B0004018801A041C3C00944D00004443201CC5 -:1089C00030BD00007C7801008408000010B5074C21 -:1089D0000C2360780549143158434018406801F071 -:1089E0004FFC0021607802F04BFF10BD4C7B010072 -:1089F0000C48F8B540780C233C00D04D00000A49E3 -:108A0000584314314418261D60CE301C0BF00BFD6A -:108A10000027412047550548291C02F0F0FE281C7C -:108A200001F031FC0434C0C4F8BD4C7B010055801A -:108A30000000B0B50A4D4C2128783C000C4E0000D7 -:108A4000094A41438C1822680121FBF7E1FA287892 -:108A500001F0FAFB3C23E056411E012007F034FBF5 -:108A6000B0BD00003C7C010058E301000C23074925 -:108A70005843401880B54068416B00293C00484E7F -:108A8000000002D00BF0FBFD80BD0BF02CFD80BD83 -:108A90000000607B010038220A4B4243D2180029B3 -:108AA00080B504D0022907D10BF0FBFC80BDD26A4F -:108AB0000121FBF7B0FA80BD03218620FCF73C00C2 -:108AC000844E00000FFA80BDD4E40100B0B5040666 -:108AD000240E0C200E49604340184568A86B0028FE -:108AE00003D10021201CFDF7E1FA201C07F0F2FF62 -:108AF000002808D0281C6030C179012903D9FF3132 -:108B00003C00C04E0000C171FF3181710121201C69 -:108B100002F0C5FEB0BD607B010070B50006000E1E -:108B2000051C4C230A49584344183C20005DFF3083 -:108B300006063616281C01F090FB0021281C22682E -:108B4000FBF73C00FC4E00006FFA311C002007F0E0 -:108B5000C7FA70BD58E301000C220F4B4243D218F4 -:108B600010B5546800290DD002290FD12C20005DCA -:108B7000002803D007210C20FCF7BAF9201C0BF0C9 -:108B8000BBFC10BD3C00384F0000002102F08DFE00 -:108B900010BD04210C20FCF7AEF910BD0000607B75 -:108BA000010080B5002907D00C230549584340181F -:108BB00040680BF04AFC80BD012102F076FE80BDCA -:108BC0000000607B01003C00744F000010B5041CE5 -:108BD000002905D002291AD1201C0BF0EBFC10BD96 -:108BE0000D4804700D4807F007F90D48018801226F -:108BF0001203114301804C200A4960434018403061 -:108C00000078FDF75DFD201C3C00B04F00000AF02D -:108C1000D4F810BD03218620FCF773F910BD3C7C0D -:108C20000100054E00003280070058E30100FFB547 -:108C3000051C012083B001900C205D4A6843861812 -:108C40000127002974680ED002293C00EC4F000077 -:108C50006AD12C20005D002803D006210C20FCF7EF -:108C600053F9201C0BF020FD07B0F0BD524814381A -:108C70004570A06B002807D0504807F07FF801210D -:108C8000281CFDF725FA1CE04D4807F03C00285051 -:108C9000000077F84A48143805704B4801880122D3 -:108CA0005203114301804020005DFDF712FDB068C2 -:108CB000002809D1281C07F064FFB060002803D108 -:108CC00009210C20FCF723F90598002803D03C006B -:108CD00064500000E06C0130E0640EE06720005D4D -:108CE000002807D1E06C002804D139480238C06A56 -:108CF000A06409E0206D002801D0002704E0281CB2 -:108D000007F000FF0028E5D105982065201C2030E1 -:108D10003C00A0500000626A0290817B281C07F092 -:108D200078FF002F19D0201C6030C1794A1CC27115 -:108D30008079814202D2012001E040E000200190D0 -:108D400000280AD025480078800706D500F00DFBE2 -:108D5000011C3C00DC500000201C0BF015FD0190B4 -:108D6000019800280FD00298007B022803D1201C14 -:108D700004F0D0FE84E7012800D07EE7211C301CDF -:108D800004F0E2FE7CE7251C6035E879FF30A8712D -:108D9000687A06F03C00185100009DFC0DF047FE7B -:108DA000071C05F012FF3F180298817B20690430F0 -:108DB00000F035FA616A05F0EAFE39186B7A3088FE -:108DC0008031094A0DF091FE5DE703210C20FCF78C -:108DD000AAF858E700003C0054510000607B0100F5 -:108DE000A54D0000C94D0000328007001D7501002F -:108DF0008D4E0000FFB581B01F1C051C141C101CFB -:108E00000A9E00F0F5FC291C1031201D0622FBF7FC -:108E1000B7F9A88E2080E88E3C0090510000608059 -:108E20000299201C00F007F9FF34013466602760C6 -:108E300005B0F0BD0000F8B50F1C1E1C051C141C6D -:108E4000101C00F0D8FCA888391C2080288960807C -:108E5000201C00F0F0F8FF3401343C00CC5100003D -:108E60006660F8BD70B5041CC0680568201C14302D -:108E7000061C00F00FFB002816D0012202212069F9 -:108E800005F0F8FA002801D0FBF724FF00220221A8 -:108E9000206905F0EFFA002806D0FBF73C000852E5 -:108EA000000001FF002802D0301C0BF07CFB688919 -:108EB0008007C00F03F0A7F818230449584340184F -:108EC000C168002902D0201CFBF7D4F870BD94675C -:108ED0000100F8B5041C101C0D1C191CFF223C00DD -:108EE000445200000027FF2D25D0002905D04B88D3 -:108EF000002B02D000F050FC15E00021104E4B007A -:108F00009E190223F65E864201DD0A1C04E001314F -:108F10000906090E2629F1D3094E500080194E2367 -:108F20003C0080520000C05E272A07D20649203943 -:108F300049574731401A2060012702E07E20C04394 -:108F40002060381CF8BDFA470100B0B50C1C7E212A -:108F5000051C0020C943002C0FD0101C05F06BFD30 -:108F600000283C00BC52000002D0211CC93901E09D -:108F7000211C86390220C043FBF7B4F9011C0120F3 -:108F80002960B0BD98B5141C00220092221CFDF788 -:108F900043FE98BD054980B5086005490120C861B8 -:108FA000012100203C00F852000003F01CFE80BDAF -:108FB000000020670100AC7C010080B5002100208A -:108FC00003F011FE06F00DFB02490020086080BD91 -:108FD000000020670100034901200969002900D130 -:108FE0000020704700003C0034530000106701006F -:108FF00003480069002801D040697047002070478D -:109000001067010070B5161C0D1C041C002801D04F -:10901000012C07D100F036FA002805D013F0CAF968 -:10902000002801D1012070BD3C00705300000120D8 -:10903000002C00D000200A4C043461C4103C00F025 -:1090400024FA002802D000F0C6F901E000F0E5F8AB -:10905000C030C36B221D07CAFBF720F8002070BD8B -:109060000000D4670100F8B50D1C3C00AC530000B3 -:109070000021041C281C05F0E3F9231CFF332133D5 -:10908000FF27002805D02222011C181CFBF796F8A8 -:1090900000E01F700321281C05F0D2F9261CFF36C2 -:1090A0004136002805D00322011CB01C3C00E853C7 -:1090B0000000FBF786F800E0B7700121281C05F0DE -:1090C000C2F9002807D0011C201CFF300A224630BC -:1090D000FBF777F800E077713221281C05F0B3F92F -:1090E000002807D0011C201CFF30122250303C0009 -:1090F00024540000FBF768F800E0F7730621281CF1 -:1091000005F0A4F9002807D0011C201CFF30042220 -:109110006330FBF759F8F8BDFF346134A770FAE704 -:10912000084980B50968002801D107480168081C72 -:109130003C006054000005D103219020FBF71DFF87 -:10914000002080BD01F0D7FB80BD1C6701002067B7 -:10915000010080B5FFF7E7FF80BDF0B5002484462D -:1091600000200BE08740174007D014230B4D4343EA -:109170005B193C009C5400001B7C65462B55013458 -:10918000013001273B1C0E2800D300230E883D1C14 -:10919000A64200DC00252B40E7D10C80F0BD00008A -:1091A0007440010078B5041C01202070082000AB39 -:1091B0000D1C18803C00D8540000161CA01C6946E9 -:1091C000FFF7D1FF00AB0022D243198882406170C3 -:1091D00032202870102018803240A81C6946FFF702 -:1091E000C2FF00AB1888687078BD80B502F035FF0B -:1091F0000021002800D03C00145500000169081C23 -:1092000080BD00000549002801D0C86800E0086959 -:10921000002801D00430704700207047106701001B -:1092200003480069002801D00430704700207047CF -:1092300010670100024800693C00505500000028FA -:10924000FFD1704700001067010010B5054C206980 -:10925000002803D104219020FBF79BFE206910BD5C -:1092600000001067010010B5041C00F040F9002850 -:1092700001D0002010BD201C00F03C008C550000E7 -:1092800057F9002801D0012010BD022010BD0000B8 -:1092900070B50F4E041C30680D1C002807D0211C2F -:1092A000043005F0C1FB002801D030680BE0094A0A -:1092B0001068002809D0211C141C04303C00C8553B -:1092C000000005F0B4FB002802D020689C3000E0CC -:1092D0000348405D70BD206701001C670100CC475A -:1092E0000100044900200969002902D0FF31013141 -:1092F000886970470000106701000148007A3C004F -:109300000456000070470000AC7C0100FEB5061C4E -:1093100000201F1C141C0029029019D0012926D0FE -:10932000022947D12648007805F0A0FBA0720AF078 -:109330004FFC0E2809D1A07A05F0AAFB002804D022 -:109340003C00405600002048007805F092FBA072D7 -:10935000002020722FE01D4D2868002801D1FBF766 -:1093600052FE00972A68231C1832111C301CFCF78F -:10937000DEFB26E0301C0CF0CAFB051C02D0A868FE -:1093800000283C007C56000008D1134800680028E3 -:1093900001D1FBF73BFE104800681830021C0E4854 -:1093A00000970168231C1831301CFCF7C3FB002D0B -:1093B0000AD040352888800606D40020206003E0CB -:1093C000012190203C00B8560000FBF7F4FD029804 -:1093D000FEBDB069010090570100206701001C67C5 -:1093E000010080B5002002F04AFE1823054A5843C8 -:1093F000801840690121002800D04178081C80BDF8 -:109400000000946701003C00F4560000024908691E -:10941000002800D1C8687047106701000348C06881 -:10942000002801D004307047002070471067010009 -:1094300010B5054CE068002803D105219020FBF70A -:10944000BDFDE06810BD00003C0030570000106713 -:109450000100F8B50D1C002A03D01149124F0E78F7 -:1094600001E0114F0C26082E01D2341C00E0082424 -:10947000012101704470391C221C0230FAF7CBFE26 -:10948000321B002A07DD322028703C006C57000098 -:109490003919A81C6A70FAF7C1FEF8BDFF202870C0 -:1094A00000206870F9E70000A4690100B0690100BC -:1094B000905701000149486270470000946701001D -:1094C000034980B508600121012003F03C00A85742 -:1094D0000000C5FB80BD1C67010080B50021012094 -:1094E00003F0BDFB06F0B9F802490020086080BD1A -:1094F00000001C67010003490120C968002900D150 -:10950000002070470000106701000348C0683C005D -:10951000E4570000002801D04069704700207047E0 -:109520001067010080B50221012003F09BFB80BD84 -:10953000054A80B512690021002A03D0111D05F0EB -:1095400091FA011C081C80BD10670100064A80B515 -:109550003C002058000012690021002A05D0111C8F -:10956000FF31213105F08BFA011C081C80BD10670A -:109570000100054A80B5D2680021002A03D0111DE0 -:1095800005F073FA011C081C80BD10670100064A33 -:1095900080B53C005C580000D2680021002A05D04C -:1095A000111CFF31213105F06DFA011C081C80BD32 -:1095B00010670100FFB50D1C1F1C87B0109E002412 -:1095C00002F072FD1823134958430858002819D097 -:1095D000041C331C3C00985800003A1C281C0999B4 -:1095E000FAF79FFD041C14D0182000AB1880AA685D -:1095F00001A86946FFF7E7FD6A4601A9002007F0C8 -:1096000044FE002805D10A2100E00F219020FBF73D -:10961000EAFC201C0BB03C00D4580000F0BD000058 -:109620009467010010B5002402F044FD1823054999 -:10963000584340188068002802D0FAF771FD0124D1 -:10964000201C10BD9467010080B5024B00F04EF85D -:1096500080BD0000106701003C001059000080B57B -:10966000024B00F046F880BD000011670100F8B51C -:109670000E1C151C00281C4910D048681C4A288064 -:10968000002007E00B181C7A142363439B181B7CF3 -:10969000335401302B888342F4DC3C004C590000E9 -:1096A00024E000200F1C002408600FE0305D05F06E -:1096B00007FA0E2801D10020F8BD391908720122DD -:1096C000396882401143081C386001342888A04260 -:1096D000ECDC28887860FFF7B7FE00283C0088594A -:1096E000000006D00169002903D07F21C9430BF097 -:1096F00052FB0120E3E72C7D01007440010010B50E -:109700001C1C00280BD020780E2805D214230C4AEC -:1097100058438018007C00E0002008700EE03C00F8 -:10972000C4590000087805F0D1F92070FFF792FEC7 -:10973000002806D00169002903D07F21C9430BF01E -:109740002DFB012010BD00007440010080B52720D2 -:10975000C04309F031FC80BD80B52720C04309F02B -:109760003C00005A000039FC80BD80B5282009F07B -:1097700042FC80BD000080B5282009F04AFC80BD75 -:109780000000B0B5012828D1012901D0FBF76BFCFE -:10979000FFF7E9FD02281AD107F013FC124C2169EA -:1097A00088423C003C5A000015D007F00DFC2061B7 -:1097B00020687D24E40044430DF0AEF9051C07F059 -:1097C0000BFC281A844200D9241A0122211C0A20E9 -:1097D0000DF0B2FDB0BD002109200CF075FCB0BD4C -:1097E00007210A203C00785A0000FBF714FCB0BDAA -:1097F0000000D46701007D20024900010860704725 -:109800000000D467010010B5816D041CFF304630A4 -:109810000CF0D1FC201CFF305030A16D0CF0CBFCC3 -:1098200010BDB0B5041C3C00B45A00000D1C02F081 -:1098300059FC201C02F056FC1823044958434018D8 -:109840001822291CFAF770FDB0BD000094670100D2 -:1098500010B5041C09F0BCFB201C09F0C7FB10BDAF -:1098600010B5041C09F0D0FB3C00F05A0000201C8D -:1098700009F0DBFB10BD70B50C78061C48884D78EC -:10988000E200801AE900401A011C414312312420F1 -:10989000FAF791FD211C6143C9004018291C694356 -:1098A000C90042180C4988790C4B3C002C5B000025 -:1098B00053430C4A1360537B34021460527B88710B -:1098C00001335810084B801A0121490258430028DF -:1098D00000DA494208188012213870BD20100700B4 -:1098E000EC04000000A00700030300003C00685BDC -:1098F000000010B5041C06210430FAF770FCFF20AC -:109900002130FF210155201CFF3041308170417111 -:10991000C173FF2063300155002020616061FF3476 -:109920000134A060E06010BD000070B5061C3C0072 -:10993000A45B0000081C58609A601C1C1E60151C6B -:109940009B8AE28A311C02F0A1FC281AE06070BDFB -:1099500070B5041C081C111C1E1C0025EB43221CA6 -:1099600018320BF0F7FB221CFF325032111C0A395F -:109970003C00E05B00000123201C00F0C6F80C282E -:1099800010D00125201C0BF0ACFA201C00F019F8B7 -:10999000201C00F00AF8201C00F029F8311C201CC3 -:1099A0000BF017FA281C70BD0000FF211D3109586B -:1099B00080303C001C5C00008907002901DA01218D -:1099C00000E00021C1627047011C803100220A635F -:1099D000074A1268002A09D04288920606D5FF304D -:1099E0000130C069400701D40120086370470000BE -:1099F000AC6901003C00585C000080B5011C4A883D -:109A00000020520505D5FF310131C969490700D44D -:109A1000012006F0ECFB80BD0000F8B5051C98683D -:109A2000171C0E1C1C1C002802D1201C0CF031F845 -:109A3000AB69391C301C3C00945C0000A2680BF040 -:109A400095FBF8BDF8B5161C0D1C1F1C002402F078 -:109A500061FB18230649584340184368002B05D082 -:109A60003A1C311C281CFAF78EFB0124201CF8BD7F -:109A70009467010080B507F03C00D05C0000C5FA97 -:109A8000094908610868002802D17D2000010860AA -:109A900008687D21C9004143002301220A200DF0FE -:109AA0004EFD80BD0000D467010080B501210A2071 -:109AB0000DF097FC80BDF8B50E1C3C000C5D00005D -:109AC0005168141C1268A5680B1C751B5719974226 -:109AD00000D20131426800258A4202DD0125626020 -:109AE00005E09A4203D10168B94200D90125002D51 -:109AF00009D001682160A660A38AE28A3C00485D23 -:109B00000000606802F0D7FB301AE060281CF8BD46 -:109B1000000080B502F007FB1823034958434018A2 -:109B20001821FAF798FB80BD000094670100FEB58C -:109B3000041C081C111C1E1C0C25012200923C0058 -:109B4000845D0000A26902ABFDF7F0F8002845D063 -:109B500002982721021C0A4001D1084302902149A2 -:109B6000A069084006D00298014003D14921C900EC -:109B700008430290A06D0299884230D0002E2DD06B -:109B80003C00C05D00004021201C5830FAF769FB02 -:109B9000029800250026371CA06519E0C00711D5E2 -:109BA000F019001970300571281C04F0D4FF00284A -:109BB00004D0A01980300572013603E0E01960304E -:109BC00005703C00FC5D0000013701352D06029850 -:109BD0002D0E4008029002980028E2D18420065100 -:109BE000F0192067E765002500E00B25281CFEBD65 -:109BF000D83A000038B5051C081C111C0024E243AB -:109C00006B46FFF73C00385E00004FFA002805D095 -:109C1000A86900990140814200D10124201C38BD6F -:109C200000007CB5056A8669041CC068FBF7B7FBB9 -:109C3000E169FBF7DAFA201CE2694030C18B128936 -:109C40008918C18306493C00745E000001940091AC -:109C50002869331C82880168E068C06800F0F2F966 -:109C60007CBD0000915E0000B0B5D1685569C86840 -:109C7000141C144B0CE002689A4207D1C268CA60F7 -:109C80000021C1600160FBF73C00B05E000073FB87 -:109C900003E0011CC0680028F0D1E068C068E860FB -:109CA000E068C560201C4030C18B2A898918C183B7 -:109CB0002068002802D0FFF7BAFFB0BD044804F0C6 -:109CC0004EF9006A07F077FAB0BD3C00EC5E000088 -:109CD000A07E0100A06A0100F1B582B00298066979 -:109CE000011C083660314568019182E01021002096 -:109CF0002F69FBF763FB6861018908390904090CC6 -:109D000001816869006840180821FBF73C00285F62 -:109D1000000057FBE86168697188006820220180B3 -:109D2000716841600199497B89011143C17000212B -:109D300081702820FBF775FC3988041CC181A86B51 -:109D4000002803D1012080020843E08106223C0064 -:109D5000645F0000391D201C1030FAF7C5FA391C69 -:109D60000A310622201C16300090FAF7BDFA391C81 -:109D700010310622201C1C30FAF7B6FAE189254A78 -:109D80005C201140012292031143405BE1810F21CD -:109D90003C00A05F000008406084201C2030162199 -:109DA000817100212170E96B002907D02969098B95 -:109DB0000907090F2170A184182181710622601CF6 -:109DC0000099FAF794FA7068000EE071706800026A -:109DD000000E3C00DC5F0000207270680004000E82 -:109DE00060727068A0727088000AE07270882073D8 -:109DF000708801300004000C708002D1706801305E -:109E00007060AC61029828622D68002D00D079E75F -:109E1000029804493C00186000004268044804F0BD -:109E200074F8FEBD00008FC7FFFF3DDA0000A06A96 -:109E30000100B0B5074D2878032808D000242C7005 -:109E40006968002903D00120FAF7C8F96C60B0BD39 -:109E500000009C7301003C0054600000F8B52B4BDF -:109E6000D86A002850D02A48011CFF310131CA6845 -:109E70000132CA601A6C002A02D14A6901324A6171 -:109E80000A6901320A61DA68002A04D01F4A0132E5 -:109E90001278002A02D18A693C00906000000132E9 -:109EA0008A610025071D18261A4A6E43743290599C -:109EB000002829D0B4186069002825D160680028DE -:109EC00002D00168002905D1A16800291CD00968C9 -:109ED000002919D0002805D0E1683C00CC600000C2 -:109EE0000131E1600068814211D3A068002806D0EA -:109EF0002169006808180CF0A3FD002807D0064A65 -:109F00000120606174329159381CFAF770F90135FB -:109F1000022DCBDBF8BD0000447D01003C00086150 -:109F20000000F4670100F8B50F1C0025041C002890 -:109F300025D0201C04F003FE002806D0FFF7FFF810 -:109F4000041CFFF750FB061C07E0201CFFF791FBE9 -:109F5000061C201CFFF76FFB041C002E06D03C00E3 -:109F600044610000FFF74CFB002802D001250120CE -:109F700007E0002C06D0FFF7EFF8002802D00125FB -:109F800000203860281CF8BDB0B5C568041C0DF071 -:109F90008FFC207EC10708D5E168A94205D9226956 -:109FA0003C0080610000914202D3E18A0131E182EC -:109FB000810708D5E168A94205D22269914202D8F9 -:109FC000E18A0131E182400706D5E06821698842D3 -:109FD00002D1E08A0130E082E08AA18A88420DD372 -:109FE000607E3C00BC61000002280BD02068E16864 -:109FF000042207F065FB607E002803D1206808F08A -:10A00000ABFFB0BD0020E082B0BD000070B5061C03 -:10A010000C232049584345180020A860301C06F046 -:10A0200091FE041C3C00F8610000686033D0012000 -:10A03000A8702C20005D022803D1201C03F045FEEF -:10A0400010E0616B00290AD0012804D1211C281CD2 -:10A0500003F055FE06E0201C0AF00DFC02E0201C77 -:10A060000AF03DFB0D483C003462000014384168A2 -:10A07000002910D0201C4030028B1207920F012AB9 -:10A0800009D0808B32020009000410438122024370 -:10A090000C200DF0B7F90CF0A5FD606470BD000058 -:10A0A000607B0100FFB5081C3C0070620000111CC1 -:10A0B0000C32202414430C4A83B00CAE526860CE9C -:10A0C00094700024D47093630D234027BB52946195 -:10A0D000148401220292321C00900191231C291C3D -:10A0E000039800F066F907B0F0BD3C00AC620000D8 -:10A0F000A07E0100F8B5041C0027114E1DE0E068A9 -:10A10000002870680CD1808800070DD101210C480F -:10A11000FBF784F9C460E86070688188013102E06F -:10A120008188228989188180E068391C3C00E862B6 -:10A130000000002801D17168C96D251C6160041CF4 -:10A14000002CDFD1F8BDA07E0100064910B549689A -:10A15000002305E08A88048912198A804360C06858 -:10A160000028F7D110BDA07E010010B509493C00C0 -:10A1700024630000002449680AE08A880389D21811 -:10A180008A80C368221C002B00D1CA6D4260181C53 -:10A190000028F2D110BD0000A07E0100011C134870 -:10A1A00010B54068002309E082880C89121982806A -:10A1B0003C00606300004B60CA68002A00D1416621 -:10A1C000C9680029F3D1011C68318164C364436507 -:10A1D00082880823111C08318907890F591A5023D6 -:10A1E000195251188180011C406E4831C16010BD68 -:10A1F00000003C009C630000A07E010010B50749F0 -:10A2000000244B6806E0C268211C002A00D1D96DE9 -:10A210004160101C0028F6D110BD0000A07E010096 -:10A2200070470000FEB5061C0C480C1C40688021DD -:10A23000817000213C00D8630000C170151C4022D1 -:10A2400081631152816101840020042202920090F6 -:10A250000191291C201C1A1C331C00F0BCF8FEBD07 -:10A260000000A07E010070B5061C1748807802210E -:10A27000164A884390703C0014640000101C8078DB -:10A280000843111C887013480024C4707020FBF729 -:10A29000D9F9114D70216860FAF734F83007000FD2 -:10A2A00069689030C8650D4868220880081C28300D -:10A2B00089604861082008823C0050640000081C46 -:10A2C00038304863203848645A20505406480831D2 -:10A2D0004164446570BD0000070058000700A07E7F -:10A2E0000100DEC00000003007000A4B10B5586DB9 -:10A2F0000A490022496800244A623C008C6400003C -:10A300005C654B6E002B01D0DA604A668B6D002BCA -:10A3100003D00A6E0021F9F79CFF10BD0030070042 -:10A32000A07E0100094910B508880130088001208D -:10A33000074980020860074CA26D002A3C00C864EF -:10A34000000005D00521D1200DF06FF90120A06596 -:10A3500010BDB07401000010070000300700FFB509 -:10A3600083B00CAE86468C460E4A43CE0FAD0F1C12 -:10A3700052680C3730CD9770D37096630D263C0031 -:10A38000046500004027BE52059E9661138400229A -:10A3900002922A1C00900191211C6046734600F035 -:10A3A00029F807B0F0BD0000A07E0100FFB5101C29 -:10A3B0001A1C0C1C191C6023FF3213430C4A83B077 -:10A3C0003C00406500000CAE526860CE93700023E4 -:10A3D000D37093634027BB5293611384032202928C -:10A3E0000191291C321C0090201C039B00F005F8F1 -:10A3F00007B0F0BD0000A07E0100F8B5051C1148B3 -:10A400001C1C3C007C650000089B079F4068DE0028 -:10A4100081650266002181800D488159201CF9F771 -:10A4200022FF0B4830184168281CF9F71CFF074928 -:10A4300006984968002C88620F8600D12C1C0548BC -:10A440004C6245653C00B86500000121016501646E -:10A45000F8BDA07E01009052010000300700FFB55A -:10A4600083B00DAE60CE0C9F081C111CD219FF32B8 -:10A47000402414430B4A526894700024D4709363B0 -:10A4800040239F5294613C00F46500001484022232 -:10A490000292321C00900191231C291C0398FFF7A3 -:10A4A000B5FF07B0F0BD0000A07E01004C210D4AB1 -:10A4B000414310B58C180C490978884207D105F042 -:10A4C000C7FD0A48018801223C00306600001203E3 -:10A4D00091430180201C30300C23C156407B8142C7 -:10A4E00002DD208D0CF0E5FB10BD58E301003C7C43 -:10A4F000010032800700011C603180B5CA798B7978 -:10A500009A4207D9487A0C2307493C006C66000040 -:10A510005843085A0CF0D0FB80BD2030007B012846 -:10A52000FAD1487A05F040FD80BD0000607B010053 -:10A5300010B5041C1C21F9F703FF0348A080E0803C -:10A5400020816081A08110BDFFFF00003C00A86653 -:10A550000000FFB5041C002083B00D1C062C0290E7 -:10A5600038D21F4AFF26C10089188978A14203D139 -:10A57000C0008018467804E0013000060016062866 -:10A58000F1DBFF2E24D00193201C0DF0E8F93C00F4 -:10A59000E4660000002805D02421281C01AB02AA93 -:10A5A000FAF730FE1049F00030390F58310609161D -:10A5B000281C059A019BF9F76EFE061C10D1201C81 -:10A5C0000DF0D0F900280BD0281C6969FAF712FEAB -:10A5D0003C00206700000298686104E0062C01D36B -:10A5E000072600E00826301C07B0F0BD0000CC5A5A -:10A5F000010010B50C1C09F086F8002802D0201CC0 -:10A6000009F0B5F810BDFEB5134D041CAE69002E5F -:10A610001CD03C005C670000104F30377868604306 -:10A62000011C2888F9F7D2FF39686143411801A855 -:10A63000321CF9F737FE0298296A401828620BD4B9 -:10A64000E969884208D9A969401A2862019801304D -:10A6500001E000203C009867000002900190019802 -:10A66000FEBDC8740100F8B5002828D00024144DA0 -:10A6700000E0013461000919491949780029F8D12D -:10A6800063001B1903330722694603F0D4FB002C37 -:10A690000FD0002000993C00D46700000AE042007F -:10A6A0001218AE5C531852195E71567801309E71C3 -:10A6B0009278DA71A042F2DB00980322023003495B -:10A6C000F9F77EFEF8BD0000EB620100E8620100D0 -:10A6D000B0B5051C081CFAF73C00106800009DFF8F -:10A6E000041C281CFAF7D9FE211CFAF7FCFD201CDB -:10A6F000B0BDF3B544480C1C007881B0012872D17C -:10A70000FAF782F8414DE86A41490860E86B486011 -:10A710004048FAF7A6F9E86A00283C004C680000B7 -:10A72000FCDA221C0F2001990AF0A4F8384D022708 -:10A730002F63384A64260020AA21083213180130FA -:10A740000004000C64281974F8D3168100205060AE -:10A75000101C103010600025171CD2603C00886867 -:10A76000000008E0281CF9F7A2FF413178190135F3 -:10A770002D042D0C0174B542F4D3264D6F630120D6 -:10A780002863244DE86A0028FBDA0B223B1C244E88 -:10A7900003E00132642A00D10022101C0C213C008D -:10A7A000C46800000139755C1F183F7CBD42F3D1BD -:10A7B000013800D563200029F4D1184E501CF16BEC -:10A7C0001A4A101C0138FDD1F06B884201D0011CDF -:10A7D000F7E702273763164D9021281CF9F7CEFDC5 -:10A7E0003C0000690000281C28302860281C10301C -:10A7F0002F81E860281C20302861042100E00CE053 -:10A800002983E861ED62756301203063221C892091 -:10A8100001990AF038F800202863FEBD00000857AF -:10A8200001003C003C69000000300700108E010070 -:10A8300074FF010009570100204E0000E4FE0100F2 -:10A8400080B513281ED0F02816D109F0B5F90028DC -:10A8500013D10DF0BFFA11F00DFC00220421C42029 -:10A860000CF01CFF3C0078690000094800210078CA -:10A8700005F03FFD05F093F807490120086080BD11 -:10A88000011C0120FAF787FC80BD00F032F880BD82 -:10A8900000006A5701003CD90100B0B50CF0FFF987 -:10A8A0000B49022448603C00B46900000A48046176 -:10A8B0000120772109030861084D6868800702D4E8 -:10A8C00068682043686009F0C7F96868A043686059 -:10A8D0000020B0BDE060010000300700000107006B -:10A8E00080B50123032200213C00F0690000022012 -:10A8F0003CF0F1FA002801D0FAF781FC80BD1CB5CC -:10A90000FCF7F5FAFAF719FE01F003F90024211C0F -:10A91000684601F0E2FB00AB1878012803D002285A -:10A9200001D0032801D10CF0B2FC3C002C6A0000DD -:10A93000013424062416062CECDBFAF709F9FAF7A1 -:10A94000E7FCFAF733FAFAF76DFAFBF7DFFF05F0E9 -:10A950004DFB06F081FC0BF07DF907F029FC114856 -:10A960001021016009010160C90201603C00686AB0 -:10A97000000089000160202101600421016008219C -:10A98000016040210160802101608900016049006F -:10A9900001604900016049000160C9030160890B41 -:10A9A0000160F9F741FF1CBD0000001007003C00EA -:10A9B000A46A000080B53BF04FF83BF07DF9FAF750 -:10A9C0004BF980BDF8B5002500240022002871D085 -:10A9D000434FB9680B1ABB60F868391C0130F86046 -:10A9E000896A002B1EDC0224002906DAFB699842E2 -:10A9F0003C00E06A000006DD3B69984209DD07E0A3 -:10AA0000BB69984201DC012403E07B69984200DDC8 -:10AA10000324786A002808D000207862032C01D132 -:10AA2000022402E0022C00D101242E48012C0079DE -:10AA300018D13C001C6B0000BB78994215DA3B78BA -:10AA40007B7039700131B96201D50131B962B96ADF -:10AA50000125994203D1042804D2013000E00020EE -:10AA600038710122002933DA27E0032C35D1002682 -:10AA7000002807D03C00586B00001E498140386A0E -:10AA800008180CF05CF800282CD01B480078400710 -:10AA900005D5F8683969884201DB0323FE56B86A98 -:10AAA000B04212DD01217962397801257970387060 -:10AAB0000138B86288423C00946B000001D000214C -:10AAC000397100280CDA0720387100E012E007E045 -:10AAD0003879002809D0FF30387106E0002A02D00A -:10AAE0000CF0F8F83862002C04D0FEF797FD291C12 -:10AAF00008F0FCFBF8BD00003C00D06B0000AC7E11 -:10AB0000010050C300001D75010080B510680028C9 -:10AB100002D000F00AF880BD0348C069806808F0E0 -:10AB2000B2F980BD0000846A010010B5041CC06841 -:10AB3000C068002801D1FAF77AFB3C000C6C0000D9 -:10AB4000E068E169C068231C014AFFF7D7FB10BD2C -:10AB5000DD6B0000B0B5051C0C210020FAF7D6FC17 -:10AB6000041C006800214160016029880181698816 -:10AB70004181291CFF312131201C03F03C00486C2D -:10AB8000000077F9291CFF314631201C03F071F9D0 -:10AB9000291CFF315031201C03F06BF9291CFF31B7 -:10ABA0004331201C03F065F9291CFF316331201C5F -:10ABB00003F05FF904480068002802D0201C3C0024 -:10ABC000846C0000FFF78EFD201CB0BDE462010024 -:10ABD000F8B5051C0C1C04D105211820FAF702FB5E -:10ABE0004DE0291C12310622601CF9F725FC221CBD -:10ABF00030320026002100201670344B1B5C2F8A57 -:10AC00003C00C06C0000DF40FF0707D51778013318 -:10AC100001371770671830377B70013101300E280B -:10AC2000EEDBA87B6072107800282BD02A481E210A -:10AC3000095C271C1037217201686181C189217765 -:10AC400081893C00FC6C00007973C18AA181018B71 -:10AC5000E181428A211C60314A80828A8A801F49B0 -:10AC60002C31097A002909D002290AD10122626215 -:10AC70006272428BA281808BE08103E001216662D7 -:10AC800000E000213C00386D0000E87B084001D165 -:10AC90000020F8BDA868431C09D0221C1232009283 -:10ACA000931D0232211C01F09CFAA06200E0A66212 -:10ACB000687B291C1D3120740B4820222062201C37 -:10ACC0004230BE73F9F73C00746D0000C1FB4034A4 -:10ACD0002670687E0449607068682C3148600120E5 -:10ACE000DAE7000090580100C86E010091020100EF -:10ACF00070B5161C0D1C041C002806D00C20FAF799 -:10AD000047FD30C0083806723C00B06D000070BDD1 -:10AD1000002070BD0000011C054880B5006801D00E -:10AD2000012100E00021FCF7A0FC80BD00000C79AF -:10AD3000010070B50E1C041C002801D1FAF78FFA2F -:10AD4000064D2868002801D0FAF73C00EC6D0000A1 -:10AD500089FA04482E60C4600121017070BD0000B2 -:10AD6000A87E01003000070010B5074C20680028BD -:10AD700001D1FAF777FA054800692168F9F7DFFA97 -:10AD80000020206010BD0000A87E01003C00286E5D -:10AD900000003000070001200549C00680B50860AA -:10ADA0000022032154200CF0B8FC80BD00000010EC -:10ADB000070080B500220421C4200CF0AEFC80BD49 -:10ADC0000000044880B500880249FFF7B8FF3C0046 -:10ADD000646E000080BD0000754B0000C874010067 -:10ADE000F8B5061C31480025C0680C1C002830D07E -:10ADF0002E482F4F0430007838762C4804304078A5 -:10AE00003881002A0BD0F9F7A5FA1F20B876201C4C -:10AE10003C00A06E0000F9F7F6F925480430807870 -:10AE2000B87643E02548224984424D6902D26C43FA -:10AE3000E40B0FE01F48211C806A0090F9F723FC07 -:10AE40000099021C4A43A11A1A4A6943526AC90B63 -:10AE500050433C00DC6E00004418022C01D8002056 -:10AE6000F8BDF9F77DFA1F20B876201CF9F7AEF986 -:10AE7000041C114804308078B8760F4F7D6AAC42CC -:10AE800004D2201CFFF722FC051C12E0211C281C08 -:10AE9000F9F7FCFB3C00186F0000061C6843201A01 -:10AEA000FFF717FC051C002404E0786AFFF711FC8B -:10AEB00045190134B442F8D3281CD4E70000C87403 -:10AEC000010030000700C0C62D00011C7D2080B5A8 -:10AED000C000F9F772FB3C00546F00000249886122 -:10AEE0004008C86180BD0000C874010010B5064C60 -:10AEF000211C00200BF042FA211C00200BF00AFA62 -:10AF000000F068FE10BD0000856F000030B50F4DE9 -:10AF10002A78042A19D8002A3C00906F000017D024 -:10AF2000002107E04B005B185C190123E4568442C2 -:10AF300002DA01318A42F5DC8A4200D10139480047 -:10AF4000401840198178024A343A1170C078507024 -:10AF500030BD0075010030B5111C3C00CC6F000005 -:10AF6000383185B09162082111860023141C011C20 -:10AF70005363C068154D0BE00268AA4206D1C2684F -:10AF8000CA60C3600360FAF7D1FA03E0011CC0682D -:10AF90000028F1D1221C4032082120683C000870B2 -:10AFA0000000FAF764FB0B49201C4830029004941F -:10AFB0000391E069828801686E2001920091221C51 -:10AFC0005632035D211C28312068FFF758FA05B07E -:10AFD00030BDA07E0100D57000001CB507493C00C3 -:10AFE00044700000021C01900091C069131C848809 -:10AFF000016810684833221CFFF708F91CBD0000E7 -:10B00000C96F000010B5141C184803F089F8A0425D -:10B0100001D0FAF745F90422201C4030A16AF9F763 -:10B020003C0080700000BDF9002802D101202062A0 -:10B0300005E0002020628420005D002803D1201C50 -:10B0400009F023FB05E02068FAF779FA201CFAF7EB -:10B05000A4FBE0698079062806D1206A0649002809 -:10B0600003D03C00BC70000008690130086110BDCD -:10B0700048690130486110BDA06A010028610100E3 -:10B080001CB5141C154803F051F8A04201D0FAF782 -:10B090000DF9201C4F300279417900AB12021143A7 -:10B0A000C27812043C00F870000011438278120646 -:10B0B0001143009101784078090208439880201CD0 -:10B0C000694606F03CF9002803D1201C09F0E3FA98 -:10B0D0001CBD2068FAF739FA201CFAF764FBF7E781 -:10B0E0000000A06A01003C0034710000BCB51F4D97 -:10B0F000141C281CDC3003F01FF8A04201D0FAF722 -:10B10000DBF8A06C00AB027881781202114302795F -:10B110001204114342791206114300918179C079DA -:10B12000000208439880201C3C00707100006946B2 -:10B1300006F00BF9002817D001280ED1ED6C002D78 -:10B140000BD08020025DE06C0121002800D100219D -:10B1500060686B460A30F9F723F92068FAF7FBF9C3 -:10B16000201CFAF726FBBCBD201C3C00AC71000083 -:10B1700000F08EFEFAE70000C4690100BCB5041CB3 -:10B18000406A0025002803D06068008B05072D0F5A -:10B19000221C403208212068FAF77EFAA168019546 -:10B1A0000091211C221C6032206850313C00E87163 -:10B1B00000000D1CE36809F0E2FFE069806B0028E5 -:10B1C00003D1FEF7E8FA002801D0182000E0102093 -:10B1D000064901940091E169082309680A18211CB5 -:10B1E0002831281CFFF787F9BCBD357100003C00F1 -:10B1F0002472000010B5101C3830906204201086B4 -:10B20000002050631068141C40320421FAF74AFAF7 -:10B21000231C211C2831024A2068FFF7BDF810BD0D -:10B22000657000000EB5C369021C9888054902923A -:10B230003C0060720000019100901B6810689169E9 -:10B240000322FFF7AEF90EBD0000257200000EB517 -:10B25000021C0649102000900292131C01911068F4 -:10B26000002270330021FFF79CF90EBD000025720B -:10B2700000003C009C72000010B5031C002100205F -:10B28000084C00E00131CA00A2589A4202D00B29B2 -:10B29000F8D310BD0B29FCD2C90009190020087190 -:10B2A000012010BD385801008CB500AB86211980F3 -:10B2B000011C04483C00D872000006F0EEFE01902C -:10B2C000684606F0FAF88CBD0000707C010010B5ED -:10B2D000041C0D480D4994B00480062218310C302E -:10B2E000F9F7FBF801A807F0A2F80C2009A94872A9 -:10B2F00000AB1C8002213C0014730000684603F080 -:10B30000DBFF049001A806F0D1F814B010BD0000D6 -:10B31000587C010080B504F045FE05F053FA80BD6D -:10B3200010B5194CE068002806D0611C0878002888 -:10B3300003D14878FF3008703C005073000010BD06 -:10B34000FF300006000E0870A1680029F7D0002821 -:10B35000F5D10E4854308178002903D1C178FF31EE -:10B36000817010BDFF310906090E8170F9D1A16904 -:10B370000029F6D0808803F0D0FB3C008C730000DD -:10B38000044A011C5C320C3205CA801AA269F9F722 -:10B390001FF810BD447D0100F0B5041C4068002575 -:10B3A0000179002285B0C907CB1769490133896A41 -:10B3B000102905D36649C039086B01303C00C873B9 -:10B3C000000008638EE021680E68F678B706FF0F6C -:10B3D000B609002B049706D063691F1C1B6A5037FF -:10B3E0009F4200D10125002D02D063691B6A04E051 -:10B3F0003C23594F7343DB190433E3619F883C00BE -:10B4000004740000002F70D09B79022B6ED0042BA7 -:10B4100017D0062B69D10868A06108890438088113 -:10B4200020680168043101604E4900295DD0049F05 -:10B43000BA425AD14948221C1C3002F065FE05B0C0 -:10B440003C0040740000F0BD0968251CCA794035F5 -:10B45000261CEA738B79221C503213704B796036AC -:10B4600053700B7993704B78D37009781171002168 -:10B4700029721621B173616A002906D0018B090770 -:10B48000090F3C007C7400002972B1811821B1734E -:10B49000011C0A31201C06224930F9F733F8606894 -:10B4A00014220188E982011D201C5830F9F72AF87E -:10B4B000E88A30490840012189030843E8827089FD -:10B4C0000F2108403C00B874000070812068018999 -:10B4D00008390181206801680831016008210020D5 -:10B4E000FAF783F8051C026820680821FAF7FBF8D0 -:10B4F0002068FAF774F82149C5602FE030E0FFE7D3 -:10B50000216860680A683C00F47400008023A2642B -:10B510001E55E564557913792D025B1995792D0433 -:10B520005B19D5792D065B19957812781202AA1845 -:10B5300015040A892D0C083A0A8121680A68083224 -:10B540000A60E169021C0A323C003075000001A863 -:10B5500009680BF03EF9E0692B1C0168201C703073 -:10B5600001AA0BF086F9094901226DE72068FAF774 -:10B5700022F8201CFAF74DF970E7846A010068612F -:10B580000100557200008FC7FFFF3C006C75000082 -:10B59000417000007972000080B502218220F9F725 -:10B5A00093FE80BD704700007047000070470000A8 -:10B5B00070470000704700007047000070470000AF -:10B5C00080B5C068F9F7FAFF012080BD3C00A8757E -:10B5D000000080B50021FF20F9F779FE80BD70479B -:10B5E000000070470000012070477047000070475E -:10B5F0000000704700007047000080B506219920C8 -:10B60000F9F765FE80BDB0B500250129124C3C005C -:10B61000E47500000FD10AF00FFC00281DD06178FE -:10B620003C235943091904310162611C416284625F -:10B63000041C503406E000290FD13C2050432570F3 -:10B6400004190434002C08D02068002802D02021DE -:10B650003C0020760000F8F718FFA5800720A071B5 -:10B66000B0BD6861010070B5041C002101F041FC0F -:10B670006068002801D0216801602068002801D09E -:10B6800061684160124E7068A04201D160687060CC -:10B69000E0683C005C76000000280BD0002506E046 -:10B6A000E068E900411814200BF0E2FF0135308812 -:10B6B0008542F5DB0621201C4430F8F7E9FE206BBB -:10B6C000002801D0F9F786FFE069002801D0FAF7D9 -:10B6D000AFF870BD3C009876000058750100F0B5D9 -:10B6E0001D4F059D3F6801261C1C331C002F00D0F8 -:10B6F0002B1C1D062D0E002906D011780E23164F87 -:10B700000918097A6B4310E02178002913D0FF3122 -:10B710000DE0012901D93C00D476000001311170FF -:10B7200011780E230F4F490811700918097A6B43DD -:10B73000DB19595C21702178002902D11178002988 -:10B74000EAD10948C068002805D02178301C0029BA -:10B7500000D10020F0BD01203C0010770000F0BDBA -:10B76000000018670100246701005C670100AC7CE1 -:10B77000010084460020F0B5002909D011781A4E46 -:10B78000B170194EB178717031700121316127E0CB -:10B79000164E0123F15663465F683C004C7700006B -:10B7A0000023F6560125CC0FB74200D90025002C06 -:10B7B00001D0002DE8D10E4F3B69002B03D0002DA6 -:10B7C00001D1167002E01C4301D111700120012447 -:10B7D000002B00D000243C61002C02D03C00887774 -:10B7E0000000711C397001E0FF3179700028D5D05C -:10B7F0000120F0BD0000AC7C010090B50A4C002097 -:10B8000093B0206103906846002108F084FD207AFF -:10B81000022801D1E06B00E0206CE06101203C00D7 -:10B82000C477000008F08AFD13B090BDF46E0100EB -:10B83000F7B5051C88880C1C82B01F4F002800D16A -:10B8400000270498002801D1F9F78AFD1B483B1C0A -:10B850000068211C0268281C0092049AFEF73CF83C -:10B860003C0000780000061C22D00321049802F05E -:10B87000B8FF00281BD08078012103F0E4FFA088E6 -:10B88000A18E484300040F49000C088003F081F9A1 -:10B890000122002D00D10022011C0E200BF0C9FE58 -:10B8A000002F3C003C78000008D10021281C02F049 -:10B8B000BDFC03E00026281C00F00AF8301C05B08F -:10B8C000F0BD0000C1A10000E4650100A87C0100FA -:10B8D00010B5041CFEF738F80121002C00D100211E -:10B8E0000E200BF03C0078780000DDFE10BDF8B5AE -:10B8F000071C0BF094FAFDF7BCFE002602281E4D33 -:10B9000001D02E70F8BDFDF73EF8041CF9F759FC84 -:10B91000002814D0FDF777F8002810D002F0F9FBCA -:10B92000002801D000243C00B478000000E0154C51 -:10B93000331C211C072216200BF066FF687880213B -:10B940000843687002F00AFC0028DED128788007DE -:10B95000DBD4FDF723F9002805D12878C00702D5EC -:10B96000FDF742F8D1E702F03C00F0780000CDFB93 -:10B970000028CDD02878022108432870211C381CCB -:10B98000FDF7C1F8C4E7606C01007102000010B55A -:10B99000124C01202070FEF7F0F90121A068FBF79E -:10B9A000F4FEA06803F087FF0D483C002C790000EE -:10B9B000A16807F023FDFBF755FFE06800280DD0D4 -:10B9C000094906200AF024FD084905200AF020FD57 -:10B9D000FBF76EFF002801D005F0F8FC10BD000059 -:10B9E0007869010034630100E13500003C006879AA -:10B9F0000000B1350000F0B5244D234C687C203C9C -:10BA00009BB0002808D0022803D820890138208163 -:10BA100037E000276F7434E01C4E68221436311C66 -:10BA20000C3101A8F8F709FE1848338901213C00C0 -:10BA3000A479000044300A1C002B007B00D1021CBA -:10BA40001206120E0DAF3A709446AA7B931930334A -:10BA50005B7B7B70EA7301321206120E0027824272 -:10BA6000AA7301D3AF7304E06246012A01D1776063 -:10BA70003C00E079000000E071600648074A803829 -:10BA800081674267682201A9F8F7DDFD278108F088 -:10BA900012FD1BB0F0BD84660100E92E0000F1B577 -:10BAA00086B006990020886106988468808D656854 -:10BAB00001283C001C7A00004CD9354949680591A1 -:10BAC000002947D00022002100230390281C96461D -:10BAD000944606680496F2788026B2433F2A2ED810 -:10BAE000D706FF0E0126BE40371C049E5209B678C9 -:10BAF0007600B2183C00587A0000264E92001C36A0 -:10BB0000B2583A401ED003E002900289C068511832 -:10BB10000028F9D10598814214D870460130864634 -:10BB2000002B04D06046D86001986246D06003982C -:10BB30000138039006D03C00947A0000231C24684E -:10BB40006068029A01909446C9E77046012807D9B7 -:10BB50002A1C00213F2001F051FF051C0698856139 -:10BB6000281C01F0B3FF0E480068002807D02868A1 -:10BB7000018840790231091A3C00D07A0000281C63 -:10BB800001F0E5FCA2680698C06806990B69291CBB -:10BB9000F8F77CFC034908690130086107B0F0BD83 -:10BBA0000000FC5A0100CC5C010010B5094A80007D -:10BBB0001258D006C00E0130074B3C000C7B000031 -:10BBC0001C68002CFCDB5A602022121A914019607C -:10BBD00019680029FCDB10BDE86001003020070077 -:10BBE000B0B5124C00252570A168114807F032FC51 -:10BBF0006561FBF7A3FEE06800280DD03C00487BA0 -:10BC00000000FBF7A4FE012107200BF070FD0A499C -:10BC100006200AF04CFC094905200AF048FCA068FF -:10BC200003F067FE0021A068FBF7CDFD05F0ABFB3C -:10BC3000B0BD7869010034630100E13500003C00CB -:10BC4000847B0000B135000010B50F4C207C00282B -:10BC500019D16069002816D1E068002806D00A488A -:10BC60001C38C068002801D005F0CEFB0121072058 -:10BC70000BF040FDA06803F03FFE0448A16807F008 -:10BC80003C00C07B0000DBFB0120207010BD786908 -:10BC900001003463010070B50E4C0122A368E56811 -:10BCA000268A5D1BB54201D1002206E025680133DA -:10BCB0002E68A3602660043503C5002A04D1012143 -:10BCC0009D203C00FC7B0000F9F752FB70BD03494E -:10BCD0000220086070BD000044E30100402007001E -:10BCE00080B502F0B9F880BD80B502212D20F9F7AA -:10BCF0003FFB002080BD000080B502212A20F9F71B -:10BD000037FB00203C00387C000080BD000080B57F -:10BD100001212B20F9F72FFB022080BD00000149F3 -:10BD20000120086170477C780100F8B5061C0C23DF -:10BD30000F1C1749584345186C68301C0BF03FFE28 -:10BD4000002F09D1301C3C00747C000003F0EEFE93 -:10BD5000412007551148211CFFF7A6FFF8BD4120DF -:10BD60000755A06B002803D0201C00F0DFF9F5E791 -:10BD7000201C00F0DBF9AC68002C02D00020A86089 -:10BD8000EDE7301C05F034F93C00B07C0000041CE9 -:10BD9000E8D108210C20F9F7F4FAE3E70000607B12 -:10BDA000010055800000074A80B55070516012783C -:10BDB000064B80005201D218101840380268081C47 -:10BDC000F8F77BFB80BD786901003C00EC7C00004B -:10BDD000FC420100B0B50A49041CC870084DE435A6 -:10BDE000A87A0871082C01D3F9F7FCFAA87A05495A -:10BDF00040014018A1004058F8F760FBB0BD0000BA -:10BE0000606C01008043010080B500283C00287D63 -:10BE1000000001D009F01DF980BDB0B5051C0C1C57 -:10BE200000200860686809F036FB6C60B0BD10B592 -:10BE3000041C09F034FB2168002900D1646010BDA6 -:10BE400000000021016040607047F8B546683C0082 -:10BE5000647D0000041C406A351C0A35002804D0AB -:10BE6000201CF9F789FD071C00E00427291C6069E4 -:10BE700000F0F6FC79000F18BA88F18A051C8A4296 -:10BE800005D13088000502D504F0BEFB3CE02868EF -:10BE90003C00A07D000000280FD001328A4204D16E -:10BEA000F9F70FFC2168C1600BE0F9F7F0FBF08AAD -:10BEB000000704D00021296029E0080727D1206865 -:10BEC0002860F08AB8801348016801310160318828 -:10BED00049053C00DC7D000018D429682160002160 -:10BEE0002960E16900290DD0897902290AD1082148 -:10BEF0002186211C3831A162221CDC30084902F065 -:10BF000081F9F8BD201C00F05FF8FAE7201CF9F772 -:10BF1000EFFCF6E73C00187E00002068F9F7BDFB57 -:10BF2000F7E7C4690100B9710000F8B50F1C097882 -:10BF30000124C90721D502F08CFF002801D000247C -:10BF40001BE00E4E756E002D17D0346E0622311C8C -:10BF5000381CF8F7D4FA3C00547E0000002805D1C4 -:10BF60000120002C00D00020041C03E0013D063617 -:10BF7000002DEED1002C03D1024EB06E0130B06620 -:10BF8000201CF8BD1079010030B5051C00200649C1 -:10BF900000221C23CC56AC423C00907E000001D114 -:10BFA000081C30BD01324831012AF5D330BDCC6DBB -:10BFB000010010B5084C00221C235343E358834270 -:10BFC00004D11C20504300190A6010BD01320E2A12 -:10BFD000F2D3002010BDDC7101003C00CC7E0000DB -:10BFE000F0B5416895B0071C90371391041CF878A0 -:10BFF000251C8035C6072879F60F4A4902284DD1FD -:10C000000A6D002A4AD04868013048600AF058FF9B -:10C0100044490861486113990979C9073C00087FC0 -:10C02000000001D441498861206806220690A16879 -:10C0300003A8F8F7EEFA062204A80230E168F8F740 -:10C04000E8FA07A806222169F8F7E3FAB87808ABFE -:10C05000002198700C96636A201CA0300A1C3C00DA -:10C06000447F0000002B02D0028A5207520F08AB17 -:10C07000DA7000AB998413990988C90BD984696B6C -:10C0800010AB1091A96B1191808B29491881096D12 -:10C0900003A8F8F732FA2979686B0BF04DFD29797E -:10C0A0003C00807F0000A86B0BF067FD3DE000289E -:10C0B00038D1486D1490002834D0206806220390AF -:10C0C000A1686846F8F7ABFA062268468018E1686E -:10C0D000F8F7A5FA05A806222169F8F7A0FA0021C9 -:10C0E00004913C00BC7F0000B97808A810AB017235 -:10C0F0000896E9680B9169794172686B0E90A86B9C -:10C100001090288DD880688D1881E1690CA80029CD -:10C1100004D089790170206A0D9001E00721017037 -:10C12000684614993C00F87F0000F8F7EFF902E048 -:10C130002068F9F7CAFA201CF9F7F5FB15B0F0BD35 -:10C140000000C4690100B0B5041CC0680622018962 -:10C150000C3101810568211C0C3D0560A818F8F719 -:10C1600064FA0622A1183C0034800000281CF8F76D -:10C170005FFAA08F0009E062206303480169201C78 -:10C18000F8F7C7F9B0BD00007C790100F8B5061CCE -:10C190006036051C707A0C23254958434418A86B57 -:10C1A0000027002806D0A0783C00708000000128FD -:10C1B00003D1A770707A0AF0B6FD2A1C0C218020EA -:10C1C0000BF095FBA86B002833D0A07802280BD089 -:10C1D000042822D1A7702F1C4037787802280CD170 -:10C1E000707A0AF0A0FD18E003203C00AC8000004B -:10C1F000A0701249002014390969F8F790F90FE08E -:10C200002C1C07E078784121221C08550C21802045 -:10C210000BF070FB6034607A04F020FF041CF1D155 -:10C22000707A4035A98B0002090909043C00E880B6 -:10C2300000000843812101430C200BF0A0FAF8BD57 -:10C240000000607B0100F8B51C49051C886A0130BC -:10C250008862281C0BF07DFD041C11D02B1C2033A0 -:10C260001E1C5A79201CB4301979144FFDF73C007C -:10C270002481000089F8AA7A201CB830B179FDF732 -:10C28000B9F8002F04D101212868FAF76DFAF8BD3A -:10C290006068BC21C08A085328680021FAF764FA54 -:10C2A000002809D00649C86A0130C862002CEED0C7 -:10C2B0003C0060810000201CF9F747FBEAE7201CE6 -:10C2C000F8F73CF9E6E7C4690100A1FF0000F8B502 -:10C2D000164C051F0022211CA03103E02868A04253 -:10C2E00009D02034A142F9D1002A04D102218E20A4 -:10C2F000F9F73C009C81000083F8F8BD0D4FBE7932 -:10C30000606901306061F8F797FDA84207D1A08805 -:10C310000430F8F797FDE0690130E06105E020683E -:10C3200028602560A0690130A061BE71E5E70000CA -:10C33000D05C01003C00D8810000201007000029DB -:10C3400001DB062901DB02207047064BC9005A5C5D -:10C35000C91802704A7842708A78827049684160D0 -:10C36000002070470000CC5A0100B0B50D1C041C21 -:10C37000052801D3F9F73C001482000075F8104835 -:10C380004068002800D00324102D00D30F2506207C -:10C390000B496043123140184178807849190906E9 -:10C3A000090E884200D2011C01208840054901384D -:10C3B000096808400004000C3C005082000002F0B4 -:10C3C00044FEB0BD0000D47A010008200700B0B5DB -:10C3D000041C0D1C09F0CFFD002803D1201C09F01E -:10C3E00082FD0561B0BD80B50AF097FD034A0C32AD -:10C3F00006CA8918081A80BD00003C008C82000023 -:10C40000A07D010070B50B4C049E64680DE065686A -:10C41000854209D1207A0870E068106020691860B0 -:10C42000207D3080012070BD2468002CEFD10020D9 -:10C4300070BD0000A46E010010B5041C3C00C88251 -:10C4400000002030817B20690430FDF764F9011C75 -:10C450006220025B636A4034207802F0CEFD10BD9A -:10C4600000000B4910B508888A690A2350435843D5 -:10C470000ED0084A53899488D2881B1952043C0074 -:10C4800004830000520C9A18C96806324A430A21F4 -:10C490005143F8F7FDF910BDC874010030000700E2 -:10C4A00010B5431C01D1104810BD0F4A0E4B943AF1 -:10C4B0001268443B1B7A10E0546884420CD1002976 -:10C4C0003C00408300000FD1022B03D1D47B022C0F -:10C4D0000AD204E0002B05D1D47BE40704D412680F -:10C4E000002AECD1002010BD101C10BD0000386FD8 -:10C4F0000100011C0120012900D00020704700B577 -:10C50000021C3C007C830000FDF7CEF8002808D018 -:10C51000101CFFF7F1FF1823034958434018006926 -:10C5200000BD002000BD00009467010080B5002818 -:10C5300000D10848074900685031097A002902D023 -:10C54000022904D13C00B883000000E0012100F082 -:10C5500006F880BD002080BD0000A46E0100124AD4 -:10C56000124B127A2C3B002A03D15A68002A18D1A8 -:10C5700004E0022A02D19A68002A12D100207047F2 -:10C58000C27B8A4201D03C00F4830000032A0AD116 -:10C59000827E012A07D1027F01321206120E027733 -:10C5A000C37E9A42EED200680028ECD170470000AA -:10C5B000F46E0100F7B58446002001270024002511 -:10C5C00088B007E06246525D3C0030840000002ADB -:10C5D00005D0AB006E46F25001358D42F5D3002DEB -:10C5E00000D00120002828D00027164C6E4622E0FB -:10C5F000201C00F030F8012801D0072806D10021C6 -:10C60000201C00F034F8316888423C006C84000043 -:10C6100001D2022714E02068C9000C18083C201C35 -:10C6200000F01CF8072807D10120012D00D00020C0 -:10C630002468002800D10834013D0436002DDAD1E9 -:10C640000A9804600BB0381CF0BD00003C00A884C0 -:10C650000000205201000068002901D08002800AF9 -:10C66000704710B540688000440F082C03D30221A6 -:10C670008720F8F7ECFE201C10BD002902D00068CE -:10C68000800D704740688005800D704700003C00B9 -:10C69000E484000010B540684001440F052C03D32A -:10C6A00005218720F8F7D6FE201C10BDF8B5051C23 -:10C6B000880A00901C488E05C069B60D171C1C1C0A -:10C6C000002805D1184881698D421DD0856111E08F -:10C6D0003C0020850000FDF7E8F8154909780E298F -:10C6E00007D1002805D0114950310623C956F9F762 -:10C6F00006FA0E490020C8618D61291C201CF8F73C -:10C70000E2F87943201CF8F7DEF808484161201C64 -:10C7100000993C005C850000F8F7D8F805484069AE -:10C720000A18A24201D2401801E04018001B800202 -:10C730008019F8BDAC7C010011670100F8B50F1C31 -:10C74000061C141C1D1C07F0A1FC0E2809D1201C7E -:10C7500002F0FCFB3C0098850000002804D008484B -:10C76000007802F0E4FB041C0121002EAC7200D022 -:10C77000391C201C02F007FC2860002028726C7213 -:10C78000F8BD90570100031C0A4810B50024021C94 -:10C79000A03203E081883C00D4850000994209D290 -:10C7A00020308242F9D1002C04D102218E20F8F7EA -:10C7B0005DFE002010BD0000D05C0100FFB5061C2E -:10C7C000002081B010601F1C0125141C301CFFF7D5 -:10C7D0006DFF052812D202A33C00108600001B5CEE -:10C7E0005B009F440000030303030800391C301C56 -:10C7F000FFF755FF03E00298F8F7EBF801302060EF -:10C8000004E005218720F8F734FE00252068802801 -:10C8100004D906218720F8F72CFE3C004C86000046 -:10C820000025281C05B0F0BD70B5174C606C0028C1 -:10C8300001D001201DE0164E144D3188A06C002857 -:10C8400008D02878814205D9F8F74CF80138FAF772 -:10C8500051FE0EE0E06C00280AD000203C008886E3 -:10C860000000FAF74AFE29783288914204D99042B2 -:10C8700002D9101C00E0081CFAF7DFFDE16B441A36 -:10C880000AF081FB201A00D5002070BD0000447D15 -:10C890000100F8600100FC600100FFB5274E3C007C -:10C8A000C4860000041CB0790F1C151C81B00090D8 -:10C8B0000AF06CFBC11923480768002F05D10A2133 -:10C8C0008020F8F7DFFD05B0F0BD1E4840688446C3 -:10C8D000002801D100220EE082680368AB4207D134 -:10C8E0003C00008700000379A34204D10B21802083 -:10C8F000F8F7CBFD23E0C0680028F1D1134BF868AE -:10C9000018603D603C71B96004988D1A38616046CA -:10C91000002305E08468A41AAC4203DA031CC06853 -:10C9200000283C003C870000F7D1F860002B08D1BC -:10C9300007483B1C47600848064A00880AF08AFB03 -:10C9400000E0DF600098B071C3E70000201007002E -:10C950007C5D0100213801002C740100F3B583B027 -:10C96000041C09D03C0078870000201C049909F0C1 -:10C970008EFB002803D0201C303005B0F0BD0AF03B -:10C980000EFB1E4A0026049F019600900292029C14 -:10C990000025391C201C143002F0C5FA002801D0F3 -:10C9A000261C03E001353C00B48700001C34042D34 -:10C9B000F2D3002E22D10198134F013001900228AA -:10C9C000E8D30121C906029A00201369009CE31AEA -:10C9D0008B4201DD191C161C01301C320428F4D3D3 -:10C9E0003068002801D0F8F73C00F0870000D3FE43 -:10C9F000301CFDF74AFF301C143006220499F7F76B -:10CA00007AFE009C301C3461BDE7306A010034427C -:10CA10000100094910B54C6903E0E168814203D087 -:10CA20002468002CF9D101E0002C3C002C88000087 -:10CA300003D102210220F8F737FD201C10BD0000B1 -:10CA4000FC5A010010B5C30706D5084B5C690C43BE -:10CA50005C611C7E14431C76800706D5044843693C -:10CA600019434161017E1143017610BD3C00688885 -:10CA70000000FC5701001858010070B50D1C041C83 -:10CA8000161C00F008F8A007C0170130321C291C42 -:10CA900000F021F870BD10B5C30706D5084B5C69DE -:10CAA0008C435C611C7E94431C76800706D53C0059 -:10CAB000A4880000044843698B434361017E91438D -:10CAC000017610BDFC570100185801000322111F08 -:10CAD00080B5012000F002F880BD000030B5151CC3 -:10CAE0000C1C002887B002D01C22224901E02249F8 -:10CAF0003C00E08800001C226846F7F764FE0599B8 -:10CB000000AB1A7E8C43201C9543029A291C0240DC -:10CB10000292019A02400192009A02400092039A06 -:10CB200002400392987C08409874587C08405874DE -:10CB3000187C3C001C89000008401874D87C084010 -:10CB4000D87402991048416101AA06CA91438161D3 -:10CB50008168019A114381608168009A91438160E4 -:10CB600000AA06CA11434268114341604168039A12 -:10CB7000914341603C005889000004A80BF001F883 -:10CB800007B030BD0000FC5701001858010010002C -:10CB9000070010B5041C011C012008F0E0F9002C6E -:10CBA00002D003F01CFF10BDFEF7D1FC10BDF0B5A4 -:10CBB0000C1C010E01233C00948900001B06090691 -:10CBC00099429FB028D11749084000211A2800D364 -:10CBD0000221002919D1C500134F10A8EE19B288FF -:10CBE0002168F7F79DFD201CF8F7EAFD7A5901A9A5 -:10CBF00010A8F7F707FD00283C00D089000005D0F9 -:10CC0000109801A90190B07900F09DF81FB0F0BD17 -:10CC10002A20F8F75EFC201CF8F7D5FDF6E7032183 -:10CC20002A20F8F756FCF1E700007FFFFF002445BB -:10CC3000010010B50C1C802802D03C000C8A0000BA -:10CC4000812808D103E0201C00F006F910BD201C4B -:10CC5000F8F7BCFD10BD03212C20F8F73DFCF6E7EA -:10CC6000F0B50C1C00218BB00A91010E01231B06AC -:10CC7000090699422AD118490840061C3C00488AF6 -:10CC80000000062E01D3072124E02089F8F7F1FEE9 -:10CC900022892168051CF7F74CFD201CF8F799FD47 -:10CCA000F4000F4E281C0AAA69463359F7F7B4FC62 -:10CCB000002801D0012807D12868694600903C006F -:10CCC000848A0000A01900790A9A00F009F9281C4A -:10CCD000F8F7B0FE0BB0F0BD01212B20F8F702FCF5 -:10CCE000F8E700007FFFFF00284601000A1C010E44 -:10CCF00001231B060906994280B508D05B009942C2 -:10CD00003C00C08A00000BD10006000E111C00F090 -:10CD10000EF980BD05490140101C05F0A2F980BD47 -:10CD200001212D20F8F7E1FB80BD7FFFFF0080B5DA -:10CD3000011C0F2000F013F880BD80B5011C0420F9 -:10CD400000F03C00FC8A00000DF880BD80B5011C9D -:10CD5000172000F007F880BD80B5011C012000F00D -:10CD600001F880BDF8B5041C061C802084430F1C0C -:10CD7000192C01D3F8F7EAFB0848045D211C0020B8 -:10CD8000F8F750FD3C00388B0000051C221C391CB4 -:10CD90000068F7F7DAFC2A1C311C0720F8F711F9B4 -:10CDA000F8BDF4450100F8B50D1C161C041C1F1C31 -:10CDB00008210020F8F739FD142201680E4B724358 -:10CDC000D2180C71127C3C00748B00004A710D600B -:10CDD0000B4A8F7112687F2A03D95205520E8023A5 -:10CDE0001A43CA71074A0023516801315160021C7D -:10CDF00081210020F8F708F9F8BD00007440010017 -:10CE0000FC5A0100806E01003C00B08B0000B0B500 -:10CE1000041C08210020F8F70EFD218BE27D051C83 -:10CE200009055207520F490C006811438180A17D0A -:10CE300014230E4A59438918097CC171E16A0160C3 -:10CE4000E168281CF8F717FC0A483C00EC8B00004E -:10CE50000068002801D0F7F7F1FB07490431886822 -:10CE60000130886000212A1C0020236BF8F7D2F8DB -:10CE70000120B0BD744001007C6E01000148806853 -:10CE800070470000806E010010B5041C3C00288C27 -:10CE9000000092B0016868460822F7F762FC00AB18 -:10CEA00098884007400FD87798884004000D188470 -:10CEB000D888588400980D900594208908382081DE -:10CEC000059801680831016000200A900C903C0030 -:10CED000648C00000021112009F078FB0549064A06 -:10CEE000086801300860022102A801F0CDFC12B0F0 -:10CEF00010BD0000806E0100558B0000021C012057 -:10CF00000006084380B52B210AF08AFD80BD000091 -:10CF10003C00A08C0000F7B5041C061C8020844354 -:10CF2000171C062C01D3F8F726FB0B48055D291CBE -:10CF30000020F8F78CFC041C006801992A1CF7F704 -:10CF400016FC391C201CF8F7A2FB221C311C002304 -:10CF500002203C00DC8C0000F8F768F8FEBD000001 -:10CF6000204601000A1C011C80B500230120F8F7AF -:10CF70005DF880BDFFB59FB01F1C051C0A301E90D8 -:10CF80001CAA1DA90AF000FF002871D0002F09D0AB -:10CF90000A2100203C00188D0000F8F75EFC0668AE -:10CFA000041C301DFAF7AFFA05E004210020F8F761 -:10CFB00054FC0668041C28893649012208807080C8 -:10CFC000E88814A9308019A8FCF7F5FCFCF7FFFBF2 -:10CFD000011CFF3121313C00548D0000201C01F068 -:10CFE000EFF819A9201C01F0EBF814A9201C01F09E -:10CFF000E7F8201C2099FDF74BFD0022022101F0EB -:10D0000033FD061C1C9900208861301CF8F71CFABF -:10D01000002E0BD0307A00283C00908D000002D00A -:10D020004021084330721C980222816911438161BA -:10D0300004E01C9902228869904388611DAA06CAEF -:10D0400001A805F058FB09A8002F02D00222427265 -:10D0500001E000214172049401A83C00CC8D000045 -:10D0600004F07AFB01211C9808F0C8FF002F04D0BF -:10D070001C980122816911438161A8881C9C01F0E0 -:10D080009FFE021C211C00E004E00748408809F0D4 -:10D090001FF804E03A1C00210520F9F73C00088E37 -:10D0A00000009BF8002023B0F0BDFC600100987CDC -:10D0B0000100F8B5041CC0680568A01D01F095FFCB -:10D0C000002845D0211C1431201C6A460AF055FE68 -:10D0D00000283DD0FCF77DFA002839D100983C00AB -:10D0E000448E00004B21095C012934D1042609F04B -:10D0F00019F9688800281BD1A8880321890388436F -:10D1000015490026088001220221206901F0B8FC9F -:10D11000041C14D000988069800710D5F8F79AF99C -:10D120003C00808E0000201CF8F7DDF8002809D1B3 -:10D13000F8F77FF901260098022281699143816105 -:10D14000002101E00098022108F061FF0098806949 -:10D15000A988C207D20F301CF9F745F8F8BDFA606C -:10D1600001003C00BC8E00001CB5046900230022B5 -:10D17000002C13D14B24245C022C03D1022905D0AE -:10D18000012203E0022901D101220123002A05D056 -:10D19000009004200193694609F036FA1CBD000096 -:10D1A000B0B5041C3C00F88E0000F2210F200C4D9D -:10D1B0000AF099FB287808280BD201A31B5C5B00BE -:10D1C0009F440703030808080808002C01D105F054 -:10D1D000BCFBB0BD012CFCD1FF2007F038FAB0BD7C -:10D1E0000000746601003C00348F00008CB5054AD5 -:10D1F00000AB1172009019716946082009F00AFA13 -:10D200008CBD0000AC7C0100F3B5041CC06806278F -:10D2100085B0066809F026FF984948632069032114 -:10D2200001F008FC964D00283C00708F00004DD0A6 -:10D230009549403109798078814247D1012120699F -:10D2400001F0FBFB02902069322101F0F6FB019016 -:10D25000021C8D480299FCF746FF002836D00023B7 -:10D260008A480299019AFCF7E4FE3C00AC8F00006A -:10D270000B282ED1864A51887089414003910B1C9E -:10D2800084490B4025D150800399171C00290BD0ED -:10D290000399480502D5381CFCF740FE039988061F -:10D2A00002D5381CFCF724FE2A2120693C00E88FB7 -:10D2B000000001F0C8FB00280DD08078E9698142A8 -:10D2C00009D0E861381CFCF716FE381CFCF707FE95 -:10D2D000381CFCF726FE0027201C20300490407AE2 -:10D2E000082871D10AF0D1FC0020686100233C00BD -:10D2F000249000002B61A86866490130A86030893D -:10D300005C31888201F07AFD62495C310861226AF1 -:10D3100004981821007A01F033FEE16A4018039066 -:10D320005C48006A00280DD0002F0BD1594801231A -:10D330003C00609000005C3001681B0700223068F0 -:10D3400009F049FF002800D105270021A06B0AF051 -:10D35000CEFC0021206C0AF0E8FC4F4B03CE039A70 -:10D360005C33FCF788FD00204C4E0521B06320693A -:10D3700001F03C009C9000006FFB011C01D1F060AB -:10D380001CE00120F0608878454A01321070C878AE -:10D390005070474A1070306900280AD04A780879DE -:10D3A000053109F0DDFA3169F7F785F9F0680028F1 -:10D3B00004D03B4A3C00D89000000132107800288D -:10D3C00008D10020A861716A002903D0201C143004 -:10D3D000F7F774F9344A5C321069316A411800E099 -:10D3E00020E00A23D0680A2209F0FBFE002807D0BB -:10D3F0002D4A316A5C323C0014910000D068401A1A -:10D400001169401A7060294A5C32D0683062F06954 -:10D41000002804D0FAF700FD0120FAF7A1FCFAF782 -:10D4200081FC2748006803F007F90698002803D11B -:10D430001E4E0023B36016E03C00509100001C4ECD -:10D440000120B060069801684068B06519487165B0 -:10D450005430C088002809D0B169002906D001F0F5 -:10D46000DCFC011CE06AB269F7F72FF9002F15D137 -:10D4700012480169002908D101213C008C9100006B -:10D4800001612A68002A03D000210020F7F720F963 -:10D4900009490023CB622B616B6106F0B5F807B038 -:10D4A000F0BD6B680648002BF9D0021D111C381C1A -:10D4B000F7F70FF9F3E70000447D01003C00C89145 -:10D4C0000000F4680100F467010003080000F86040 -:10D4D0000100C467010008B5F8F72FFD009000AB0C -:10D4E000188800280CD005F050FF00AB5988188828 -:10D4F00005F06DF9FEF797F80320FBF70EF83C00F6 -:10D500000492000008BD0120FFF7B2FB002008F0E4 -:10D510008DFEF7E7F8B54F498C68206A00680578FA -:10D52000FCF768FA002812D02A07920F0121012A7D -:10D5300000D00021002903D02906090F0B2906D1AC -:10D540003C00409200002A21095D08189030007BC1 -:10D55000F9F70DFC414F3C3FB86B796BF7F7C0F81A -:10D56000A06C0026C660606B800804D0B8690130EA -:10D57000B86106F0DCF9394D28698005800F08D1C3 -:10D5800078693C007C920000042101307861606B76 -:10D590004008400008436063B86A002803D0606B0D -:10D5A000082108436063201C203000903968F7F799 -:10D5B0009AF80320000228602B498868A063C86895 -:10D5C000E06308793C00B8920000C006C00E251C3C -:10D5D000403528714879687123483C384662009884 -:10D5E000807A01F05EFD00210028214A01D01178E7 -:10D5F00003E09378DB0700D55178A971002804D0A7 -:10D600001B49143108683C00F4920000206400E0DB -:10D610006E80B86AC00702D5FF202871AE71E6613E -:10D62000B8680130B8607968884203D00B21852042 -:10D63000F7F7C4FF0D498868C06C8860FB6A002B4F -:10D640000CD00E4AD47B002B3C003093000002DD4E -:10D650007F2C05D201E0002C02D0D47BE318D373D9 -:10D66000FE62C968884203D105218520F7F7A9FF2A -:10D67000F8BD247E010000400700A0800700E8807C -:10D68000070040000700FEB5304C3C006C930000E2 -:10D69000A06B216BF7F733F82D493C318E68708B06 -:10D6A000062804D2E0690130E0610E203085284967 -:10D6B0003C310D68002D03D103218520F7F784FF4D -:10D6C000244845613562318DEF6804393C00A893E8 -:10D6D00000000C0401210291240C002101911D483D -:10D6E0003C30808AA04203D32C81EE6000240BE002 -:10D6F000002F04D103218520F7F769FF04E03D1CCA -:10D70000201A0404FF68240C0298002804D03C006E -:10D71000E493000012490120086100200290019862 -:10D7200001300190002CDDD10C480C4C3C300760DE -:10D7300001983065B564306A0068606260680130E5 -:10D740006060A1680131884203D00A218520F7F783 -:10D750003C002094000041FF04480068A062FEBD28 -:10D760000000E87D010000300700786E0100B0B5D0 -:10D77000051C01210F200AF0F8F8F2210F200AF011 -:10D78000F4F80C480C4C0068143C00280CD0E078ED -:10D7900001283C005C94000009D00122291C0F20C4 -:10D7A0000AF0ACF86078022806D0012003E0607827 -:10D7B000022801D000206070B0BD00009866010012 -:10D7C0000222002880B500D1032203490E200AF06E -:10D7D0009BF800203C009894000080BD000050C3DE -:10D7E0000000F8B50023002200282ED00689046826 -:10D7F000751E2D04B61AF6072D0CF60FB4460EE072 -:10D80000A75CA618023300977778A7540232120457 -:10D81000009F120C00293C00D4940000777001DDB9 -:10D820008B4215DAAA42EED3C068002810D00289D4 -:10D83000002AF9D06246002A0BD00268665D17788C -:10D8400002336755167001220029D2DD8B42D0DBEE -:10D85000F8BD0022CDE700003C0010950000B0B5F7 -:10D86000041C0D1C0120F8F75EFB0D490028C8615F -:10D8700014D062684260A27C0272A268C260E26850 -:10D880000261228A02750A1D0A621268002AFFD10B -:10D89000026048600020A86001203C004C95000018 -:10D8A000B0BD0120FAE70000A46E0100B0B5041C71 -:10D8B00040680D1C431C02D1211C094808E00020CF -:10D8C000F8F734FB064994390861002803D0211C7D -:10D8D00000F048FE00E00120A86001203C0088958F -:10D8E0000000B0BD0000386F010080B50121972015 -:10D8F000F7F785FE002080BD000038B50A1C143201 -:10D900000092131F051C083A0C1C16314068FEF7E4 -:10D910006CFE002801D0002000E0012069683C0076 -:10D92000C4950000A0606160012038BD10B50C1CDA -:10D93000017A00290FD0012909D0022903D1002141 -:10D9400000200AF073FC00202071012010BD416806 -:10D9500001200AF06BFC00F00DF9F4E780B50449F2 -:10D960003C000096000048680138486001D107F08B -:10D970006EFB002080BDAC790100B0B5051C0C1C0D -:10D9800000F04FFEA060686860600120B0BDB0B5D7 -:10D99000051C0C1C00F06FFEA06068686060012030 -:10D9A000B0BD3C003C960000081C00210022002372 -:10D9B0000EC008C001207047F8B50F1C041C207968 -:10D9C000202801D2202020716679002E02D12579ED -:10D9D00000220DE02579291C301CF7F74FF80029AB -:10D9E00001D1321C3C007896000004E0704380199D -:10D9F00005062D0E321CE079291C00F0F2F9207A80 -:10DA00002F49C007C00F08602E480078C00743D5D3 -:10DA1000A1792C4AC80748D42C4E16608B072B4896 -:10DA200008D5CC0801233C00B4960000A340036055 -:10DA3000490704D52849116001E0402101601368BD -:10DA4000264AB34210D1546801680C4354601468EC -:10DA50000C4001D0516100E0916154680C43546066 -:10DA600094682143916013E03C00F0960000547CE0 -:10DA700001680C435474147C0C4003D0147C0C4398 -:10DA8000147402E0147C8C431474547C0C4354745E -:10DA9000947C21439174B34205D100220168032094 -:10DAA000FFF78DF809E0006800213C002C9700008A -:10DAB0000206120E0320FFF785F801E00B48106004 -:10DAC000002038717D71F7F7E9FD0120F8BD0000F5 -:10DAD000CC5C0100040007005C5B0100B99B000006 -:10DAE000585B0100959B0000100007003C00689700 -:10DAF0000000559B0000B0B50D1C04300024FEF75B -:10DB0000D6FA01206C60B0BD0000F0B5077A43681A -:10DB1000041C0E480E1C00680125011C9BB006E089 -:10DB20004A689A4202D18F76002502E009683C00DB -:10DB3000A49700000029F6D1002D05D1217A0129F2 -:10DB400002D101A9F8F7A8F86068043621C61BB015 -:10DB50000120F0BDA46E010010B50C1C08F0AEFC55 -:10DB60006060012010BD000010B50C1C07F084FAA5 -:10DB70003C00E097000004F054FF002060600120AA -:10DB800010BD0020C043486001207047000010B560 -:10DB90000C1C0079FAF707F8002801D0002000E0FB -:10DBA00002206060012010BD00001CB5064C2068FA -:10DBB00000283C001C98000007D009F0C5FA01902D -:10DBC000206841686846F6F7D6FD1CBDAC790100B7 -:10DBD0000149086070470000AC7901000EB5064BA2 -:10DBE0001B68002B06D00290009101926846D9680C -:10DBF000F6F7C1FD3C00589800000EBD0000AC795E -:10DC000001001CB5041C07F04CFA064841680131BC -:10DC10004160009400210191006801686846F6F7B0 -:10DC2000ADFD1CBD0000AC79010080B5F8F7A3F88C -:10DC300080BD80B5021C3C00949800008021032028 -:10DC400000F05CF8011C034800224369F6F79BFDD5 -:10DC500080BD0000A46D0100F8B50C1C1349051C23 -:10DC60000868161C0130086000202061221C103258 -:10DC7000281D0021071C00923C00D098000003F0F2 -:10DC8000DEFE20712069002810D00104090C00205C -:10DC9000F7F779FE3060291D03C9A060E1603068A4 -:10DCA0000168009A381C03F0CAFE20710120F8BDFB -:10DCB00000001075010080B5021C3C000C990000AA -:10DCC0000821042009F04EFF032080BD10B5074A4B -:10DCD0000C1C516801315160011C1031C2680430C4 -:10DCE00003F0F0FE2071002010BD0000107501004F -:10DCF000044980B581610821021C03203C00489939 -:10DD0000000009F032FF032080BD95D80000F7B570 -:10DD1000071C161C0621002082B0F7F73AFE051CEE -:10DD200020480078062800D928812C680020A77098 -:10DD30000399E170311C03E00A8910180F1C3C00A4 -:10DD400084990000C9680029F9D16B4601AA211DF8 -:10DD500000F034F800AB187860711878002817D0FC -:10DD600011484068002808D019780020F7F714FE01 -:10DD7000011C381CF7F730FD0AE03868002802D192 -:10DD80003C00C09900003F600120B86100AB1978E9 -:10DD900038894018388100AB9888311C02382080BF -:10DDA000281CF7F71CFD281C05B0F0BD0000C85C5E -:10DDB000010001794279008889180239401A7047B8 -:10DDC00000003C00FC99000070B5084D2C78AD783F -:10DDD0002018061C002D03D070190138013DA843FE -:10DDE0001080801B18700C7070BD0000C85C0100B2 -:10DDF000B0B504680C4A218852780231914211D2A0 -:10DE0000551AF7F73C00389A0000C9FD016800294F -:10DE100002D10060012181610189491901812088B5 -:10DE200040192080607940196071B0BD0000C85C65 -:10DE3000010080B500220621F12009F0A2FE80BD7C -:10DE40000000031C02483C00749A000003704170FB -:10DE500082707047C85C0100B0B5081C0968151CC9 -:10DE60008C78F7F785FD0449A0000958002902D0F5 -:10DE7000281CF6F79EFCB0BD846D0100FEB5041CA5 -:10DE8000C07AA17AC607F60F3C00B09A0000321C97 -:10DE9000201D01F03CF86069254FC10737D5B869EE -:10DEA000002801D0F6F787FC2068056828888007DD -:10DEB00034D101AA02A9281C01F00BFC281C01F096 -:10DEC00012FC0078C0070AD460693C00EC9A00009C -:10DED000800726D4331C291CA27A20697D69F6F7B5 -:10DEE00072FC1EE000AB187A002803D0012806D08F -:10DEF000022816D1281C796AF6F761FC11E000AB04 -:10DF000018790E2801D00F280BD1281C3C00289B23 -:10DF10000000396AF6F756FC06E00007800F03D1CF -:10DF20002069F969F6F74EFC786B2121013078639E -:10DF3000221C802009F031FEFEBD287A01000B4929 -:10DF400018B50878C00711D50A4A101C20303C00CB -:10DF5000649B0000847900AB1C70C079587008780D -:10DF600040231843087005480078087000AB1888F3 -:10DF7000D08418BD0400070000100700E060010015 -:10DF800070470000054910B58879054B1A7C054C8F -:10DF90003C00A09B0000246862401A74887110BD88 -:10DFA00000002010070010000700585B0100044922 -:10DFB0000A6804480068024001D0886170474861DF -:10DFC000704710000700585B0100021C012000068A -:10DFD00008433C00DC9B000080B52A2109F0E6FDE7 -:10DFE00080BD000010B5041C002903D0812907D191 -:10DFF000812000E08020221C2C2109F0D7FD10BDDB -:10E0000002212C20F7F74CFB201CF7F7C3FC10BDB6 -:10E0100080B5B4B03C00189C0000012806D08228CE -:10E020001CD11AA807F035FC34B080BD812913D16A -:10E030000D480C4A816900685032814202D0D16A91 -:10E04000012902D01178022902D107F00AF9EBE781 -:10E050006946F7F75AFE3C00549C0000E7E70121AF -:10E0600000E002211820F7F721FBE0E7A46E010091 -:10E07000B0B5041C0068174D9AB0686308F03EFA0A -:10E0800020791449134A50392C3A02280AD1906851 -:10E090008002A861C868E8613C00909C00000220F2 -:10E0A000287207F0E4F81AB0B0BD031C0020002B62 -:10E0B0000BD152689202AA610A1C8968E961287230 -:10E0C00010686946F7F727FEEDE7A861012028727E -:10E0D0002870002006F07DFAE5E73C00CC9C0000AB -:10E0E000F46E0100704700007047000080B5012108 -:10E0F0000720F7F7E1FA80BD70470000F8B500246B -:10E10000194A0026D56811680435081C916002E0A0 -:10E11000011C4019086053688342F9D83C00089DEF -:10E12000000001341032032C0E60EED3F6F7F1FF3D -:10E1300010481049124C0860104900200122192390 -:10E140005B010C2543431B1945434A511F1C6D18A5 -:10E15000AB606B6000251E1C14369E60331C3C00B7 -:10E16000449D00000135272DF8DB013003289F6016 -:10E17000E8DBF8BD2057010014C80100B4CF01004E -:10E1800018D90100B8CF0100B0B5074C251CC03527 -:10E19000286B1E2100F0F2F9A26B201CDC30296BE9 -:10E1A0003C00809D000000F0B6F9B0BD0000C469DD -:10E1B00001000020102210B50A4905E00C2343435A -:10E1C0005C180C34CC5001300F28F7D30C23584383 -:10E1D0000950044841600160028200218160C160F1 -:10E1E00010BD3C00BC9D000084E2010044E301003E -:10E1F00010B5084CA06A002803D10748F9F7E8FEDB -:10E20000A0620448443000680121F9F795FC60627F -:10E2100010BD0000606C0100CD260100FFB50D1C93 -:10E22000041C1E1C3C00F89D000081B00A9F1C21AC -:10E23000F6F74DFB0398A061256025612681A68233 -:10E24000E76005B0F0BD70B50D1CA421041C0830BA -:10E25000F6F73DFB201C44300622291CF6F765FB2F -:10E2600018483C23411C3C00349E00006162417808 -:10E2700059430918897A062901D1A06202E0211CBC -:10E280004D31A16241783C235943081804300F49AD -:10E2900020620B88002B15D0AC20005D0B4A183291 -:10E2A00000028018B030E0603C00709E00008D6875 -:10E2B000002008E0E268C1005450E668820052196C -:10E2C00071184A6001309842F4DB70BD000068614B -:10E2D0000100587501001FB5041C6034617A031CED -:10E2E000806A084A0291019003923C00AC9E0000B3 -:10E2F000E279181C20300092447B827B5E20C15A58 -:10E3000018690430231C02F07FFE1FBD394E000047 -:10E31000B0B50B1C01886920C05C86B00E4A049120 -:10E32000039005920D4D596A9A6A2D683C00E89E4B -:10E3300000000124002D00D0041C0A48005D01915A -:10E3400002920090181C2030447B827B5E20C15AD0 -:10E3500018690430231C02F0A4FE06B0B0BD514F72 -:10E360000000186701000A61010001898A1C3C0055 -:10E37000249F000002810268023A0260080A090232 -:10E38000084310807047000070B5051C08780E1C0B -:10E39000FF2814D0717802310020F7F745FB041CE8 -:10E3A00002890068311CF6F7CFFA002D06D0281C30 -:10E3B0003C00609F0000F7F734FB211CF7F757FA89 -:10E3C00000E0251C281C70BD0000FFB50F1C1E1CA2 -:10E3D000041C981C0104090C002081B0F7F727FBEE -:10E3E000051C0068002C386003990170386846707D -:10E3F00006D03C009C9F0000201CF7F715FB291C51 -:10E40000F7F738FA00E02C1C201C05B0F0BD000026 -:10E4100070B51048046804600F4920200860A0050A -:10E420000E4E02D5706AF6F705FAE00102D5306E9D -:10E43000F6F700FA3C00D89F00000A480440002587 -:10E4400007E0E00703D5A8003058F6F7F6F90135E4 -:10E450006408002CF5D170BD0000004007000010DA -:10E46000070030740100FFFDFFFE80B5072180200A -:10E47000F7F749F980BD3C0014A00000F8B5144B33 -:10E4800082009C58CA060127391CD20E9140114ABD -:10E490001160114E4000851915E06060207BC100BD -:10E4A000891910310A780D239A430A70391C81406A -:10E4B00031730749000108313C0050A000004018AA -:10E4C000084A416842608068F6F7BEF9287B002858 -:10E4D000E6D1F8BD0000A473010000100700006041 -:10E4E0000700D175000003490120097A002900D1F5 -:10E4F000002070470000047A01003C008CA000005E -:10E5000003490120897A002900D1002070470000CA -:10E51000147A0100B0B50024FAF776FC002814D074 -:10E52000012408F07DFE0A4D0A4B00215A18A03242 -:10E530001278102A06D38A00D218926F3C00C8A025 -:10E540000000821AAA4200D2002401310329F0D32C -:10E55000201CB0BD00008B080000A46C0100014825 -:10E56000C068704700007869010070B50D1C041C7C -:10E57000161CFDF72EFE0020E0602661A5603C0021 -:10E5800004A1000070BD0000F8B5171C0E1C041C8F -:10E59000002801D0002E01D1F7F7F2F8A06807F0AB -:10E5A00049F9051C01D1F7F7EBF8291C6E60AF6043 -:10E5B000201CFDF7FDFDE068411CE160002803D14F -:10E5C0003C0040A100000548216905F02CF92068B5 -:10E5D000A84202D1381CF6F748F9F8BD0000C46023 -:10E5E00001000022013910B505E00C2353431C182B -:10E5F0000C34C45001328A42F7D300210C235A4311 -:10E6000081503C007CA1000010BD0000B0B5041C8E -:10E6100001D1F7F7BBF8201CFDF7DAFD011C856876 -:10E62000A06807F009F9E0680138E06003D1064806 -:10E63000216905F0E7F82168002903D08868496856 -:10E64000F6F711F93C00B8A10000281CB0BDC46069 -:10E650000100012100288CB500D100210E2009F015 -:10E6600032FA832000AB1880002004F00CF80190EF -:10E67000684603F07AF98CBD000080B508F0DFFD34 -:10E6800006490A8906493C00F4A10000096E411AB6 -:10E690000B0C5918891A0904090C401A80BD000096 -:10E6A00000900700A46C010070B5041C887E0D1C4E -:10E6B000202803D903211820F7F740F800262676F2 -:10E6C000A87E291C1B3160763C0030A20000201C73 -:10E6D0001D30AA7EF6F75FF96868291C6060A8689B -:10E6E0001331A060A87B06222073E87B6073287C2E -:10E6F000A073687CE073A8892082A87CE0762677E6 -:10E70000201C1230A676F6F746F93C006CA20000F9 -:10E710006068431C1DD0114D6D61286800281AD017 -:10E72000227B011C0B7B9A4201D3206014E00B1C5E -:10E73000096800290BD00E7BB24208D20B68002B6F -:10E74000F0D01E7BB242EDD323600C603C00A8A247 -:10E75000000001E021601C60002070BD26602C607C -:10E76000FAE7A46E0100134AB0B5516801240029EC -:10E770001ED0131DD1611362436804E0106200686B -:10E78000D061002814D0D06945689D42F6D13C0084 -:10E79000E4A20000106A814204D15160D06900688F -:10E7A000086002E0D16909680160D069FCF7CEFF1A -:10E7B000002800D00024201CB0BD0000A46E010081 -:10E7C000B0B5174D01242968002927D06D61296152 -:10E7D0003C0020A30000436804E0686100682861F1 -:10E7E00000281DD0286942689A42F6D1AA692B698F -:10E7F0009A4200D1A9616A69914203D129600068F7 -:10E80000086006E0006810602868002801D107F061 -:10E81000CCFE3C005CA300002869FCF79DFF0028AB -:10E8200002D0002400E00124201CB0BDA46E010031 -:10E83000B0B5051C0748446807E0211C4431281C7A -:10E8400000F0D6FC002802D16468002CF5D1201C11 -:10E85000B0BD00003C0098A300005875010070B5E1 -:10E860000D1C141C00280B4E08D0706E0623584354 -:10E870000204120C311C281C228007E0218806208B -:10E88000F6F7A7F970662288291C301CF6F795F870 -:10E89000012070BD00003C00D4A3000010790100ED -:10E8A00080B5032803D8044AC000115080BD01215F -:10E8B0002620F6F75BFF80BD7C790100B0B5051C12 -:10E8C000C0680189392939D30468A079882835D1ED -:10E8D000E0798E2832D1207A3C0010A40000012873 -:10E8E0002FD1607A03282CD1207B022801D0FE286A -:10E8F00027D1607B1D210840012822D1A07BC8219F -:10E90000084008281DD1A81DFBF7E1F9002818D000 -:10E910001920215C002914D101303C004CA40000D6 -:10E920003928F9DB688B04210843688303F0D6FE9D -:10E93000002809D1002300222620044909F092F979 -:10E940000348006801F084F9B0BD000050C3000026 -:10E950000C790100B0B5084CA36801333C0088A4D1 -:10E960000000A3600C1C09D02568002D03D0237A79 -:10E970006168F5F7A3FF201CF7F7A9F9B0BD9479FA -:10E98000010070B5041CC06801890568082953D3CB -:10E990000622281C5549F5F79EFF002837D13C0078 -:10E9A000C4A40000E988524E043E812924D1E568C0 -:10E9B0002968087A4A7A000280180004000C420B89 -:10E9C0000005000DE27520834B8900204200B25AF9 -:10E9D0009A4206D128890C38020A00021043488165 -:10E9E0003C0000A5000002E001300228F1D3E068FD -:10E9F00001890A390181E06801680A311CE00022BE -:10EA000000204300F35A8B4201D1012202E0013081 -:10EA10000228F6D3002A11D107E036490622063132 -:10EA2000281C3C003CA50000F5F75EFF002808D13B -:10EA3000E068018906390181E068016806310160FA -:10EA400010E0E068FFF7E2FC0CE002310181E068D1 -:10EA5000016802390160E06800890238020A000298 -:10EA6000104308803C0078A50000E0680325028977 -:10EA70000168244E022A10D90988082905D0C1232B -:10EA8000DB00994203D1012502E0002500E00225C8 -:10EA9000E9007158002900D10225F7F704F8E900D0 -:10EAA0008919898888423C00B4A5000000D9032553 -:10EAB000A11D201CFDF734FC002800D10325022DE8 -:10EAC00005D0032D07D1E068F6F7E2FF70BD201CEA -:10EAD000FDF71CFD70BDE068018902390181E06825 -:10EAE000016802310160E8003C00F0A500003158E7 -:10EAF000201CF5F7F1FE0028EFD1E0680189023112 -:10EB00000181E068016802390160E3E700006A46BC -:10EB100001007C79010070B50E1C041C151CF7F770 -:10EB20008CFB00282AD01B4908683C002CA600005A -:10EB300001300860002E0AD0012E0BD0022E0FD11A -:10EB4000201C04F0CDF8201CFFF7D6FE0CE00821B5 -:10EB5000E06802E0C121E068C90004F035F903E093 -:10EB600002212620F6F720FEE27DE16A3C0068A63D -:10EB70000000281CFCF795FB206300202062A062A7 -:10EB8000201C00F06CFE70BDE068F6F78AFF002DD7 -:10EB9000F9D0E37D00220120E16AF5F7A7FE70BD00 -:10EBA00000009479010080B5012804D105483C009B -:10EBB000A4A60000006801F009F980BD0321262009 -:10EBC000F6F7F8FD80BD00000C790100F8B5061CD1 -:10EBD00080790024C0072DD5F0680068417A11299A -:10EBE00028D1C1880A0A09021143C90422D1017837 -:10EBF0003C00E0A60000114F0907890E0818418863 -:10EC00000A0A090211430D042D0C432D396801D164 -:10EC1000CA070ED4442D06D1C90704D5243000F00C -:10EC200022FB002805D00648854206D138688007B7 -:10EC300003D53C001CA700000124F068F6F73AFF5A -:10EC4000201CF8BD7C5A01006C07000080B500282C -:10EC500007D00021262008F07BFF0248006801F061 -:10EC6000BBF880BD0C79010010B5041C094A081CD2 -:10EC7000516801313C0058A7000051600021216219 -:10EC8000A162E27DE16AFCF718FB2063201CF7F724 -:10EC9000E6FA201C00F0EFFD10BD947901000CB5E0 -:10ECA000021C081C0021019100926A4601A900F093 -:10ECB00002F80CBD00003C0094A7000070B513687A -:10ECC000002B1ED000260B68002B02D113681B6896 -:10ECD0000B6013681C681B89E51808E05C781C1938 -:10ECE00002340C601C78844201D1181C70BD0B6882 -:10ECF000AB42F3D31368DB683C00D0A7000013607D -:10ED00000E601368002BE1D1002070BD000070B5CB -:10ED1000031C20D018681E89051C16E00478DD2C21 -:10ED200010D18478002C0DD1C478502C0AD10479EC -:10ED3000F22C07D144798C4204D13C000CA800008D -:10ED400002290CD18479944209D0447820180230E9 -:10ED5000441BB442E5DBDB68002BDED1002070BD34 -:10ED6000044980B50A780A20002A00D0486A00F0D9 -:10ED7000D1F880BD1C750100B0B5174C3C0048A807 -:10ED800000002068002829D0164DE869002825D108 -:10ED900001F03FFA002821D1FFF741FC00281DD1E6 -:10EDA0002068A969401808F0D6F9002816D002F0AA -:10EDB00006FD2168401808F0CEF900280ED03C006E -:10EDC00084A800000120E86100222521802008F0AD -:10EDD0008FFF0648296A04F083FD0121286A00F0AC -:10EDE00089FFB0BDE85901001C75010034630100C2 -:10EDF00070B5051C0024FAF70BFF184E716A401815 -:10EE00003C00C0A8000000F08EF800280BD104F0F0 -:10EE1000FEFB0021252008F0B0FE0322291C281C3F -:10EE200000F0AFF818E0706A441E00F07CF800288B -:10EE300012D10C48316A04F056FD0121306A00F00D -:10EE40005CFF3C00FCA800000020FAF70DFE06F075 -:10EE500003F8002300222520054908F03FFF201C6D -:10EE600007F0FCFA70BD00001C750100346301005E -:10EE70001027000080B5012807D080280DD100227E -:10EE8000002108483C0038A90000F8F79AFE80BD30 -:10EE9000012902D106490020C86104F0BEFB80BDF3 -:10EEA00005212520F6F7A7FC80BD61A900001C758F -:10EEB00001000021002880B501D1034841680122EA -:10EEC000252008F02CFE3C0074A9000080BD000045 -:10EED000E85901000249C8680138486270470000DB -:10EEE0001C75010038B5031C081C191C114B06D0F9 -:10EEF000012111800A1C191CF5F7AAFD17E00D4D20 -:10EF0000011C2C781288181C3C00B0A90000F5F7F1 -:10EF1000A2FD287884420DD000236B61002803D025 -:10EF2000002007F0A4FA05E0002200210020009252 -:10EF3000F8F723FC012038BD00001C75010070B5F6 -:10EF4000041C012608F0E1F9051C3C00ECA90000B6 -:10EF50000020FAF78BFD444302F040FC02F03EFC37 -:10EF6000011C231C0022281C08F07CFA002813D165 -:10EF70000A48231C00228169281C08F073FA002823 -:10EF80000AD1F8F719FC011C231C00223C0028AA16 -:10EF90000000281C08F069FA002800D10026301C67 -:10EFA00070BD1C75010070B50D1C041C161C07F00B -:10EFB00076F900280DD0FAF752FE002809D0FF306C -:10EFC00001304368002B04D0221C291C301C3C005B -:10EFD00064AA0000F5F7BBFC70BD000080B50121FC -:10EFE0001D2008F0DFFD074A0748116901605169DB -:10EFF00041600649496881600021C16003F074FCEA -:10F0000080BD00002861010048750100905C01008E -:10F010003C00A0AA000070B5041C406B002835D04D -:10F020001D4D00262878002824D04120005D0028AE -:10F0300003D108F076F9A8611BE0696901316961C3 -:10F04000A868002808D0814206D12069011C10312F -:10F0500004303C00DCAA00008222FFF7ADFF6868A4 -:10F0600000280AD06969814207D12069011C10314A -:10F0700004300222FFF7A0FF6E6168780521084086 -:10F0800008D0074800780E2803D36034E079FBF7F6 -:10F09000CFFF70BD3C0018AB00000348066070BD98 -:10F0A00000001C75010010670100D47E0100800281 -:10F0B0007047142330B5094D4B435B195B68082436 -:10F0C000002B00D1022438235A43054B8900D21863 -:10F0D000515A026809193C0054AB0000511A0160F2 -:10F0E00030BD0000744001008C410100F8B5071CE0 -:10F0F0002C48141C2C4A484386468018800D8446B0 -:10F100002B482A4A06261D1C48434A430E2F40D24C -:10F1100001A3DB5D5B009F443C0090AB0000060850 -:10F120000A0F14181D202724272B2F31C8001FE099 -:10F1300088001DE0214970464018000D18E01F4A64 -:10F140008018800D401821E01E481018000D1DE0A9 -:10F150001D4970464018400D0AE03C00CCAB000051 -:10F160001B49401801E01B481018400D11E01A49D6 -:10F17000401805E060462080002016E0174810186F -:10F18000800D06E0164902E016484843164940182B -:10F19000C00D03308008800020802E803C0008AC29 -:10F1A0000000F8BDFF21FF20F6F749FB002020807A -:10F1B0002880F6E70000D1451700FFFF3F00E33845 -:10F1C0000E0055551500FFFF0F00A9AA2A01701C5B -:10F1D0003700FFFF1F00CBCC4C00701C47003C00E9 -:10F1E00044AC0000A9AA7A00701C6700A9AABA0062 -:10F1F00084F61200EC25B4000449002801D009224D -:10F2000000E014224A80486070470000A4690100B1 -:10F2100080B50622F5F740FC80BD0000BCB5151C8A -:10F220003C0080AC0000041C04310904090C01AA54 -:10F230006B46FFF76AFF3820064968434018A10073 -:10F24000405A00AB99884018198840180004000CF7 -:10F25000BCBD8C410100BCB5041C151C01AA6B4649 -:10F26000FFF73C00BCAC000053FF38200549684361 -:10F270004018A100405A00AB998840180004000CC7 -:10F28000BCBD00008C41010080B500280FD00029D2 -:10F290000DD002780B789A4209D1FF2A05D0427826 -:10F2A0000232F5F73C00F8AC000081FB002801D1E8 -:10F2B000012080BD002080BD000080B506220449E9 -:10F2C000F5F775FB002801D1012080BD002080BD2D -:10F2D00000005E400100011C49780120002900D097 -:10F2E0000020704700003C0034AD000080B50622CD -:10F2F000F5F760FB002801D1012080BD002080BD12 -:10F3000080B5FFF7C7FF80BD80B506220449F5F739 -:10F3100051FB002801D1012080BD002080BD0000EC -:10F3200012610100011C80203C0070AD000081438F -:10F330008A080E201C2A10B506D2034C5200A35C8A -:10F340008B4201D11019407810BDFC4101001423FB -:10F350000249584340184068704774400100202219 -:10F36000011C80B50248F5F752FD3C00ACAD000031 -:10F3700080BD0000486101000806000E022801D18E -:10F38000002070470120704700290CD00749096808 -:10F39000002908D01423064958434018C0680028A3 -:10F3A00001D0012070470020704700003C00E8AD0C -:10F3B0000000AC6901007440010010B5041C062275 -:10F3C000011C0448F5F77DFB0622211C0348F5F7D4 -:10F3D00078FB10BD00001261010040800700002989 -:10F3E00001D10020704738235A43074BD2183C0004 -:10F3F00024AE00008300D25A14235843054BC01892 -:10F4000040881018081A0A380004000C70470000E1 -:10F410008C41010074400100F8B5071C081C161C43 -:10F420001C1C191C00F05AF8051C1435221C311C38 -:10F430003C0060AE0000381CFFF70BFF28180004EA -:10F44000000CF8BD000000B500F04BF80A300004D5 -:10F45000000C00BD0000F8B5071C081C161C1C1C85 -:10F46000191C00F03EF845001E35221C311C381CCA -:10F47000FFF73C009CAE0000EFFE28180004000CD3 -:10F48000F8BD0000FFB50F1C81B00AA9141C1E1C9A -:10F4900003C900F029F8051C1E35211C301C00F0A2 -:10F4A00023F82D18221C391C0198FFF7D5FE2818C7 -:10F4B0000004000C3C00D8AE000005B0F0BD0A49C5 -:10F4C00080B50988092904D0142907D101018000D9 -:10F4D00000E0C10008180004000C80BDFF21FF20DF -:10F4E000F6F7D1F9002080BD0000A669010038239D -:10F4F0005943064A14233C0014AF000089188200C7 -:10F50000895A054A58438018408808180004000C9E -:10F51000704700008C41010074400100024803491B -:10F5200000684000085A7047A86901005440010073 -:10F530000A20704710B5041C3C0050AF0000FDF7D6 -:10F5400062FF201C10BDB0B5041CC0680568A01D7A -:10F55000FFF7F5FE002818D0211C1431201C08F0FC -:10F56000E2FD002811D0298809482022818269887B -:10F570000183A98806354183C5613C008CAF00003A -:10F580003021095D1154616B41620120F7F728F8C1 -:10F59000201CB0BD707C010070B5041CC068211C2B -:10F5A00014310568201C08F0C1FD002808D0054E64 -:10F5B000F06802F0CFFD2888F08203203C00C8AF3D -:10F5C0000000F7F710F8201C70BD707C01003EB5FC -:10F5D000041CC0680568A01DFFF7B7FE002821D0F5 -:10F5E000211C1431201C02AA08F077FD002819D034 -:10F5F00002984B21095C002910D0012914D03C004D -:10F6000004B0000002290CD129880D2000AB18801D -:10F61000201C03F051F80190684602F05DFAF6F7FD -:10F62000B5F80021029806F09FFE201C3EBD07F0B1 -:10F6300029F8029800218069C207D20F0420F6F74A -:10F640003C0040B000007FFFEEE710B5041CFDF762 -:10F65000E6FE201C10BD3EB5051C00F040FE002853 -:10F6600015D1281C1430FAF7CEFB00280FD0052145 -:10F670002869FFF786FB041C09D00522211C684677 -:10F68000F5F73C007CB000003DFA05340294684672 -:10F6900003F01AFB2A1C0D218F2008F08FFB00209D -:10F6A0003EBD000010B5041CFAF798F8201C05F0C8 -:10F6B000E5F8201C10BD0000B0B5041C0069002155 -:10F6C00094B0FFF73C00B8B0000061FB6946FBF75F -:10F6D00026F800281ED00098FAF729FA011C01A884 -:10F6E00002F0D7F90098FAF7D2F90490052009AD95 -:10F6F000687202A8211C06220230F5F706FA0120E2 -:10F700000890216A0A903C00F4B00000282009917A -:10F71000005D287201A800F069F8201C14B0B0BD8B -:10F72000FFB5161C1F1C81B00A9D4C20F6F790FBFC -:10F73000041C143006220299F5F7EAF9201C06226F -:10F740000199F5F7E5F928203C0030B100000021CF -:10F750000655E1602762002D01D08E2000E08D204B -:10F76000221C0D2108F033FB05B0F0BD0000B0B540 -:10F77000051C4C20F6F76FFB041C4C22291CF5F7E6 -:10F7800026FA2920405D0D282CD23C006CB10000E7 -:10F7900001A31B5C5B009F44281A281E060A282828 -:10F7A0000E2822121600221C0D218C201AE0221C89 -:10F7B0000D21832016E0221C0D21842012E0221C42 -:10F7C0000D2185200EE0221C0D2186203C00A8B1D1 -:10F7D00000000AE0221C0D21872006E0221C0D21DA -:10F7E000892002E0221C0D218B2008F0F6FAB0BD22 -:10F7F000E868F6F7E6F9201CF6F711FBB0BDFEB598 -:10F80000051C9020F6F72DFB041C9021F5F73C0019 -:10F81000E4B100005BF9374E0127F069042803D9F1 -:10F82000706B013070634DE03348B16B04F0D0F879 -:10F8300001202062A87E211C803102910870221CC8 -:10F840006032019200202F1C20379072787A2B1C96 -:10F850003C0020B200001433D072E868AA1DA060FA -:10F86000E86B48604420405D0872291C201C05F0AC -:10F87000AAFC686A00280AD1019A201C937A02998E -:10F88000221C703258300978FAF7DBF906E03A7A30 -:10F89000231C3C005CB20000E869296A7033FDF764 -:10F8A0008DF93020405D184907280BD15820005DA4 -:10F8B000C007C0170130E06100202061201CF7F76D -:10F8C0003FFF18E00122201C05F0ACFF071C12D0FE -:10F8D00003F006FF3C0098B20000F36D002B06D049 -:10F8E00060682030827B616B381CF5F799F8E86816 -:10F8F000F6F773F9201CF6F79EFAFEBDF0690130A9 -:10F90000F061FAE70000C4690100346301000531C9 -:10F91000000070B5061C3C00D4B200000D1C0904A8 -:10F92000090C0020F6F77CF9041C2A1C311C006825 -:10F93000F5F706F9201C70BD4088704703781B0757 -:10F940009B0F0B70007800091070704704307047EF -:10F9500004307047D42101703C0010B30000002136 -:10F96000417070470000C421017000214170704750 -:10F970000000B4210170002141707047000001496E -:10F98000486570470000C469010001490865704777 -:10F990000000C4690100014988653C004CB30000C7 -:10F9A00070470000C4690100F8B55F4F051CB868D6 -:10F9B0000130B86007F024FD38619020F6F766FA50 -:10F9C000041C9021F5F794F8286B271C6063688B62 -:10F9D0008037261CC007C00F2062688B3C0088B3AC -:10F9E0000000603602214007C00F2063688B80074B -:10F9F000C00FF860287F3870B172002808D1F9F77D -:10FA0000C8FF002802D00120606201E00120A0624E -:10FA1000F868002803D00021022006F0CCFF3C004B -:10FA2000C4B300002B1C1033AA1D291C201C05F098 -:10FA3000DFFBA86A00280CD13978022907D0221CE4 -:10FA40007032201C5830B37AFAF710F908E001261A -:10FA50005EE0AA7D231C286A696A7033FDF7C0F84E -:10FA60003C0000B40000E96800200989002900D1A9 -:10FA70000420F0723878012814D10027009000206B -:10FA800006E02969012903D1A969012789071AD547 -:10FA900006F079FC0028F4D1012F14D10098012838 -:10FAA00011D13C003CB4000008E0201C583006F0A6 -:10FAB000E1FC00280AD08069800707D5F07A082188 -:10FAC0000843F0720120E062E87D3073E868A060CE -:10FAD000E06A002812D01A4FF86B00280ED0307B55 -:10FAE000F5F7DEFE3C0078B40000002809D0211CA8 -:10FAF000381C4030FCF755FC1448B96B03F089FF03 -:10FB0000F8BD104F1248B96B03F083FF0022201C90 -:10FB1000104905F0A2FE061C03D1386A0130386294 -:10FB2000EEE7201CF6F73C00B4B400009FF9E8684B -:10FB3000F6F76EF803F0F2FD0448836D002BE2D077 -:10FB40000022301C296BF4F786FFDCE7C469010052 -:10FB5000C4600100346301001130000010B50A20B8 -:10FB600007F0FEFC07F05EFC3C00F0B400000B491F -:10FB700044180CE0201C07F090FB002807D0F7F792 -:10FB800034F9002803D012218620F5F7CAFEF7F7D2 -:10FB90002CF90028EED101F080FD10BD0000409C42 -:10FBA000000010B50C1C011C174A3C002CB50000CD -:10FBB0000129506904D080291DD0812921D11CE060 -:10FBC0009178012915D102219170141C011C104853 -:10FBD00003F028FF0121606900F02EF9606901F04F -:10FBE0005FFC2070A088A16900230A4A3C0068B528 -:10FBF000000007F07EFC10BD222106E001F01DFC94 -:10FC0000201C00F04AF810BD1C212020F5F78FFEC3 -:10FC100010BDB4790100346301003D2E000070B5C1 -:10FC20001C4CA078002832D0052830D060693C00F8 -:10FC3000A4B5000000F0EAF8184EB579A0780128C4 -:10FC40000BD002280ED0032810D0042817D1421F51 -:10FC50008021202008F008F80EE00021202008F084 -:10FC600031F80CE0A08807F01DFC05E0207800F0DA -:10FC70003C00E0B5000039FA002000F0C4FD6069E6 -:10FC800001F0E1FB0520A070B571606900F061F939 -:10FC900000222021812008F0D6F870BD0000B47940 -:10FCA000010020100700B0B50D4D041CA8780028F5 -:10FCB00014D03C001CB60000686900F00BF90A483B -:10FCC000696903F0A7FEA88807F09EFB002C02D00C -:10FCD000687800F079FF0020A870A968201CF4F76C -:10FCE000CAFEB0BDB479010034630100064B80B593 -:10FCF000997803293C0058B6000006D10421997078 -:10FD00002021021C802008F0A4F880BD0000B479F6 -:10FD1000010010B50C4CA17803290FD11030FAF76F -:10FD2000DEF8002809D0207800F0E5F9002000F086 -:10FD300070FD002105483C0094B60000FCF79CFAD9 -:10FD400010BD1B212020F5F701FE10BDB479010084 -:10FD500051B60000094980B58978032909D100F01E -:10FD6000CDF9002000F058FD01210548FCF784FA88 -:10FD700080BD17212020F5F73C00D0B60000E9FD3A -:10FD800080BDB479010051B6000070B5104C1D1C47 -:10FD9000A378061C0498002B18D10123A3702261BC -:10FDA000E6606170A060A561002007F0ACFAA08059 -:10FDB000301CF7F73CFBE08007F03C000CB700007C -:10FDC0004FFBC721C900281A411A0022202007F042 -:10FDD00057FF70BDB4790100B0B5041C0D1C00F0D4 -:10FDE00009F8201C00F024F8002D01D0FFF7D4FE04 -:10FDF000B0BD0000B0B50C4C051CA0683C0048B775 -:10FE0000000000280FD10A48017E022211406160E3 -:10FE1000017E11430176072003F049FC206003F0C6 -:10FE200098FF03F0EEFFA0682843A060B0BD407CBF -:10FE300001000C8007000A4938B50A1C20323C003A -:10FE400084B70000947900AB1C70D279074C5A70CB -:10FE5000E268002A02D1064D01236B701043E06076 -:10FE600000AB1888C88438BD00100700407C010032 -:10FE700000500700B0B5051C002901D000F028F89B -:10FE80003C00C0B70000064C60782169084303D1EC -:10FE900001210E2006F0C5FD206928432061B0BD78 -:10FEA000000018630100B0B50A4C051C226900204F -:10FEB000002A0CD1002900D004E06078002802D18B -:10FEC00004F03C00FCB7000069FB6070281C06F0E1 -:10FED000EFFC0120B0BD00001863010010B5084C14 -:10FEE000607800280AD006F0E3FC002060702069EA -:10FEF000002803D001210E2006F096FD10BD000061 -:10FF0000186301003C0038B80000094980B50B694E -:10FF1000834204D14A78002A01D1012200E0002264 -:10FF200083430B61002A03D000210E2006F07FFDE1 -:10FF300080BD1863010080B50120F6F756FE80BD34 -:10FF4000000010B5041C3C0074B8000000F004F878 -:10FF5000201C00F01FF810BDB0B50C4D041CA868A3 -:10FF6000A0420FD10720296808F08CFB68680222A4 -:10FF700007490028087E01D0104300E0904308762E -:10FF800004F0C4F8A868A0433C00B0B80000A86022 -:10FF9000B0BD407C01000C8007000A4938B50A1C3E -:10FFA0002032947900AB1C70D279074C5A70E26809 -:10FFB000824202D1064D00236B708243E26000ABA7 -:10FFC0001888C88438BD001007003C00ECB8000059 -:10FFD000407C010000500700B0B5051C0A4C002110 -:10FFE0006069FFF711FF042001F046F901F088FB7A -:10FFF00000220421042001F08BF8281C01F04AFAA9 -:02000004800179 -:100000006069FFF7A7FFB0BD407C01003C0028B944 -:10001000000080B501F077FA80BDB0B50D4D01212B -:100020002869FFF7F4FEFFF72AFE00F02CFB00F032 -:1000300084FA002400220421201C01F06CF8013411 -:100040002406240E042CF5D32869FFF786FF3C0014 -:1000500064B90000B0BD0000407C0100F8B5051C8B -:100060000E1C074C171C01212069FFF7D3FE3A1C18 -:10007000311C281C01F052F82069FFF771FFF8BD10 -:10008000407C0100FFB589B0061C16981D1C002895 -:100090003C00A0B9000001D02948149028680088CD -:1000A0000006800E202801D0142817D10AAA18248F -:1000B000182105CAFFF777F9071C281C0189A142FE -:1000C00002DD006801190BE0C068641A0028F5D150 -:1000D0000F213C00DCB900008620F5F761FC00210F -:1000E00001E00021002718480890807907900C2033 -:1000F000164A704380180479049112991598149A3D -:1001000001910390059700950AAB0292211C301CC7 -:100110000CCBF7F73C0018BA000003F90125B540F5 -:100120000C4E083E3078284006D0201C00F0C9FD57 -:100130003078A843307003E0201C139900F043FF8F -:1001400007A903C988710DB0F0BD952400002010E7 -:100150000700747A01003C0054BA0000B0B5041CDA -:100160000C230949584340180079051C00F092FE01 -:10017000281CF7F7C7F80120034AA040083A117875 -:1001800081431170B0BD0000747A010010B5054CB8 -:100190002078002803D11A213C0090BA0000862064 -:1001A000F5F707FC207810BD000018630100014836 -:1001B0004078704700002C63010080B5F6F7D1FE4F -:1001C00000F01BF980BDFEB50168051C0C680E1C13 -:1001D0002178880771D16869C2073C00CCBA000059 -:1001E0006ED580076DD5E87AC20708070909029124 -:1001F0004549800FD20F00284F6805D0012809D04B -:10020000022821D003285BD1FF23201CA97AF4F710 -:1002100074FC55E002980B280AD00C283C0008BB5F -:1002200000000FD00D284ED1394FF868F4F761FC6B -:100230000020C0435AE0354FA97ABB68201CF4F770 -:100240005BFC40E0324F3869F4F753FC3BE000219F -:10025000019102990020FF23090701D401203C00ED -:1002600044BB000013E03189192901D3267E07E041 -:10027000152904D31826711A49190E7B00E00026AF -:10028000B10602D4012073075B0F01210191002800 -:1002900003D0A97A201CF4F736FC0199012915D165 -:1002A0003C0080BB0000F006C60F20881B4FE48A8C -:1002B000F96B0005C00F00291AD04B1C18D0002E76 -:1002C0000AD0002808D03888844213D002980C281D -:1002D00001E01DE012E00DD0081C01F076F90028C5 -:1002E00003D13C00BCBB000000F0A6FAF4F70AFC06 -:1002F0000020C043F863002E0DD03C800020F8633E -:1003000009E020880006800E202804D1044F201C1C -:10031000B96AF4F7F8FB291C0248FBF7EFFFFEBDB2 -:10032000287A01003C00F8BB0000A59A00000348B1 -:1003300080B50078002100F0FCFB80BD0000186350 -:100340000100044B054900281A6800D0011C101C4C -:10035000196070470000D4790100957500000548C8 -:1003600080B5007F24233C0034BC0000044958437E -:100370004018C069F4F7CCFB80BD0000D4790100BF -:1003800094460100021C064880B581628260007FAD -:1003900024230449584340188069F4F7B9FB80BD11 -:1003A000D4790100944601003C0070BC000080B587 -:1003B000002000F03CFB002000F06DFA00F065FA30 -:1003C0000449C86A0130C862081F008807F0C1F8F4 -:1003D00080BDD4790100064880B500210177C16A4B -:1003E0000131C1620438008807F03C00ACBC000059 -:1003F000B3F803F0D1F980BDD479010080B505F0E0 -:10040000E9FA80BD80B5002803D1012004F022FA6A -:1004100080BD012003F0E6FB80BD00000349012000 -:100420004978002900D00020704700003C00E8BC5B -:1004300000002C63010070B5134D2878002820D1EE -:1004400001212E1C7068FFF712FD0021072006F025 -:100450002AFB0D480024047104F0EDF806F0D5F9EC -:10046000012028700A4804604460F6F74CFD3C0007 -:1004700024BD0000F7F75EF8FFF7A2FF00F0A8FD2B -:100480000548716803F020FB012070BD2C6301005A -:100490005000070080000700C4600100B0B51E4C8A -:1004A0002078012835D1251C69681C4803F020FB01 -:1004B0003C0060BD000004F0F0F81A4801684908EB -:1004C00049000160016801221143016000F02BFE28 -:1004D00000F01BFC06F099F8F6F729FEF6F72DFC64 -:1004E00000202070FFF783FF00F08BFD0F4881781C -:1004F00008223C009CBD000091438170817811432B -:1005000081700C49102008716868FFF75FFDF7F7EC -:1005100039F8F6F74DFD0121072006F0CDFA01204C -:10052000B0BD00002C630100C4600100F0000700B2 -:10053000000007003C00D8BD000050000700034940 -:100540000120897A012900D0002070470000147A28 -:100550000100B0B5154D041C287A002820D1F9F708 -:1005600000FC02281CD101202872E868002810D065 -:100570002068296808603C0014BE000069680D48C6 -:1005800003F0C2FA01216868FFF7C8FC00222420AA -:10059000616807F0CFFBB0BD002028722168012000 -:1005A000F4F7CFFAB0BD00202168F4F7CAFAB0BD65 -:1005B000047A0100346301003C0050BE000004488E -:1005C00080B5007A012802D1002002F0F0FE80BD43 -:1005D0000000047A010080B5012807D0802809D1E5 -:1005E0000748007A002804D0012000E0002002F033 -:1005F000DEFE80BD0E212420F5F73C008CBE0000FD -:100600000BFA80BD047A0100F8B53A4E051CB07AA9 -:10061000002869D1F9F7AEFB022865D13648006899 -:10062000002861D03548716803F074FA01217068C0 -:10063000FFF77AFC6C20F5F7B9FC041C3C00C8BE3F -:1006400000006C21F4F7E7FA30682C220460296876 -:1006500081606968C160002111548162A968002924 -:1006600002D0E968016105E006F05DFF69684018A5 -:10067000316808617068FFF714FD692108553C0076 -:1006800004BF00000020F9F709FB01273B1C061CF2 -:10069000221C24320021F9F779FB1C480321008831 -:1006A00089030843211C40310091488318481021D8 -:1006B00060601848A060A76367630020F5F74CFBF3 -:1006C0003C0040BF0000E06002890099CA830768CF -:1006D000311C381D2761FEF78EFE381C0A300F4989 -:1006E000FEF789FEA4203880002004F0DEFB002203 -:1006F0001F20696807F02DFBF8BDFFE7002029687F -:10070000F4F73C007CBF00002EFAF8E7147A0100F1 -:10071000805A010034630100FA60010099EC000086 -:1007200015ED000012610100064880B5817A0029AC -:1007300007D0006804222030017B1143017302F0CE -:100740006BFD80BD3C00B8BF0000147A010010B5FD -:10075000044CA07A012803D106F0F1FE21688861DB -:1007600010BD147A0100031C081C1F4970B50A68EB -:10077000012B1CD0802B05D0832B30D1887A002808 -:1007800014D029E053693C00F4BF0000002B0ED0C8 -:100790009469D5692E1B0C695D1B361BB610A41914 -:1007A0000C61CC682D1BAD106419CC60936102F014 -:1007B00081FD70BD022812D1906A0C1C0028F8D06F -:1007C00007F00EFAA07A01283C0030C00000F3D1F7 -:1007D0002068816A0029EFD12030017B0822114373 -:1007E000017370BD02F021FD70BD0E211F20F5F7D1 -:1007F00028F970BD0000147A010002490C3103C9C8 -:10080000401870470000147A01003C006CC00000E2 -:10081000054880B5006804222030017B1143017334 -:1008200007F0E4F980BD0000147A010070B5164CA1 -:100830000E1CA17A00291CD02168086107F032FA49 -:10084000002817D020680025056200223C00A8C0BF -:10085000000083211F2007F094FA6068FFF703FC73 -:10086000216804222031087B2B1C90430873311C23 -:1008700000221F2007F061FB70BD20680822203095 -:10088000017B1143017302F0D6FC70BD00003C00F7 -:10089000E4C00000147A010080B500F077FC00F09D -:1008A0006FFC00F029FF00F05DFA00F0C5F800F0E1 -:1008B00085FF80BD80B5FAF785FA80BD0148C06824 -:1008C00070470000287A01000349002800D0011C6D -:1008D0003C0020C100000248C160704700008175E3 -:1008E0000000287A010001480249C86070478175FC -:1008F0000000287A01000149886170470000287AC9 -:1009000001000149002088617047287A01000349ED -:1009100000283C005CC1000000D0011C0248C161FD -:100920007047000089750000287A010003490028FB -:1009300000D0011C02488162704700008D750000E4 -:10094000287A01000349002800D0011C02480162F6 -:10095000704700003C0098C1000091750000287AA3 -:1009600001000349002800D0011C024801617047C2 -:10097000000099750000287A0100014802490861C9 -:10098000704781750000287A0100021C081C802A2B -:1009900080B502D100F03C00D4C1000007F880BD52 -:1009A0001E212120F5F762F880BD0000B0B5104D82 -:1009B000041CA86B0130A863696B091A281C006B22 -:1009C0000C2903D90021FFF791FA03E0082901D18E -:1009D000FFF732FB201C00F03C0010C200004DF974 -:1009E0006069400701D503F00CFC201CE96AF4F7AC -:1009F000DBF8B0BD0000287A01000349002800D0D0 -:100A0000011C0248416270470000B5750000287A59 -:100A1000010003490120096C00293C004CC2000080 -:100A200000D1002070470000287A010010B5074C63 -:100A3000E16B002901D1E06304E0814202D0002093 -:100A4000C043F8E706F09CFD206410BD287A010041 -:100A50000148006C70470000287A01003C0088C201 -:100A60000000054980B5002048638863FF210931F3 -:100A700015221020F6F7FBF980BD287A0100034902 -:100A8000002800D0011C0248816070470000C17539 -:100A90000000287A01000349002800D0011C3C0016 -:100AA000C4C200000248C16270470000C575000062 -:100AB000287A0100044B054900285A6800D0011C1F -:100AC000101C596070470000287A0100C9750000A9 -:100AD0000349002800D0011C024841617047000012 -:100AE0003C0000C30000CD750000287A01000F4BC8 -:100AF00010B5D968002919D00E4C0021CA0012196E -:100B0000403AD26B824202DA01310329F6D3481C03 -:100B10001A780006000E904208D018700806000EE1 -:100B2000041C3C003CC30000F6F7BAFA201C03F09A -:100B30001BFD10BD186301003C42010010B5144CB0 -:100B4000E168002922D02178124BCA00D218403A1D -:100B5000D36B834202DA481C20700BE0926B824216 -:100B600014DDFF313C0078C300000806000E207041 -:100B700003D119218620F4F78EFF2078FF3000067C -:100B8000000EF6F790FA2078FF300006000E03F012 -:100B9000EEFC10BD0000186301003C420100094852 -:100BA0000021018141813C00B4C300008181C181E9 -:100BB000074A02800123DB0243808280C2804176A3 -:100BC00031218176012101767047000030800700D5 -:100BD000FFFF000080B50120F6F7F8F80120F6F7D6 -:100BE000DBFC0120F6F75AFA3C00F0C300000120BC -:100BF00000F0F1FD0120F7F7C6FB80BD000010B545 -:100C0000114C002907D1002802D10120E06006E044 -:100C10000021E16003E0012907D1002801D0207004 -:100C200003E018218620F4F73CFF3C002CC40000B0 -:100C30002078FF300006000EF6F73EFA2078FF30ED -:100C40000006000E03F09CFC10BD000018630100BC -:100C5000054980B50968884205D0FEF7FFFB00F022 -:100C600087FAFFF72BFC80BDA86901003C0068C42F -:100C7000000001494870704700002C6301000149E1 -:100C8000C860704700004C7B0100034901200978CF -:100C9000002900D00020704700002C630100044AA6 -:100CA000002802D0906901309061D06940183C0062 -:100CB000A4C40000D0617047905C0100FEB5041C24 -:100CC00000680568281CFEF727FF071C6069154EA1 -:100CD000C007C00F21D001AA02A9281CFEF712FFED -:100CE0003878C0070CD46069800708D500AB187A43 -:100CF0003C00E0C40000002801D0022802D1706A44 -:100D000001307062FEBD00AB187A002801D00228C5 -:100D1000F8D1706A01307062B06A0130B062F1E7F8 -:100D2000F06A0130F062EDE70000905C01000249DA -:100D300048693C001CC50000013048617047000054 -:100D4000905C01007047000070470000011C4031BA -:100D500010B50A8B1207920F012A33D04A781A492C -:100D6000041C6034002A0B6A22D1E279012A02D9DC -:100D7000CC6801343C0058C50000CC60022A02D97E -:100D80000C6901340C610C6801340C60446B002C5C -:100D900003D00469247CE40702D54C6801344C601C -:100DA000806B002802D0086B01300863002A0CD049 -:100DB0009818013808E03C0094C50000012A01D0D1 -:100DC000022A02D1886801308860E0791818086228 -:100DD00010BD0000905C01007047000001490A202E -:100DE00008817047C47A0100F0B5324F041C78784E -:100DF00085B0C007C00F03903C00D0C50000B87894 -:100E000002900120A0400490391C88702C48008872 -:100E100006F00BFC0190FEF7AEFC0430294EA50055 -:100E200071590979884206D0FEF7A5FC7159043042 -:100E3000087101207870002078703C000CC600001A -:100E400021480121204E3038015571590320087086 -:100E500006F0C6FB061CFEF791FC36180E3609E0BC -:100E6000301C06F0F5FA002804D023218620F4F780 -:100E700033FE03E0F6F734FB0028F1D03C0048C60F -:100E80000000124813493C3800780872201CF4F71F -:100E9000A2FA0E4E715908710398002801D0012161 -:100EA000797009480088019906F0BDFB0298B87076 -:100EB000094949790498884203D0242186203C00BE -:100EC00084C60000F4F70EFE05B0F0BD0050070028 -:100ED000D0790100107B010080800700508007005E -:100EE000B0B50D1C041C052801D3F4F729FE052D0F -:100EF00001D3F4F725FE0B4AA8001158A0001058A2 -:100F00003C00C0C600000EC90EC0062106220648DD -:100F100069432A380918624310180622F3F70FFFB5 -:100F200002483038415D0155B0BD107B0100B0B5BD -:100F3000041C0E480D1C80780121A140084003D0FC -:100F400001213C00FCC600008620F4F7D1FD0621FB -:100F50000622094869430918624310180622F3F76C -:100F6000F1FE201CF4F740FA034AA1002A3251583E -:100F70000871B0BD00500700E67A0100034980B552 -:100F8000002048603C0038C7000007F032F980BDFF -:100F90000000D47A010010B5041C052801D3F4F731 -:100FA000D8FD0749087A074A107001200872FEF739 -:100FB000F4FB044A0430A1003C325158087110BDC2 -:100FC0000000808007003C0074C70000D47A010054 -:100FD000034980B50120486007F00EF980BD00008C -:100FE000D47A010010B5041C052801D3F4F7B4FD30 -:100FF000201CF5F78FFE0021201CFBF731FD01219D -:10100000002800D0011C09043C00B0C70000090CF6 -:10101000201C04F022FA10BD000006490120054BF7 -:10102000886000203C33002182009A581170013002 -:101030000528F9DB7047D47A01000F4938B5002044 -:1010400088600E48011C20318A793C00ECC7000002 -:1010500000AB1A70C9790A4C094D59700C343C35F3 -:1010600000210322635C002B02D08B00EB581A7026 -:1010700001310529F6DB00AB1988C18438BD0000B9 -:10108000D47A010000100700FFB5144F3C0028C8B7 -:101090000000041CBE790D1C81B00F2000F0B9F8CF -:1010A0002A1C104D0090211C281CF4F7DEFC211C8A -:1010B000A81D039AF4F7D9FC211C281C0C30049AB3 -:1010C000F4F7D3FC211C281C12300A9AF4F73C00D8 -:1010D00064C80000CDFC07F09BF8009800F076F89B -:1010E000BE7105B0F0BD000020100700E67A0100D7 -:1010F00010B50020F6F726F80749887800090001A6 -:1011000088700024201CF5F711FE01342406240EFB -:101110003C00A0C80000042CF7D310BD0000005014 -:10112000070080B502F0E3FB034881780F221143EA -:10113000817080BD000000500700F8B50D1C041C34 -:10114000052801D3F4F717FDA600002D114F07D194 -:10115000B8593C00DCC80000816800290ED14078F5 -:1011600000280BD002E0FF352D062D0E291C201C77 -:10117000FBF788FC011C201C04F07EF906490120C5 -:101180003039085504483C388068002802D1B959E4 -:10119000032008703C0018C90000F8BD0000107B57 -:1011A000010080B504F0CDF980BD10B5041C052800 -:1011B00001D3F4F7E6FC201CF5F7C1FD0020054A39 -:1011C000A10051588860044988780122A240104348 -:1011D000887010BD00003C0054C90000107B010065 -:1011E00000500700024A9178084390707047000051 -:1011F00000500700F8B50C4FBE790F2000F018F82A -:10120000051C0024201CF4F70DF9084AA1005158D0 -:10121000087101342406240E3C0090C90000042CFF -:10122000F3D3281CFFF7E1FFBE71F8BD00002010CA -:101230000700107B0100B0B508498D788A78054019 -:1012400082438A7006F0F9F9041C0A34201C06F067 -:1012500034F90028FAD0281CB0BD3C00CCC90000ED -:101260000050070001490A2008817047387B0100BF -:10127000F8B510480426041CE034051C383D00274E -:10128000201C1C30E460A06127610B48A682E0614D -:101290002762A7620620A084201CFEF73C0008CA33 -:1012A000000087FC201C0C30F6F7B7F90549383CE4 -:1012B000AC420880E7D1F8BD0000D4E4010012611F -:1012C0000100487B0100F7B5051C0C230F1C1249D7 -:1012D00058434418208806F0EAF9A07801283C0019 -:1012E00044CA00001AD16668022F05D15C20805BD9 -:1012F00002990009884211D1281CFEF7FBFF301C1F -:10130000F9F7FAFD0420A070391C281CFBF7F4F84B -:10131000034AE8003C32115801311150FEBD000073 -:101320003C0080CA0000607B01000120064A0021C9 -:101330000C234B439B189B78002B00D000200131DD -:101340000429F5DB7047607B010070B5041CFFF7D2 -:10135000EAFC002803D120210C20F4F7F6FB261C20 -:1013600060363C00BCCA00000021F171E164606B92 -:10137000251C4035002831D0FFF704F90122120363 -:1013800000282069018801D0914300E011430180C9 -:10139000206901220088D2022883201C583001884D -:1013A000914301803C00F8CA0000A36B5208002B57 -:1013B00010D091430180288B0007800F012815D0A1 -:1013C0002E20015D20690430F8F741FD616AFEF7C7 -:1013D000A8F904E011430180201CFBF7CCFB6883D3 -:1013E00004E0206941803C0034CB0000A88B2169D7 -:1013F000C882E068F6F720F93080606D002804D0DC -:1014000000220321707AFEF70DFF201C00F0B6F9D0 -:10141000707A06F045F870BDB0B5002406F022F9E8 -:10142000094A00210C234B433C0070CB00009D185F -:101430006B685B6CAD78C31A012D02D1A34200DD4D -:101440001C1C01310529F0D3201CB0BD0000607BBD -:101450000100B0B5041C06F0A8FE0C20084960434A -:101460004518288806F035F968683C00ACCB0000C8 -:10147000002806D02030007B012802D1201CFFF775 -:10148000A3FAB0BD607B0100FFB585B00FAE60CEA2 -:1014900038201E497043171C4418FFF77FF80122BB -:1014A0001203002803D02088904320803C00E8CB22 -:1014B000000002E02188114321801198391CE0626C -:1014C0000598F8F7D0FC011C2B1C381C069AFEF777 -:1014D00020F960800622201D0F49F3F772FC231CBF -:1014E0000898303318700E980C49587065633C00AA -:1014F00024CC0000002002900122049209480391AC -:101500005A780188019200911978243B301C626B53 -:10151000FEF7A8FE09B0F0BDD4E40100126101009D -:101520005D4E0000487B0100FFB587B0109812AFF8 -:101530003C0060CC00008C46A2CF4C23304C6B4367 -:101540001C19161C159A2785271C303706970597F6 -:1015500000233B73059F78731198271C60646160BA -:10156000226040373E70614661870798311CF8F76A -:1015700080FC3C009CCC00000599C8730A987870E8 -:10158000301CFEF773F8002801D0012000E0002095 -:10159000410002200140119A0120002A00D10020C0 -:1015A00008433872201C2E300799FDF7CFFF281C06 -:1015B00004F0AEF83C00D8CC0000FEF7FEFF4C2251 -:1015C000124B6A43D218012109032A32002804D0A1 -:1015D000101C12888A43028002E0108808431080A1 -:1015E0000B490020039106990290002204920848BA -:1015F0000A7B4188231C3C0014CD0000019200911D -:1016000079780833281C6268FEF738FE0BB0F0BD0D -:1016100058E30100754F00003C7C0100B0B50C1C84 -:10162000012827D0802830D1E06C002808D069201C -:10163000005D1849C00040183C0050CD0000043047 -:10164000016801310160201CFFF7E9FB134D503D9B -:10165000E868002805D02E20005DFEF710F802F0A3 -:1016600042FE201C6168F3F72FFB403460780028AD -:1016700002D106F012F8A860B0BD3C008CCD00008D -:101680002006000E8128FAD1220C2004000E02212F -:10169000FEF7E6FDB0BD0A210C20F4F77DFAB0BDDF -:1016A0009C7B0100F8B5184E184F051C3479B879A9 -:1016B0000090201CF5F77CFF002806D03C00C8CD28 -:1016C0000000124838384068854201D1002D03D10E -:1016D00010218620F4F763FA0D490020383948605C -:1016E0000421201CFFF759FC0421201CF5F7EBFE18 -:1016F0000C21064A6143303A89180C7104203C00E1 -:1017000004CE000030710098B8710F20FFF7A6FDDD -:10171000F8BD0000A47A010020100700F8B5041CF1 -:101720000F20FFF7C1FDF5F73BFF0125002800D092 -:101730000025164EB079164F00903879042801D153 -:101740003C0040CE0000002C03D111218620F4F78C -:101750002CFA1048290638384460090E0C1C042065 -:10176000FFF721FC0321201CFFF741FC211C042072 -:10177000F5F7AFFE0C21074A69430420303A891877 -:1017800008713C007CCE00003C710098B071201CB8 -:10179000FFF750FD0420F8BD20100700A47A0100D7 -:1017A0000C2302495843401880687047747A01003E -:1017B0006030C1798079814201D9012070470020D1 -:1017C000704700003C00B8CE0000014880687047B8 -:1017D00000004C7B010038B56921095C1823104AD0 -:1017E000594389188A6801328A604B69D21ACB68DA -:1017F000934200D2CA6000220B4C0260221C2032AD -:10180000957900AB1D703C00F4CE0000D2795A707F -:101810000A68002A01D1486000E0106000AB08604F -:101820001888E08438BD0000C47B01000010070068 -:1018300018230A495843411808690130086148686B -:10184000002809D0486901303C0030CF00004861D1 -:10185000486802684A60002A00D10A607047002088 -:101860007047C47B0100F8B5124E104D0F4C0A278B -:10187000211C0020E0602A31221C1832A160626124 -:1018800027820C4AE061A26160623C006CCF0000DC -:1018900006202084081CFEF7D7F9201C0830F5F735 -:1018A00001FF4C3CAC427080E5D1FF203070F8BDA8 -:1018B00088E401000CE301003C7C0100126101009E -:1018C000F8B5041C0B480E1C171C44703C00A8CF34 -:1018D000000005F000FF051C391C301CFDF7ABFFB4 -:1018E0000C21054A28180A30614308325050034839 -:1018F000891800688860F8BD00006C7A0100786E75 -:10190000010070B50B4E051C7078FF280FD03C000D -:10191000E4CF00000C23084C58430834205805F04D -:101920001DFE002806D170780C23584300198168E9 -:101930002943816070BD00006C7A010080B53021C0 -:101940000148F3F743FA80BDECE5010010B505F05E -:101950003C0020D00000C5FE0A4944180CE0201CC1 -:1019600005F0F7FD002807D0F5F751FE002803D059 -:1019700013218620F4F731F9F5F749FE0028EED15E -:1019800010BDB0360000FFB58BB0199B0D1C041CB8 -:101990001A203C005CD00000002B169900D11820C2 -:1019A00001901498002827D0FF20199B0130002BAC -:1019B00001D1182300E01A230433824204D3D01A41 -:1019C000400840000004000C0D906A480088C21ACC -:1019D0001204120C3C0098D000000492002908D098 -:1019E0008979664A4900515A049A511A0A04120C1C -:1019F0000492049A824205D90020049002E06048D3 -:101A000004900D9001980104090C0A910020F4F74C -:101A100084FA009000683C00D4D0000000260690B4 -:101A20002060002005900E9800240005000C09900D -:101A30001A980D9F4007400F089007940395002DBA -:101A40000DD02889B84204D836183F1A07D0ED685F -:101A5000F5E73904090C281C3C0010D10000F4F70C -:101A600038FBEFE7002E02D10799002971D1271C1E -:101A70006C20F4F788FB0799041C002920D10794F7 -:101A80000020A0611898271C606017982437A06078 -:101A90000698206115980FC80FC73C004CD1000074 -:101AA00014985C2160630998085319986921E063D0 -:101AB0001B9808551C9860651998002823D0089831 -:101AC000069908831FE06C22201C0799F3F71AFA85 -:101AD0003C60019862213018C85315983C0088D1A9 -:101AE00000004021807AC8550020B86306980A9902 -:101AF000F4F71FFAF8600299F4F73BF9201C403024 -:101B0000818B059A1207120F1143818303985E217E -:101B100002900198224A30180853126801213C00B3 -:101B2000C4D10000081C002A00D01B980006049AAB -:101B3000000E964203D92C2211551B4904E0159939 -:101B40002C22097A11551949085C662108551C9800 -:101B5000002801D01F200855002D03D0E86803900D -:101B60003C0000D20000002000E009E0E860059899 -:101B7000002601300004000C0D9F0590039D6DE7C9 -:101B80000098E0600299F4F7FAF800202060012143 -:101B9000A1636034608007980FB0F0BD000006615B -:101BA00001003C003CD200005C4301003809000009 -:101BB000186701000E6101000A6101000148006818 -:101BC00070470000C46A01000249091D03C940189A -:101BD00070470000C46901000148006970470000B7 -:101BE000C46901003C0078D2000001484069704798 -:101BF0000000C46901000148806970470000C469A1 -:101C0000010070B50D4E0020351C4035F0630DE02D -:101C1000A068F4F77AF9B36D002B04D000220120FC -:101C2000616BF3F795F83C00B4D20000201CF4F788 -:101C30009DFA281CFAF742FD041CECD170BD00008F -:101C4000C4690100F8B51A4F0026F86B00282CD0A3 -:101C5000381C403000901DE01648B96B02F05CF86B -:101C60000022201C144903F03C00F0D200007BFF4E -:101C7000051C04D1386A0130386201360DE0A068D5 -:101C8000F4F749F9BB6D002B04D00022281C616BCE -:101C9000F3F764F8201CF4F76CFA0098FAF711FDDA -:101CA000041CDCD10748B96B02F03C002CD30000C7 -:101CB00025F80020F863301CF8BD0000C46901005D -:101CC0003463010011300000C460010001490120AB -:101CD000C8637047C469010080B50020054A00212F -:101CE0001C2343439B1801300428D9663C0068D369 -:101CF0000000F8DBFCF7FDFC80BDC4690100014970 -:101D0000C86470470000C4690100014988647047D5 -:101D10000000C4690100B0B5041C0D1C211C028E1A -:101D2000806A4031F3F72FF8002816D102213C00D9 -:101D3000A4D30000201CF4F76FFAE269C000101869 -:101D4000828BAB889A4204D182692B689A4208D26E -:101D500001E09A4205D2002118300CCD0CC000E001 -:101D60000121081CB0BD0000F8B5061C002744681E -:101D70003C00E0D300000FE00949486A01304862A6 -:101D8000A069002802D0F4F700FAA761266225684E -:101D9000201CFFF752FB2C1C002CEDD1F8BDC469B0 -:101DA00001000330074A8108136850681B688900E6 -:101DB00009183C001CD400008B4201D3516000E0A4 -:101DC00000209060704700008C6E010070B5124ECC -:101DD0008038C50070590C1C002804D101210D2049 -:101DE000F3F72EFF0DE02069002805D1A81981889E -:101DF000E06801F03C0058D4000047FA20617159B6 -:101E0000201CF2F7BBFF041C002C07D0E068002860 -:101E100001D0F4F792F8201CF4F7BDF970BD5442DC -:101E2000010070B5041C0D1C0E490622F3F735F8AD -:101E30000026E66166623C0094D400000720302151 -:101E40000855E663281CF8F76BF8A076201C1430C0 -:101E50000622291CF3F724F80622291CA018F3F700 -:101E60001FF8266170BD00001261010080B5FDF70A -:101E700085FE80BD014948603C00D0D40000704719 -:101E80000000E4650100024980B54968F2F77CFF73 -:101E900080BDE465010080B5F4F7E5F9074907481E -:101EA0000EC90EC018380068002802D002F0B7FA38 -:101EB00080BD02F09EFA80BD00003C000CD5000001 -:101EC000B058010090730100054980B58968002071 -:101ED000002900D103200006000EFAF7E3FB80BDC5 -:101EE000606C010080B5034806220349F2F7DEFF6B -:101EF00080BD000040800700126101003C0048D511 -:101F00000000B0B5041C0C4D0B1C211C00200C3D26 -:101F10000029094C05D02878211C1080021C181CAF -:101F200007E011880E2907D80A06120E191C201C7A -:101F30002A70F2F7BEFF0120B0BDB06901003C007D -:101F400084D5000010B500200A4A012111600A4C16 -:101F50000AE0021C016A5032914205D061783C23AC -:101F6000594309190431016204F0BAFB0028F0D189 -:101F700010BD0000DC62010068610100044880B50A -:101F80003C00C0D500000068002803D0011C1020D0 -:101F900004F0C7FE80BD286101000322111F80B537 -:101FA0000020FBF776F980BD000080B50BF0B9FA90 -:101FB00080BDFFB583B0161C002101911F1C0821B4 -:101FC00002AA3C00FCD50000FAF70EFF041C2AD13F -:101FD00002984168490001D4092424E0FAF752FF2D -:101FE0003860029841684902CD0F291CFAF744FF76 -:101FF000011C306038680006000E00F01BF8002855 -:1020000001D10A243C0038D600000FE03168029864 -:102010002B1C01AAFAF7D7FF002806D00198002848 -:1020200004D004990968814200D2032401980499DC -:10203000086007B0201CF0BD000070B5051C0E1C28 -:10204000012400F084FF3C0074D60000002808D072 -:10205000032D01D0042D04D10320C003864200D3F8 -:102060000024201C70BD00007CB5151C061C0C1C37 -:10207000291C6A4601ABFFF7A5FF002802D1002CFE -:1020800001D103207CBD17483C00B0D6000000AB56 -:1020900006601879072821D202A31B5C5B009F44CD -:1020A00000001D040406101713000420EDE72A1C8D -:1020B000211C0120009BF2F781FE002812D106208E -:1020C000E3E72A68009905E000983C00ECD60000A0 -:1020D0004278811C01E02A686946201CF2F7FEFE66 -:1020E00003E004218720F3F7CFFD0020D0E70000B4 -:1020F000F86B0100F7B586B00E1C082105AA0698FA -:10210000FAF77EFE041C45D1059841683C0028D7AB -:10211000000002904902C90F002504950391089F11 -:10212000FAF7D5FE019002A903C9FAF7C6FE019994 -:10213000052914D202A35B5C5B009F4400000E03E0 -:10214000060C030087420ED807E087420BD83C00FC -:1021500064D700000125C01B049007E0874205D129 -:10216000012503E005218720F3F794FD002D01D11F -:10217000032415E005984168002969DA3A4A06996E -:102180001160FAF791FE071C05980399FAF786FE8D -:102190003C00A0D70000051C011C381CFFF75FFFA6 -:1021A000002801D10A245EE0072F57D202A3DB5D8D -:1021B0005B009F440000530404062E504800042492 -:1021C00051E00498002801D1002714E0089908186C -:1021D00000043C00DCD70000000CF4F72BF8071CCF -:1021E000311C089AF2F786FE089804993818F2F71D -:1021F0002FFE089804993E1C40180890311C0020BE -:1022000008AAF2F7ECFD002800D10524002F2DD0FC -:10221000381CF3F73C0018D80000EDFF29E00399C3 -:10222000002904D0059840688702BF0A00E0002713 -:10223000311C281C089AF2F760FE0499002903D08B -:1022400008982818F2F707FE002F12D0F2F7CCFDFD -:102250000FE0311CA81C3C0054D80000089AF2F78B -:102260004FFE0898687007E0FFE7072404E00824A1 -:1022700003218720F3F71AFD201C09B0F0BD0000F0 -:10228000F86B01009EB51C1C00AB19720092002275 -:1022900001946946FBF708FA3C0090D800009EBD07 -:1022A00000008FB5029200220090019003916946D0 -:1022B0000420FBF7FCF98FBD0000B0B50C1C012811 -:1022C0000AD0032819D004282CD1606801F035FC0D -:1022D000011C83200CCC22E01C203C00CCD8000048 -:1022E00014496043401814494518281CF8F746FC67 -:1022F000A968002903D0221C082005F071FEB0BD9A -:10230000208CC82801D3042004E0652801D30220D2 -:1023100000E001202084201C03F0DCFA3C0008D9F6 -:1023200000002268E368011C8220FFF7B4FFB0BD03 -:10233000A0210820F3F7C3FCB0BDDC71010064EEFE -:10234000FFFF0348044A81685161C068906170478B -:102350000000F4680100C07101000349044A3C0018 -:1023600044D90000086B90608868D0607047000016 -:10237000905C0100C071010000B5FFF7F1FFFFF7AD -:10238000E3FF00BDB0B50D1C002814D00B490C4C68 -:1023900088686269C968801AA269891A401804D0DD -:1023A0003C0080D9000064235943F2F7C4FE206149 -:1023B000FFF7CDFF206928600120B0BD0020B0BD2F -:1023C0000000F4680100C0710100B0B50D1C0028C8 -:1023D00017D00C490D4C086BA2688968801AE26816 -:1023E000891A3C00BCD90000401807D022889042CE -:1023F00004D964235943F2F7A1FE6060FFF7B6FFEA -:10240000606828600120B0BD0020B0BD905C010074 -:10241000C07101007CB51068002802D000F024F8DB -:102420007CBD0F483C00F8D90000C0698468E068B2 -:10243000256AA669F3F7E3FDE169F3F706FD201CC1 -:10244000E2694030C18B12898918C1830749019420 -:1024500000912869331C82880168E068C068F8F739 -:102460001EFCE0E700003C0034DA0000846A010052 -:10247000915E0000F0B58569066A041CC06885B0ED -:10248000C068002801D1F3F757FC0A49029504946B -:102490000391306982880168262001920091435D92 -:1024A000E068E1692A1C0E323C0070DA0000C06866 -:1024B000F8F737FD05B0F0BD0000E9D9000010B510 -:1024C000141C0548FCF77BFBA068F3F79EFDE16850 -:1024D000C160201CF5F7BBFA10BDA06A01007CB5F5 -:1024E000041C6030027BA16900913C00ACDA000062 -:1024F0000192221C211C3831A06848320D1C6369EE -:1025000003F07AFB08210020F3F788FDE0602669DC -:10251000B16B002901D0102300E018230549019474 -:1025200000913168CA180823011C281C3C00E8DA15 -:102530000000F8F720FD7CBD000081DA0000F0B556 -:102540004668171C041C0121301C9BB0FAF70DFCD7 -:102550000025002803D013490A7A012A01D1012558 -:102560001CE088624E612089C861608900283C00B7 -:1025700024DB000003D000200884488404E0E068E5 -:102580000884208A4884608A8884086B002803D1E4 -:1025900001A803F077FC04E001200861002002F0AC -:1025A00039FB3D711BB00120F0BD0000F46E01004D -:1025B0003C0060DB000010B5041CF7F7E8FB0028C6 -:1025C00011D14B20005D01280DD1201C04F085FAAB -:1025D0000021201C04F0F3F8A0690021C207D20FEB -:1025E0000420F4F7D8F910BD000038B5041C04F03D -:1025F00036F93C009CDB0000002803D04030807A94 -:10260000002825D10C2029210855211C0622A018BC -:10261000F2F7A0FC201C06220E49F2F79BFC0120D9 -:10262000E06160620720302108550025E56306203F -:1026300000AB18803C00D8DB0000E068002801D027 -:10264000F3F7DBFC02216846FDF773FBE060201C1A -:10265000FFF769FCE560201C38BD12610100FEB582 -:10266000051C0E1C152000AB98801421171C00209F -:10267000F3F7E3FC02903C0014DC0000046806223F -:10268000311C601D2571F2F76BFC0622391C201CE1 -:102690000B30F2F765FC01A8FFF752FCFEBD00000D -:1026A00080B50023FBF75CF880BD000070B5051C09 -:1026B00008350F4E291C041C3C0050DC000006228B -:1026C000301CF2F750FCA088B082281C05F0A1FF56 -:1026D00000280BD0E0883061281C04F0CCF8A188D9 -:1026E000403041800020F4F7B8F902E00420F4F70C -:1026F000A0F9002070BD707C01003C008CDC000063 -:1027000080B50020FBF7F8FB80BD000070B5041C0D -:102710000430051CFDF732F8002809D00020F7F737 -:1027200037FC002804D00622011C281CF2F71EFCEE -:102730000A4E0622291C301CF2F718FC3C00C8DCAB -:1027400000006089F082281C05F069FF002803D092 -:102750000220F4F788F902E00520F9F7F4FA0020E6 -:1027600070BD707C010010B5041C007904281CD2D7 -:102770006079012801D0032804D1002201213C0006 -:1027800004DD0000A01DF9F769FC6079002804D180 -:1027900022790021F9F762FC0AE0032808D100241D -:1027A000221C00210020F9F759FC0134042CF7DB2E -:1027B000012010BDF0B597B0171C051C0430041C97 -:1027C0003C0040DD000015AA16A905F0E2FE002835 -:1027D0002ED015984B21095C002923D0012902D065 -:1027E00002291FD101E004F090F9AD7A1348169E3A -:1027F00005800622211C0830F2F7C1FB221C311C87 -:1028000002A83C007CDD000000F074FB0A200AA94D -:10281000487200AB9D80022101A8FDF79FFA059048 -:1028200002A8FFF795FBF3F7F7F90021159803F0DD -:10283000E1FF002000E00120387117B00120F0BD59 -:10284000987C01003C00B8DD000080B50120FBF75A -:1028500062FB80BD0000B0B5041C807D151C0A1C05 -:10286000C007C0170130211CF9F7FBFC002803D179 -:10287000042028710120B0BD206AF7F776FE606A57 -:10288000F7F77BFE206A3C00F4DD0000FEF788FAD3 -:102890000020B0BD10B5141CC27981798088F7F78B -:1028A000A1FA2071012010BD80B50123FAF770FF55 -:1028B00080BD0000F0B5041C081C00210F2891B059 -:1028C00000D30221002941D13C0030DE0000C000CD -:1028D000244F1090C619B288216802A8F2F75BFB5A -:1028E0002189B088091A002907DD09042268090C2A -:1028F0001018F3F7C0FB051C00E00025B07980211B -:10290000884317497831095C00203C006CDE0000E8 -:10291000F3F7B4FB071C00681349019010980B589B -:10292000019A291C02A8F2F7ACFA0090281CF3F7D0 -:1029300073FB201CF3F782FB0098002808D0029854 -:1029400001990860B079391CFAF720FF3C00A8DE35 -:10295000000011B0F0BD381CF3F761FBF9E72D2042 -:10296000F3F7F5F9201CF3F76CFBF2E700002444C1 -:10297000010070B5051C2035061CA879042848D232 -:10298000E979012913D1301C283003F092FF3C0073 -:10299000E4DE000000283FD0011C8C310165A979DC -:1029A0004C22041C11548118416250340462E11E0F -:1029B00081620BE000292FD13C2218494243541870 -:1029C000174A04341268002A00D14870002C23D022 -:1029D0003C0020DF0000351C3035E879012801D0AB -:1029E000052801D10620E8712022311D2068F2F768 -:1029F000DEFAB08CA080E879A071A8790025A063E8 -:102A0000012060810020E0602E36E80000191830B7 -:102A100008223C005CDF0000311CF2F7CBFA0135E4 -:102A2000042DF5D3012070BD68610100DC62010056 -:102A300010B5041CC07A012801D0032807D1201D3D -:102A400003F040FF002802D0A17A40304173E07AC1 -:102A5000002801D03C0098DF0000032802D1A07AB2 -:102A600002490870012010BD00006861010070B5C6 -:102A70000E1C0321041C301CFCF7E1FB002801D0D4 -:102A8000857800E000250B48321C00680368207C34 -:102A90008007C00F211C3C00D4DF0000F7F762FE66 -:102AA000002805D00121281CFDF7FEFB002000E0D6 -:102AB000082003F0C5FF002070BD0000E4650100A0 -:102AC00080B5426800880121490608432D2105F0A0 -:102AD000D3FB80BD034901203C0010E00000497891 -:102AE000022900D0002070470000846601008CB5E8 -:102AF00001281FD100290DD001290BD0022901D0B6 -:102B0000032916D10020F9F714FC932000AB18809C -:102B1000002008E0012900D000203C004CE000002B -:102B2000F9F70AFC832000AB1880022000F0CCF8F3 -:102B300001906846FFF73AFA8CBD01210E20F3F7A9 -:102B40001BF9F9E7FFB5171C1E1C1421002083B0E8 -:102B5000F3F7ACFA051C0468122000AB3C0088E0D7 -:102B6000000098800622601D0399F2F732FA0020D7 -:102B7000207127730499201CE172311C06220D304C -:102B8000F2F727FA029501A8FFF713FA07B0F0BD94 -:102B90000000F8B5061C0F1C0C210020F3F73C00C8 -:102BA000C4E0000089FA0568041C281D0622311CB7 -:102BB000F2F712FA6F81201CF8BD0000B0B5041CBA -:102BC0000D1C08210020F3F777FA01688C718D80C5 -:102BD000B0BD0000F7B50E1C1021171C0020F3F744 -:102BE0003C0000E100006BFA0468051C201D062271 -:102BF0000099F2F7F4F96681A781281CFEBDF3B5B0 -:102C00000C1C0821002085B0F3F759FA061C076850 -:102C1000E068002802D00599012904D1059838718F -:102C200000203C003CE10000787156E0036801217F -:102C3000039320690290FCF717FB051C02983221D0 -:102C4000FCF712FB0022D243011C281C04ABF7F74F -:102C5000B9F8002804D1301CF3F702FA00263CE052 -:102C6000002D05D03C0078E100006878093807287D -:102C700001D8322028701C210020F3F726FA019099 -:102C80000568011C301CF3F740F9E068F3F70BFA14 -:102C9000A861E1680198F3F738F90020E060059831 -:102CA0008021084338713C00B4E100000120211C60 -:102CB00014317871281C0622F2F79AF9029A292019 -:102CC0000092005D0121E26A082800D00021281C42 -:102CD000039B02F09DFFA06B2861206C68617F3030 -:102CE00001D10F206861301C3C00F0E1000007B00A -:102CF000F0BD10B5041C08210020F3F7ECF90168C1 -:102D00000C7110BD00000148006870470000286188 -:102D100001000149086070470000E4650100021CE1 -:102D200001200006084380B52D213C002CE2000064 -:102D300005F0C0FA80BD000080B5012807D0F12859 -:102D400025D0F32827D1022002F0BCF980BD00294C -:102D50001AD0012903D0F229F8D188211CE01048AB -:102D60000178002905D140780128EFD13C0068E2C4 -:102D7000000000F016FA80BD0B4814300089FCF703 -:102D80005AFC011C01220F2005F09FF980BD04F0C0 -:102D900052FA80BD0020FAF732FE80BD02210F20DA -:102DA000F3F705F880BD84660100014800783C0017 -:102DB000A4E2000070470000746601000149002091 -:102DC00048607047EC650100F8B50E1C134D011CFE -:102DD000141C6822281C1F1C0C30F2F771F90F49D3 -:102DE0000020AC394860012129601921192C6E6737 -:102DF0003C00E0E2000000D3211C2981094914397C -:102E000088738F74C878012808D001210F2005F03D -:102E10009CF91920FCF715FCFBF799F80120F8BD87 -:102E200000009866010080B5012802D100F02FF85B -:102E300080BD3C001CE3000001211D20F2F7C0FF13 -:102E400080BD00007047000001200749000580B5E3 -:102E5000886000228021162005F04CF904F034FD32 -:102E60000249086180BD000000100700246D0100C8 -:102E7000064A80B53C0058E30000D16A814207D180 -:102E8000107F2423044958434018C068F2F735F8EE -:102E900080BDD4790100944601001D481CB500781E -:102EA00000282DD01C480068002829D01A4A1A4B47 -:102EB000043211681C693C0094E30000A14222D155 -:102EC00051685B6999421FD1164949689368C91ACC -:102ED000814219D2D06814490130D0600968884213 -:102EE0000CD90622FF216846F2F72EF9F3F7ACFC65 -:102EF000011C0023002268463C00D0E3000002F0E1 -:102F0000CEF901221D200A4905F0F7F81CBDF7F79C -:102F100088F904228118081CFCF727FBF6E71C75CA -:102F200001004475010028610100905C0100F05926 -:102F30000100A086010080B501683C000CE400009F -:102F4000002915D10079022812D1081CF7F780F862 -:102F500000280DD003F0F2FC0830418F002907D182 -:102F60008069002804D08079062801D1FCF718FB7D -:102F700080BD000001490020886270473C0048E4A1 -:102F8000000078690100B0B5054D041CA91DFFF7CC -:102F900014F80622291CA018F2F74BF8B0BD707C7B -:102FA0000100B0B5041C151CFFF707F80622291C08 -:102FB000A018F2F73EF8B0BD000080B50A303C0022 -:102FC00084E40000F7F7BCF90123002803D005488A -:102FD0000078012804D100220021002003F0C6FD62 -:102FE00080BD0000A079010080B5002300220021EF -:102FF000002003F0BBFD80BDB0B5054DAC790A1CC7 -:103000003C00C0E40000011C0123012003F0B1FDDD -:10301000AC71B0BD000020100700F8B5061C0C1CF8 -:10302000880702D5F6F747FA10E060070ED5174F6C -:10303000A320C05D154D102800D3154D04F059FC98 -:10304000B96F3C00FCE40000401A291A0120F6F791 -:10305000C1FAE0071149C00F48600CD00D4C443C48 -:10306000207803280FD1002E06D0F6F7F9F9011CBD -:103070000120F6F7AFFAF8BD09490120F6F7AAFAE0 -:10308000012020703C0038E50000F7E70121301CEA -:10309000F6F789FAF2E7A60E0000A46C0100C40955 -:1030A0000000B057010040420F0080B5062804DB45 -:1030B0000521FF20F2F79FFE80BD034AC00011509A -:1030C0000121801801713C0074E5000080BD000002 -:1030D0009C5A01000148806870470000D0600100E0 -:1030E000B0B5084C251D281C216800F0F1FE002811 -:1030F00003D101210448F2F7CFFA281C216800F01F -:10310000FBFEB0BDC06001003C00B0E500002C102B -:103110000700B0B5104D0C1CA868002802D104F0BF -:10312000F4FB2860201C04F038FB0121032003F08D -:10313000C4FE04F0F0FBA86800280BD104F0E5FB06 -:103140002968001B401A696840183C00ECE5000043 -:103150004108401828600120A860B0BDD06001007F -:10316000F8B51F4E0024B068002802D104F0D0FB4F -:10317000706005F061F804F08FFB051CF9F766FE3E -:103180003168184A41181268E80B002A3C0028E60A -:10319000000000D1A80A401885421FD9144F2D1AEB -:1031A000381C2030817900AB1970C079587005F057 -:1031B0006EF8002803D102218F20F2F728FE291C87 -:1031C0000C48F268F8F709FC002804D0011C3C0008 -:1031D00064E60000281CFFF7A5FF012400AB188857 -:1031E000F88405F047F8201CF8BD0000D06001000D -:1031F000F474010000100700891301000149012047 -:10320000C8607047D0600100064880B5006801289A -:103210003C00A0E6000007D10448AC38016903482F -:1032200000F079FEF3F72BFA80BD98660100346355 -:10323000010080B542788168007903F0DEFF002844 -:1032400001D1F5F7B6F980BD00001FB504F069FBA8 -:10325000F6F73C00DCE6000091FF164C022803D193 -:10326000FFF7DCFD042802D3002020701FBDFBF710 -:10327000F7FC0028FAD1606A0028F7D02078800790 -:10328000F4D40921162004F093FF012020700B4C88 -:10329000094902903C0018E700000194009104F0F5 -:1032A00046FB001903906846FDF7B5FB0022162186 -:1032B000842005F03EF8DCE70000606C010061ED61 -:1032C000000040420F00234870B580789CB0012870 -:1032D0003ED1204C09A83C0054E70000803C611C12 -:1032E000FEF792FE042011AD6872A06F19A9189024 -:1032F0007C20005D012608711D20005D002806D09D -:1033000010961296FCF7F6FA2872207A1190F3F7CD -:10331000CDFF6A21085340343C0090E700000022B2 -:1033200001A906A8F6F7CDFF211C0020FBF7CBFB77 -:1033300006A9FBF7C8FB01A9FBF7C5FB0A49096809 -:10334000002907D0331C0A226946FBF7DAFB009AF2 -:10335000072191700C9009A8FEF73C00CCE7000013 -:103360007BFE1CB070BD000084660100E4620100B9 -:10337000F8B5041CC068FF22016812020E1C087B0D -:10338000497B090211400843051C311C0622A01884 -:10339000F1F77CFE0622B118201CF1F73C0008E88A -:1033A000000077FE280A290208430004032149028D -:1033B000000C884208D2E06801890E390181E0687A -:1033C00001680E310160F8BD0026201C103003F0AA -:1033D000E8FA218B002905D1E17D00290BD03C00C2 -:1033E00044E800008069800708D4E068012601896C -:1033F00002390181E0680168023106E0E068018974 -:1034000006390181E0680168063101601449002035 -:103410000B1F42009A5AAA4202D11149063102E01A -:103420003C0080E8000001300228F5D3E068062265 -:103430000068F1F734FE012ECBD1812000AB18805B -:10344000E17D208B49030843310308430004000C4D -:10345000010A000208435880E06819880068C180AA -:1034600059883C00BCE800000181B5E76A460100CC -:10347000B0B50D1C01890622083101810468044998 -:10348000083C0460201CF1F70DFEE580B0BD000093 -:103490006A460100F8B5002901D0002801D10020BA -:1034A000F8BD09043C00F8E80000090CF2F743FFFE -:1034B000061C051C002720E02C892968022C01D25B -:1034C000022001E048780230844202DD241A091803 -:1034D000F4E7844210D0011B0A040104090C120C09 -:1034E000281CF2F79EFE3C0034E90000002806D1BB -:1034F000E868F2F72DFEEF602889001B2881ED684F -:10350000002DDCD1301CD1E7F8B58568041C80693A -:103510002E1C00280DD07168F2F7F6FDA069F2F7B5 -:1035200017FE06E00021C1603C0070E90000F16078 -:10353000A08D36680138A085F0680028F5D1306884 -:10354000A060A08D01380004000CA08502D0201CD2 -:10355000F9F739F82A4F2A480068002803D00621D5 -:103560006868FAF77CFD686800683C00ACE9000018 -:10357000817800292BD1C178002930D1218E0139E1 -:103580002186FBF715F8A16A081AA062E169884252 -:1035900003D904210220F2F767FCB86800281ED086 -:1035A0001A49208E49680C22521A90423C00E8E9E0 -:1035B000000008D319239B01AF2292015943A06A4E -:1035C000511A88420ED200210C2003F0ACFC0020DE -:1035D000B86007E0012905D1C078172802D1A08E74 -:1035E0000138A0862A1D06CAE0686369F1F73C002D -:1035F00024EA0000DCFCB54201D02D68B4E7A08DC0 -:10360000002803D10548B96900F09EFCF8BD000010 -:10361000FC5A0100CC5C010018570100C460010095 -:103620008907074BCA0F80B5197C002906D0814352 -:103630003C0060EA0000197403D10721152004F052 -:10364000A2FE80BD00007869010080B5011C012048 -:10365000FFF7E9FF80BD80B5011C0220FFF7E3FF03 -:1036600080BDB0B51B4C6068FCF72FFF20680025BB -:1036700040683C009CEA0000002803D0FDF718FCDD -:10368000206845606068FCF7C5FE1448616800F07A -:1036900061FCA07A012805D0022803D020680068C8 -:1036A00000F0DEF801211F2004F0B2FD00211F20F0 -:1036B00004F0AEFD3C00D8EA000002211F2004F017 -:1036C000AAFDA57221682C20405C8968F1F776FC80 -:1036D0006068FCF7E4FE20680562B0BD0000147A63 -:1036E00001003463010004490A68C868926A002A2C -:1036F00001D0096908183C0014EB00007047000075 -:10370000147A0100B0B5134C051CA07A01380228C8 -:1037100019D801211F2004F081FD2068FC23011C21 -:103720002030027B1A400273002D0FD001231A4370 -:103730000273A07A032807D13C0050EB000001205F -:1037400001F0E7FD002801D1FFF797FFB0BD4B6204 -:10375000B0BD022111430173F6E7147A010010B5E0 -:10376000041C0A30F6F743FE00280CD022880A49D0 -:103770000B7A9004C00F002B06D13C008CEB0000AC -:103780001206920E202A00D10120C86010BD002828 -:10379000FCD100222421802004F004FE10BD000092 -:1037A000047A010080B5021C1F21802004F0FAFD7C -:1037B00080BD0000F8B51D4E041C30683C00C8EB0D -:1037C00000001D1C4768201CF1F70AFCFBF787FA74 -:1037D000002804D0281CF2F72AFB002828D12088D2 -:1037E000400525D430680068FEF759F9002803D158 -:1037F000FDF789FAF1F7EDFB3068002540683C00E1 -:1038000004EC0000002803D0FDF764FB306845603D -:1038100020880009000703D104F0C8F86188451822 -:1038200030684561816A0131816220888004C10F5E -:103830000248F8F7CDFFF8BD147A0100B1EB0000A3 -:103840003C0040EC0000B0B50E4C051C6068FCF775 -:10385000F6FD0C48616800F092FB0021242004F082 -:10386000ECFC0022D2438021242004F0B8FC00208C -:10387000E0602072206801682806000EF1F7B0FBB6 -:10388000B0BD3C007CEC0000047A01003463010010 -:1038900010B5041CC068F2F785FC201CF2F7B0FDDF -:1038A00010BD000070B51C4E051CB07A2C1C4034B5 -:1038B000022826D1A08B3189884222D13068416A02 -:1038C000002908D03C00B8EC00002030007BC00785 -:1038D00004D5012001F02FFD002818D160780028C0 -:1038E00009D1306802232030027B0D495208520072 -:1038F0001A43027301E0FF21F53101221F2004F079 -:103900006EFC0320B0723C00F4EC000002E0281CC6 -:10391000FFF7C4FF6078002803D1291C012003F0C1 -:1039200029FB70BD147A010050C30000B0B5041C1F -:103930006034E0790E4D00280AD10220A872286870 -:103940004068002804D10B483C0030ED0000FDF732 -:10395000D0FA2968486004F038F82968C861FFF790 -:10396000E0FE29680969081A03F06FFF002801D0FA -:10397000E079A071B0BD147A0100C1EB0000F8B588 -:10398000041C002604F021F8051C3C006CED00002E -:10399000224800270770A10704D0E107C90F016280 -:1039A000C5610126416B002934D1002E32D0061C9E -:1039B000F9F744FF316B1A4B411AA20712D5DA68A6 -:1039C000002A08DD91421A6802DA14093C00A8EDC9 -:1039D0000000A21806E01409121B03E00A4302D1FA -:1039E0001A6852001A60B7630AE0B26B0132B26320 -:1039F000022A1A6801DD940800E01409121B1A60FB -:103A0000D9603063F56218680849884201D93C00E2 -:103A1000E4ED0000196003E0642801D2642018601E -:103A2000F5F7FCFDF8BD0000606C0100B057010027 -:103A300020A10700FEB5041C0020504D0021686144 -:103A40002069FBF7B3FC071C20690321FBF7AEFCE0 -:103A50003C0020EE0000002803D0807829788842BE -:103A600063D1474D201C1430391C061C2A7802F003 -:103A70005AFA002859D1E068056841480195583044 -:103A80000290FBF76AFF3E4D193500280BD0281C29 -:103A9000FBF73C005CEE000055FF00281ED1311CF6 -:103AA000281CFBF765FF002842D017E0281CFBF715 -:103AB00049FF002806D0391C0298FBF763FF002855 -:103AC00036D00BE0391C0298FBF75CFF00282FD0A2 -:103AD000311C281C3C0098EE0000FBF74CFF00282E -:103AE00029D0301CF6F7ADFC294A1832117C002988 -:103AF00004D0516A002901D000281CD1906A002806 -:103B00003BD01378019D01216D8901202B409B073B -:103B100011D0A36B1E4E3C00D4EE00001D1C7F355F -:103B20009836002D14D0558A002D08D15569AB4226 -:103B30000FDA0020174D01236B610AE029E0F578C8 -:103B4000022D06D1144F55693F68ED19AB4200DADA -:103B50000020236C1D1C7F353C0010EF000010D0AE -:103B6000558A002D03D19569AB420AD208E0F57859 -:103B7000022D06D10B4E95693668AD19AB4200D2C5 -:103B80000021084308D0106A002801D0F1F74BFA51 -:103B90000021201C01F0B9F9FEBD3C004CEF0000F3 -:103BA000EC650100C4670100CC6701003EB5056A01 -:103BB000041CC068F2F734FBE169F2F757FA201CE5 -:103BC0004030C18B0431C1832B6910499879062894 -:103BD0000AD1988801910294009060693C0088EFB6 -:103BE00000001B680168E0680322C0680AE0022840 -:103BF0000BD11020009001910294E068A369C06885 -:103C000000220021F7F70FFB3EBDF2F7A6F9FBE714 -:103C10000000BDEF000080B5D1685069C9683C0064 -:103C2000C4EF0000C160D168C860111C4031CB8B6B -:103C300000891818C8831068002802D0FFF7BCFF5D -:103C400080BD0348FBF7CCF8006AFEF7F5F980BDAC -:103C5000A06A0100F8B5061C0A2430070109A00774 -:103C60003C0000F0000001430F1C0A4D2F6004F0DF -:103C7000FAFEAD682801000FB04205D0013CF4D235 -:103C800001219B20F2F741F92802000A082E01D1F8 -:103C900031050843F8BD600007000122D20580B558 -:103CA00000213C003CF00000042004F0DDFC0F206B -:103CB000FFF7D6FF0F2109040840000C80BD00006B -:103CC00080B50548FDF74AF90448FDF77BF804483C -:103CD000FDF76CF880BD000089340100ED24000080 -:103CE000111C00003C0078F0000080B50248F3F79A -:103CF0002AFC80BD0000D124000080B5F2F753F902 -:103D000080BD80B50021002001F051FE032002F0AB -:103D100046FF80BD0000064880B5C169002906D174 -:103D2000016A002903D13C00B4F00000816B034814 -:103D300000F05EF980BD0000C46901003463010039 -:103D400010B5044C206AFCF7B3FB0348216A00F06D -:103D50004FF910BD1C75010034630100B0B50D4C66 -:103D6000207C002802D001213C00F0F00000FDF78B -:103D700086F900252570A068012803D10020A560E0 -:103D800001F08FF8A078012805D103489838006920 -:103D9000FCF7EFFBA570B0BD00008466010080B5A4 -:103DA0000021012001F009FE80BD3C002CF1000043 -:103DB00038B569460025F8F7B7FE041C01D101208B -:103DC00038BDA068002804D00099A131082004F073 -:103DD00073FA1C21201CF1F7A3F9281CF0E700005E -:103DE000FEB5071C4C233949584344183C0068F180 -:103DF0000000251C4035287A37494876211C30318F -:103E000002910C23C856421C0A73497B884246DA49 -:103E10003248007880073ED500200190F6F7AFFACF -:103E200000282ED0AC210958002901D0E4303C00F4 -:103E3000A4F1000000E0CC30061C4068002825D02A -:103E40000299087B012811D1201C2E302978F6F721 -:103E5000EDF9716803E07218127A824203D9FF31DA -:103E60000906090EF7D1A97001200190231C3E33E9 -:103E70003C00E0F100001A1D301C00970199F8F792 -:103E800058FA002811D0A8788019007A00E00020A4 -:103E9000687068780121FBF7E0FD6060381C01F074 -:103EA00014FE381C01F0A5FBFEBD0299087BFF3013 -:103EB00048733C001CF20000381CFCF719FC03F0AE -:103EC000C3FD061CFBF78EFE41007618687861681A -:103ED000FBF76AFE3118208D3B1C054A03F012FEE9 -:103EE000E5E7000058E30100308007001D75010080 -:103EF000D54E00003C0058F20000031C044880B579 -:103F000002792030034900F030F880BD0000AC7C1D -:103F10000100C4670100031C044880B5C278383032 -:103F2000034900F022F880BD0000AC7C0100C867A6 -:103F30000100031C04483C0094F2000080B5827923 -:103F40005030034900F014F880BD0000AC7C010043 -:103F5000CC670100031C044880B5427968300349EE -:103F600000F006F880BD0000AC7C0100D0670100C5 -:103F700010B5002484800B603C00D0F20000191CB6 -:103F8000514301601906091610220630F1F79FF916 -:103F900010BDB0B5064D0024AC60EC60EC612C6245 -:103FA00002F0F1FC00F00DF8EC622C70B0BD447D25 -:103FB000010080B580210148F1F73C000CF30000BE -:103FC000C7F880BD04660100F8B5074F002400263D -:103FD00018206043C519EE6003F042FD103501342E -:103FE000022C41C5F4DBF8BDB87D0100002303605D -:103FF000044B002900D1191C4160002A3C0048F301 -:10400000000000D11A1C82607047BD75000010B519 -:10401000074C206801302060202803D958215820FF -:10402000F1F79DFF216801200139884010BD605BD8 -:104030000100B0B50D1C041C2168002000293C00C3 -:1040400084F300000AD0A943216007D1A068F1F7EA -:1040500023F8002802D1216829432160B0BD000067 -:10406000B0B50D1C041C2168002029432160A94221 -:1040700007D16068F1F710F8002802D12168A94340 -:104080003C00C0F300002160B0BD1A4BB0B59A6A85 -:1040900000280BD0002A07DBB8242458013CA41ABE -:1040A0000019B030007B02E00E2000E00D205D6AB8 -:1040B000124C002D01D0207800E0205CFF24A834B1 -:1040C000C4403C00FCF300009C60F524C4409C61AB -:1040D000FD24C440DC61FF242934C4405C61FF241A -:1040E0005334C44000200C3311C3002905D0002AEA -:1040F00003DC0221504200F065FBB0BDAC7E010044 -:10410000B85201003C0038F4000010B5134C1348BD -:10411000211CFF3169310EC90EC0211CFF31242240 -:1041200075310F48F1F751F8211CFF313C229931CC -:104130000D48F1F7A6F8FCF7A2FF211CFF31102271 -:10414000D5310948F1F73C0074F4000041F8211C16 -:10415000FF312822E5310748F1F796F810BD00003D -:1041600040630100008007000C80070030800700DA -:1041700080800700A0800700F8B5002859D004F01F -:104180004BF9F8F7B3FB00223C00B0F4000001212A -:10419000132004F07CF92A492948496C0160002168 -:1041A0002948C9434160264C1434616C8160A16C7C -:1041B000C1600020254D022601016E500A194F19D9 -:1041C000503204370ECA013008283C00ECF40000DD -:1041D0000EC7F4DB1422211CCC311E48F1F75AF82B -:1041E0001D4881780909090181700021C170417061 -:1041F000211CE0310A78027049784170211CE831B5 -:1042000030220830F1F746F8211CFF313C0028F538 -:104210000000502219311248F1F73FF88320800046 -:10422000142221181048F1F738F811204001842297 -:1042300021180D48F1F731F8FFF773FF201CF1F753 -:1042400028FDF8BDFFF76DFFFBE7082007003C00E5 -:1042500064F500002C6301004020070000300700D7 -:104260000040070000500700006007001000070032 -:1042700000900700F8B5051C1848C068002825D034 -:10428000164E013674783078271A7919201CF1F708 -:104290003C00A0F500004BF80090291C201CF1F711 -:1042A000B2F8C119201CF1F742F8601A3070701E84 -:1042B000806800280DD05336F4780099201CF1F75F -:1042C000A2F8B178611A4118201CF1F79CF8601A25 -:1042D000B0703C00DCF5000003485C300169C26846 -:1042E00069435118C160F8BD447D0100B0B50C4D63 -:1042F000E868296940187D2109014418201C03F051 -:104300000BFB00280AD003F0CFFB011B2869F1F753 -:104310007DF801303C0018F600000004000CFFF7A7 -:10432000B2FFB0BD0000A07D010070B5104C606808 -:104330008025A84360602068284320600D4E301C13 -:104340001030F3F7C8FC002803D107218520F1F7CE -:104350002AFE084800213C0054F6000080684163B2 -:10436000C06C10307061012030612068A84320606B -:1043700070BD0000F400070000300700247E01003B -:10438000011C0020052980B509D202A35B5C5B00FB -:104390009F440000030303033C0090F60000030069 -:1043A000FFF7CFFC80BD0122920280B500210720DB -:1043B00004F0ABF980BD80B540220021002004F05C -:1043C000A4F903220021002004F09FF980BD70B5FC -:1043D0000E1C051C141C08280ED13C00CCF6000055 -:1043E00000F000FC0E2801D1142000E01020E103B1 -:1043F00000D50138C0060A49C00E887108E0092DB1 -:1044000006D1A00401D5002000E00120F3F7B0F9A7 -:104410003440211C321C281C04F07AF93C0008F7B7 -:10442000000070BD00000080070070B50024132953 -:1044300011D8002801D1084E0825012801D1074EC6 -:10444000092500F078FA002805D0021C311C281C30 -:10445000FFF7C3FF0124201C70BDF8FF07003C00DC -:1044600044F70000FFFF00000122D20280B50021C6 -:10447000072004F053F980BD0F22120407214904DC -:1044800080B5092004F04AF980BD000080B5002104 -:10449000042004F01BFC4021002004F017FC044918 -:1044A0003C0080F700000020886002480969203045 -:1044B000FFF709FE80BD64730100B0B560210020E4 -:1044C00004F007FC114D002400220420295D04F0B3 -:1044D00028F90C2003F09BFB01342406240E052C44 -:1044E000F2D33C00BCF700000F2200210A2004F0A8 -:1044F0001BF96121002004F0EFFB064901208860D0 -:10450000044809692030FFF7CDFDFF202D30B0BDF4 -:10451000A858010064730100F8B5061C1248C67063 -:104520000120FFF73C00F8F70000FDFB0127BF0268 -:10453000041CB843011C012004F0D1FB0320FFF749 -:10454000F2FB051CB843011C032004F0C8FB301C1F -:1045500000F09FF900F057F8211C012004F0BFFB88 -:10456000291C032004F03C0034F80000BBFB0020B1 -:10457000F8BD00006473010080B5002240210020D6 -:1045800004F0D8F880BD000070B5051C0124092096 -:10459000FFF7CCFB0F210904884303218904E204BF -:1045A000052D124E20D202A33C0070F800005B5D86 -:1045B0005B009F44000006090C100300032109045E -:1045C0000CE00121090409E00121490406E0F36837 -:1045D000042B05D902E0F368042B01D8014301E064 -:1045E0001043011C092004F080FB3C00ACF80000E3 -:1045F000201C70BD0024FBE7647301000121C90584 -:10460000002880B502D00A1C002100E0002204200E -:1046100004F096F880BD0000F0B591B0002640216E -:1046200001A8F0F7DDFD2A4FB87901223C00E8F837 -:104630000000520300900021062004F084F860215D -:10464000002004F058FB6121002004F054FB0820F6 -:1046500003F0EFFA00240F20FFF771FB4005050F70 -:10466000A80001A9095801AA013101340C2C3C0011 -:1046700024F900001150F1D30020810001AA515803 -:10468000B14201D90E1C051C01301028F5D30620BB -:10469000FFF758FB0F2149028843690208430121B3 -:1046A00049030143062004F029FB0D488468643463 -:1046B0003C0060F9000008E0201C03F05AF90028D3 -:1046C00003D001219520F1F798FC0F20FFF73DFB67 -:1046D0000004F1D5872003F0B2FA0098B87111B048 -:1046E000F0BD201007000001070010B5174C6169EC -:1046F00000293C009CF9000004D00A21132003F09B -:1047000047FE10BD011C1248012900780CD0112968 -:10471000F7D1052803D101211320F1F771FC20788E -:104720000728EED102210AE0052807D006280AD082 -:104730000728F7D03C00D8F900000828E4D1002071 -:1047400005E001211320F1F75EFC10BD012002F00D -:104750006CFD10BD00007C7801000D4980B5097822 -:10476000032901D100280BD0072901D1002807D047 -:10477000022901D100283C0014FA000003D10529C8 -:1047800009D1002807D00020FCF728FD00221321C2 -:10479000112003F0C1FE80BD7C78010080B50622A7 -:1047A0000821002003F0DEFF80BD0000074880B52F -:1047B0004069002801D1F1F73C0050FA000033FFB6 -:1047C0000549054A0868506148689061012080BD2C -:1047D000000064730100B058010010000700074892 -:1047E00080B54069002801D1F1F71DFF0549054A50 -:1047F000086890614868506101203C008CFA000014 -:1048000080BD000064730100B05801001000070073 -:1048100011B500AB597814480123C056002209187D -:104820000B061B161321132B02DD00AB597007E09A -:10483000002B02DA00AB5A7002E01C1C3C00C8FAE4 -:10484000000000AB5C7000AB1B7818180006001667 -:10485000132802DD00AB197006E0002802DA00AB75 -:104860001A7001E000AB1870009818BD0000647366 -:10487000010038B50C1C154900AB496813253C00F4 -:1048800004FB00000091597809185970197808182C -:10489000187019881048022CC18001D0002C0BD14F -:1048A00000AB1878132800D91D7000AB19780020D0 -:1048B000FFF7EEFD022C01D0012C09D100AB587896 -:1048C0003C0040FB0000132800D95D7000AB597814 -:1048D0000120FFF7E0FD38BD000064730100A0581F -:1048E000010070470000B0B5041C0E28134D04D021 -:1048F0001249A00000194D3945180620FFF73DFA6E -:104900000F493C007CFB0000E02209191039C97BEB -:104910009043490111400143062004F00DFA291C7F -:104920000520094A03F030FF08481F2200191038FB -:10493000C07BC104D204082003F026FFB0BD0000F4 -:10494000B40900003C00B8FB000014450100FF0F53 -:104950000000C05801007047000080B506490028DB -:1049600001D1086880BD012801D1486880BDF1F7F8 -:1049700090FB002080BD7C730100014840687047B7 -:104980000000A05801003C00F4FB00000448012393 -:104990000449C056C95640180004000C7047000076 -:1049A000A0580100A258010001484068704700006B -:1049B00064730100F8B5051C0E1C00F055F9041CC9 -:1049C00000F058F900282CD03C0030FC0000B30067 -:1049D000601E002D1C4E19491A4A06D10B250E2CBB -:1049E00000D1194AD258085608E0012D1CD19A1856 -:1049F0000436081808250E23126DC056071C4743BD -:104A0000FB00DF19124B3F2158433C006CFC0000B7 -:104A1000114BA9400C1C3818C0181440EC40C011B0 -:104A200060431B0AC018801203D1012004E000205B -:104A3000F8BD3F2800DD3F203060A84008408A4391 -:104A40001043F5E7CC590100DC5801003C00A8FCFC -:104A500000007C7301007C5901000606000026005E -:104A60000200034808B5C08800AB1880009808BD54 -:104A70000000A0580100B0B50B4D094C0E206C6031 -:104A8000FFF78DF90949021CC8600106090E3C00B8 -:104A9000E4FC0000133A022A02D91738042800D88F -:104AA0000021081C6C60B0BD041802006000070003 -:104AB000647301000A4898B502781321142A00D3C0 -:104AC00001704278142A00D34170064C6068FFF7E9 -:104AD0003C0020FD0000BDFE009000AB1888E08087 -:104AE00000F075FF98BDA4580100A05801000348CC -:104AF00080B541780120FFF7E6FC80BD0000A65894 -:104B00000100034880B501780020FFF7DCFC80BD80 -:104B100000003C005CFD0000A6580100B0B5054D4A -:104B20000024201CFFF744F90134102C01C5F8D3F0 -:104B3000B0BD0000D4440100044980B58870044928 -:104B400080000958072004F00FF980BD647301004C -:104B5000D05801003C0098FD0000B0B53F24021C75 -:104B6000002A01D108200B23012A01D109200823A2 -:104B7000251C9D40002900D101213F2900D9211C7D -:104B800099400A1C291CFFF77CFCB0BD000091B5C0 -:104B9000124900AB1A783C00D4FD00000878114C93 -:104BA00080180006000E207049785A788918090686 -:104BB000090E13221328617000D92270132900D91D -:104BC0006270084908480639C98881802178002028 -:104BD000FFF782FC617801203C0010FE0000FFF727 -:104BE0007EFC98BD0000A4580100A6580100647323 -:104BF000010070B51D4D041C28780E1C032803D13C -:104C000002211120F1F735FA201C00F04EF800289F -:104C100025D0287801280AD168683C004CFE0000A5 -:104C2000002807D00121112003F0EEFB0120696864 -:104C3000F0F7BDFA6C706E60201CFFF7C1FC041C1D -:104C400000F0D4FE002C02D06868002802D1F6F7EC -:104C5000D9F870BD012028700122211C3C0088FE7B -:104C60000000112003F09FFB70BD02211120F1F71D -:104C700006FA70BD00009C73010080B5012805D1C3 -:104C8000002904D0012901D1F6F7BFF880BD0549FC -:104C90000878032802D00020087080BD03213C0062 -:104CA000C4FE00001120F1F7EDF980BD9C730100F6 -:104CB00001484078704700009C730100011C0139D5 -:104CC00001200E2900D300207047000010B5134CBE -:104CD000207801280ED1606800280DD00121112014 -:104CE0003C0000FF000003F098FB01206168F0F732 -:104CF00067FA00206060207001E003280ED00021D8 -:104D0000112003F08AFBFFF724FCFFF7C0FB0549E5 -:104D1000087B40084000087303202070012010BD6C -:104D200000003C003CFF00009C730100880007006D -:104D300010B50D4C2078032813D1002020700B48AB -:104D4000017B012211430173FFF770FCFFF718FC90 -:104D5000002806D002212170011C0022112003F03E -:104D60002BFB01203C0078FF000010BD00009C736D -:104D700001008800070080B50549002804D0002004 -:104D8000086003F05AFA80BD0120086080BD805A97 -:104D90000100FEB5051C8035041CA8682979066849 -:104DA000201CA03002293C00B4FF00001CD169790E -:104DB000082901D00C2917D101216162A96809686D -:104DC000098B0182A9690191008AC00605D5606836 -:104DD0000088400501D4012000E000200290052059 -:104DE00001A902F0B7F902E03C00F0FF0000002149 -:104DF00061620182A9681A230A89676A181C002F58 -:104E000000D11820101A0881A8680168626A002A77 -:104E100000D11823C9180160A86841C43088083C33 -:104E2000400403D5201CF7F7BCF93C002C0001001E -:104E3000FEBD0021E1613079C00703D4201CF7F7E3 -:104E400091FEF5E7201CF7F743FFF1E7F7B5051CE6 -:104E50000A30061CF5F7A4FA144F041C3988F2F73F -:104E600083FE328878680280728802303C006800D5 -:104E700001000280B18841806988029A201CFAF7FB -:104E8000CEFE0B4D08356880FBF72BFE0121090390 -:104E90000028288801D0884300E00843288004487F -:104EA000002200211430F2F732FE201CFCF73C00F7 -:104EB000A400010085FAFEBD247B010010B5134C4F -:104EC0001149201CFF3069300EC90EC0201CFF3074 -:104ED000242275300E49F0F717FA201CFF303C22CF -:104EE00099300C49F0F76CFA201CFF301022D530B5 -:104EF0003C00E00001000949F0F709FA201CFF30EE -:104F00002822E5300749F0F75EFA10BD0000008066 -:104F10000700406301000C8007003080070080809C -:104F20000700A0800700B0B500283FD021484168A5 -:104F3000214C3C001C0101006160C168E160016915 -:104F40002161806AA0621E491C48096814384164C6 -:104F50001C48251C3C350FC80FC5201C80224C3036 -:104F60001949F0F733FA1422201CCC301749F0F716 -:104F70002DFA38223C0058010100201CE030154970 -:104F8000F0F727FA201CFF30502219301349F0F7B0 -:104F900020FA83208000142220181049F0F719FA13 -:104FA00011204001842220180E49F0F712FAFFF771 -:104FB0008EFFF8F794FB3C0094010100B0BDFFF7B1 -:104FC00089FFB0BD00100700406301000820070002 -:104FD0004020070000300700004007000050070095 -:104FE0000060070010000700009007000C4980B522 -:104FF000012048600A4814383C00D00101000078C4 -:10500000012804D008489438406F002803D00020BD -:1050100000F01FF880BD08680028FBD00348F2F7B5 -:105020007AFE80BD000098660100FFFF000080B599 -:10503000002809D1F2210F2003F03C000C020100EE -:1050400013FA00220F21F12003F0CCFA80BD0120D9 -:10505000F8F76AFE80BD000010B5041C032000F0C4 -:10506000C9F900210F2003F0FFF9FFF765F80B499C -:1050700000204874FBF7E6FA094800683C00480243 -:105080000100002803DC02214042FFF752FC0448E3 -:1050900014300068002802D0201CF2F742FE10BD38 -:1050A000000084660100D47E0100064980B50978BD -:1050B000042905D0052903D0062901D007293C0081 -:1050C0008402010001D1FEF7BDFD80BD74660100C0 -:1050D00010B5094CE06800280BD107482C38008A2D -:1050E000C00704D5002101206268F9F7C9FA012040 -:1050F000E060012010BD0000F46E01008CB5021CC0 -:105100003C00C0020100081C111CFDF728FF0190A3 -:10511000002805D0172000AB18806846FDF7FFF87F -:105120008CBDF1B52E4CAEB0002525632069012859 -:1051300003D101A801F0A1F84EE00126284F267006 -:10514000503F3C00FC020100B869F8F74FF82549D0 -:105150002C3900281DD0E06A01281AD1088A0F1CBA -:10516000800704D5002102206268F9F78FFA388A97 -:10517000000707D5E068012804D1002108206268F3 -:10518000F9F784FA3C00380301000022182182203C -:10519000266303F036FA25E0088A0E1C800704D542 -:1051A000002102206268F9F774FA308A000707D5F7 -:1051B000E068012804D1002108206268F9F769FA43 -:1051C000308A400704D53C0074030100002200210E -:1051D0000420F9F761FA2E98012804D01E950921C0 -:1051E0001BA8FFF797FFE562BD61E5602FB0F0BD3A -:1051F000F46E010080B50720FEF7A0FE00210F200D -:1052000003F044F90C4801783C00B0030100002988 -:105210000FD00221017088380078002804D0074997 -:105220001031487C01304874F2220F20054903F008 -:10523000FCF800220F21F32003F0E9F980BD746629 -:10524000010080841E0010B5041C3C00EC0301002A -:10525000F2210F2003F020F9012C0AD10848084957 -:1052600000681439002805D0C878022802D1F7F761 -:10527000AFFA10BD002048700520FEF765FE10BD96 -:1052800098660100F8B5284E3021351C3C002804F2 -:10529000010060352889895D884203D10020FFF72D -:1052A000F6FEF8BD341C70340121217041188019BC -:1052B0003030298140781D4F183F3870002808D0C1 -:1052C0000021FBF7C2F9002807D12078FFF73C0046 -:1052D000640401009BFFE7E701210F20F0F71AFFAC -:1052E00014480121803081703869FBF755FA20732A -:1052F00000210F2003F0D6F8707A01280ED10E4855 -:105300000068002804D0387802F0DAFA002805D0C6 -:105310003C00A0040100307F60730320207071897D -:1053200005E005202070A888FAF73BFB011C00224D -:105330000F2003F086F8BAE7000004660100E4627B -:10534000010070B5041C02F06CFC364B191CA03136 -:105350000A783C00DC040100102A02D20A79102AE3 -:1053600001D3012500E00025304ECA798036012C9A -:1053700012D00025022C2ED0042C3CD15C6B002CCA -:1053800039D19C6F001B2A4CA04234D9B268986A6C -:10539000824231D03C00180501004D7234E0B06803 -:1053A0009C6A0222A04221D1586B00281ED1002DF8 -:1053B0001CD1487A192820D03468986F6400001BEB -:1053C00074680019FF301C4C3930A04216D248795D -:1053D0008C79001930283C005405010011D31022AB -:1053E0000FE05C6B012C06D1B0689A6A904200D144 -:1053F0004D72002205E09C6F001B124CA04200D3AE -:10540000202206E04A7A192A01D201324A72202269 -:10541000B06030689B6F98423C009005010004D159 -:10542000002A00D148794A7106E0102A04D370603E -:10543000336048798871F6E7CA7170BD0000A46CCA -:105440000100A304000071020000350C00000548B3 -:1054500080B5817B002905D000213C00CC050100EE -:10546000817303490F2001F00FFF80BD74660100B6 -:10547000E9030100F8B5041C02F0E2FB051C384EFC -:10548000201C3749341CA0341022443901282CD068 -:1054900004284ED1371C743609CE26783C00080605 -:1054A0000100C01A202E04D1304EB04201D900268E -:1054B0004E613E1C3F6C002F48D1776C002F45D1C8 -:1054C000B76A002F3DD0776B002F3AD0274FB842F4 -:1054D00037D26078102806D3F06F181A244B3C009E -:1054E00044060100984201D2E270F5664869062838 -:1054F0002FD201302CE02078202801D106234B61E7 -:1055000002232371B36A002B19D04969032916D9E4 -:10551000716B736D594012D0E178102910D3617806 -:105520003C0080060100331C10290CD3D96F691A86 -:10553000134DA94207D2586C002802D0986C00285D -:1055400000D12271F8BD0228FCD12270FAE7486927 -:10555000002801D0013848610A49F06E401802F075 -:10556000B0FA3C00BC0601000028EED00120E0703B -:1055700006482818F066E8E7A46C0100E204000081 -:105580001A06000053070000002D3101005A620284 -:1055900080B541680979C90713D5C16900290DD0C3 -:1055A000897902293C00F80601000AD10821018608 -:1055B000011C38318162021C06480449F9F7FDFCE0 -:1055C00080BDF7F7DCFB80BDF7F723FB80BDB97129 -:1055D0000000A06A010010B50024002803D002F0EA -:1055E000E8FE002817D03C00340701000C4C0120D5 -:1055F000A0722068002141620A490268C9786032BD -:105600009171218901312181006840308183FBF74C -:1056100031FC20680068FCF7A1F90124201C10BDB2 -:10562000147A01000E6101003C00700701007FB593 -:10563000061C1E481D1C438802881C21002090B0B7 -:10564000F0F745FF03900468FF2101312180082015 -:1056500060800620207104206071C001002D00D1FF -:10566000081CE08001A80230311C3C00AC0701009E -:10567000051CFAF75FFA10496846FAF75BFA201C36 -:1056800008306946FAF756FA291C201C1230FAF73E -:1056900051FA10AB9888002201212083D8886083BA -:1056A0001889E081588920826846F9F73C00E807AC -:1056B000010017FF14B070BD0000146E01001261EC -:1056C0000100B0B5041C1848251C0078603580071F -:1056D000002808DAE879002805D0F4F770FF011CEB -:1056E000201C00F078F929882E20005DF2F73C009C -:1056F000240801009FFAE87900280BD1201C4030D3 -:10570000018B22691180418B22695180808B216934 -:10571000C88207E0012805D1206901220188D20250 -:10572000114301806A7AE0680249F2F753FAB0BD8A -:105730003C00600801001D750100D14F000090B5CC -:10574000041C38230C495843431885B000200A49EB -:105750000290181C012203910949049230304278CA -:1057600009880192009101785A6B0C33201CFBF7D9 -:105770007CF83C009C08010005B090BDD4E4010019 -:105780005D4E0000487B010090B585B0031C0020F1 -:1057900002900A49181C0022049260300391C279D9 -:1057A0000188019200915A6ADC682033997B407A23 -:1057B000231CFBF73C00D80801005DF805B090BD44 -:1057C00000000D4F0000074980B5886A002808D105 -:1057D00001208862F0F7AFFC011C03480022F2F7B9 -:1057E000B8FE80BD00007869010041E40000F0B51A -:1057F0009BB0002820D03C0014090100011C08A81F -:10580000FCF7B2FD01201190032010AD2872042096 -:10581000687205A800226946F4F700FF00240026FC -:1058200005A90020F9F7FCFA6946F9F7F9FA0B9097 -:1058300008A8FCF7BBFD01343C0050090100022C14 -:105840002E72F0DB1BB0F0BD000090B5041C4C23A1 -:105850000C495843431885B000200A4902900022A1 -:1058600004923C200391C25C084841880192412087 -:105870000091C15C5A680833201C3C008C0901006F -:10588000FBF702F805B090BD58E30100754F00002A -:105890003C7C0100F8B50E1C224C3821171C051C5D -:1058A000201CEFF775FD231C2533211C243110200B -:1058B0006A46F9F71DF800AB188807213C00C809B3 -:1058C00001001A4A02382084201C20308170C570E3 -:1058D000111C0673477334312163303262630179DE -:1058E000251C103521812060E5601888401A20832E -:1058F000201C28302061201CF9F711F80D483C00CD -:10590000040A01000068002807D00621201CF8F7CF -:1059100047FD1021281CF8F743FD084802210162C9 -:1059200044620121016206480068EFF7D5FCF8BD2A -:105930008C8E0100E4FE0100CC5C01000030070009 -:105940003C00400A01005C5B0100F0B5061C4036DB -:10595000318B041C251C0807800F6035012885B099 -:105960003BD0E879002805D120690180B08B2169FE -:10597000C88207E0012805D1206901220188D202EE -:1059800011433C007C0A0100018020480078800718 -:1059900026D5E879002823D0A06B00281CD0F4F786 -:1059A0002FFE002809D0B8210958002905D0302140 -:1059B000095DB4300818077A00E000270121381C7F -:1059C000FAF786F93C00B80A010004902069043017 -:1059D000391CF4F76CFD0499FAF7D3F902E0201CA6 -:1059E000F7F7F9FB7083708B216900224880094921 -:1059F0000A48049203910290EA7929880192009161 -:105A0000626AE36820343C00F40A0100A17B687AF2 -:105A1000FAF74CFF05B0F0BD1D750100D14F000035 -:105A2000DD2F0100FEB5041C261C012020360029B4 -:105A300002902ED05820005B0007800F012801D172 -:105A4000CC3100E0B43148683C00300B01000D1C43 -:105A5000002824D0201C6030C2790121012A00D006 -:105A60000021271C626D3037002A04D03A1C281C04 -:105A7000F6F7E7FD07E0427A231C683300923A1CF0 -:105A8000281CF6F79AFD029038783C006C0B010058 -:105A90004019007A0121B073FAF726F901E00020DD -:105AA000B0736062B07B0D2801D9F0F7BBFB0298A0 -:105AB000FEBD0000FFB5041C8030251C5E3500785B -:105AC000AE1DAF1F002883B012D1F4F73C00A80B25 -:105AD0000100C7FB002807D006980599029004989A -:105AE0000190A66167610DE00498069902900598FF -:105AF0000190666105E004A903C90290069801902F -:105B00006761A5610622381CEFF78BFC06223C007A -:105B1000E40B0100281C0299EFF786FC0622301CDA -:105B20000199EFF781FC07B0F0BD0000B0B50D1C86 -:105B3000041C052801D3F0F77BFB0249A00008589C -:105B40008560B0BD107B0100F8B5FFF759F9051C61 -:105B50003C00200C0100FEF7E8FF041C281CFFF7A6 -:105B600058F9002842D0691E214D4A00204B1C3DA7 -:105B7000AE5C985C3040D6180123F6565219D256C6 -:105B8000964201DD151C00E0351C184B2A3B595686 -:105B900051183C005C0C0100B14200DB311C0E1CB2 -:105BA000002826D0FEF7BEFF009000AB18781249FF -:105BB0000023C95600AB1522101A5B78001B401851 -:105BC000D21A121B51180022854202DB00AB1A7058 -:105BD00002E0401B3C00980C010000AB18708E42A4 -:105BE00002DB00AB5A7002E0881B00AB58700098D3 -:105BF000FFF78DF801F0FFF8F8BDE6780100657356 -:105C0000010070B5084E064D00240620604380193F -:105C10000622291CEFF73C00D40C010011FC0134D2 -:105C2000052CF5DB70BD00004E470100E67A01004F -:105C3000034880B501680348FEF742FB80BD0000C1 -:105C4000A8790100C4600100034880B501680348D9 -:105C5000FEF74AFB80BD00003C00100D0100A87952 -:105C60000100C460010010B500280AD0064CA169EB -:105C7000002901D1002000E00968F7F738FBA06196 -:105C800010BD002010BDA46E0100F3B5374883B0ED -:105C9000029080790E1C002701903C004C0D010001 -:105CA0003448354A016A039C031C1B69A14201D098 -:105CB000936100E0536131498A6896423FD02D4894 -:105CC0008E60C1680024251C00292D4809D0002EB3 -:105CD0000BD028480124C06A240300283C00880D0A -:105CE000010006D0012704E0002E01D0051CF9E7D1 -:105CF000041C002F06D0FBF71EFB1F48016822483A -:105D0000FEF7FBFA201C28430ED02A1C211C012080 -:105D100002F021FE2A1C211C022002F01CFE3C0085 -:105D2000C40D01002A1C211C032002F017FE002FC5 -:105D300006D1134801681648FEF7CEFAFAF742FD7D -:105D4000039C002C01D101F0E1FF01A903C9887176 -:105D500001F0DCFF0A4C0A4B443CA1692269083B74 -:105D60003C00000E0100411A002A03D01A685118A5 -:105D7000196002E05A6851185960A061266105B0A7 -:105D8000F0BD20100700A46C010010000700B05700 -:105D9000010000106000847301001CB54C23084909 -:105DA00058433C003C0E01004418201C4030417810 -:105DB0006268009101923F210B5D618F0078626CF7 -:105DC000FAF728F8A0851CBD58E30100B0B5164DC0 -:105DD000A969002925D02C1C3034207A002820D035 -:105DE000002381223C00780E0100182002F089FC7B -:105DF000207AFF300006000E207212D10C482821B4 -:105E00002C38095C2172297A002901D1006A00E04E -:105E1000406AA9698002814203D24900814201D2CD -:105E2000A961B0BDA8613C00B40E0100B0BD01F095 -:105E30001DF9B0BDF46E01007FB5051C04206B4652 -:105E40001B180290002628186A4602A9FCF78AFB54 -:105E5000002806D100AB1879042808D01879032847 -:105E600005D000AB187910213C00F00E010008436A -:105E700004B070BD03A9E868F6F7D3FF002805D089 -:105E80000398202108430006000EF1E703A9002033 -:105E9000F6F7C7FF041C01D10220E9E7E86800AB70 -:105EA0002060009860601879A0763C002C0F0100FB -:105EB000A88C6076E8692061688CA082288C2076A6 -:105EC00069690948814200D9081CA060201C02F0C1 -:105ED000A1FDA168002904D0039AA132082002F094 -:105EE00037FB301CC7E70000A08601003C00680FAC -:105EF0000100FEB5061C40780124062850D3C11EBF -:105F00000320EFF75EFB00900E2849D800200AE03E -:105F10004100091889194A798979511801390E29DE -:105F200000D90024013000998842F1DB002C3C00AC -:105F3000A40F010037D00322B11C1B48EFF7A4FACD -:105F40001A4C1C21201CEFF74DFA002528E06900AF -:105F5000491902918A1953791548435493790F18B6 -:105F60007B70D379BB700723D2560192445C0FE05B -:105F70003C00E00F0100201CFEF77BFF002807D04B -:105F80000C4A600080180121103881730199C17397 -:105F900001342406240E07480299405C79784018A1 -:105FA000A042E8D8013500988542D3DBFEBDE86207 -:105FB00001003C001C100100E6780100EB620100CA -:105FC00001680F2901DD0F2101600168002901DA54 -:105FD0000021016070470000F8B5041C1E48221D16 -:105FE00005680092161C231C0F1CCC332A1C201C95 -:105FF0007030A16D3C005810010000F03EF9009691 -:10600000A16D27200140231CE433201C2A1C5C3096 -:1060100000F033F9134800780E2801D2012585409D -:106020001148A1690078294000070BD4480703D51F -:10603000080701D504203C00941001008143880624 -:1060400003D5480601D520208143231CB4332A1CE4 -:10605000201C3030009600F013F9391C201CF0F79A -:1060600047FCF8BD2C7D0100106701001D75010083 -:10607000B0B5F2F727FCFEF73C00D010010009F99B -:106080000F48002545700E480D4C00885B34A082F7 -:10609000F9F723FD2061A08A002804D00121890599 -:1060A000EFF70DFBE18205480138456001F055FE30 -:1060B000021C231C00210020F4F73C000C110100FD -:1060C00049FDB0BD457D0100F467010070B5161CA7 -:1060D0005A89041C04989207920F00250029A27186 -:1060E00009D00521F9F724FB002801D0C07800E091 -:1060F0000120E07100E0E571E560A6603C00481118 -:10610000010070BD0000FEB5051C0E229C30164932 -:10611000EFF7CFF9291C281C8030883100242F1C70 -:106120006037029101902006000E061CF9F70DFE63 -:10613000002803D001984268029901E0EA6D3C0012 -:1061400084110100391C002A0DD0002003E00B5CF3 -:10615000B34202D801309042F9DB08181038C07BF6 -:1061600029199031087301340E2CDFD3FEBD0000D5 -:10617000CC470100FFB581B0141C101C06220D1C79 -:106180003C00C0110100191C0B9E0A9FEFF797F904 -:106190000622391CA018EFF792F9E6602C60102057 -:1061A00028816E600198E86005B0F0BD000070B510 -:1061B000041C002020615820005D0E1C151CC00727 -:1061C000C0173C00FC1101000130E061216B002987 -:1061D00036D11E490968294332D0A168898A00292D -:1061E0002ED000280BD0201C583000F0F3FD0028E2 -:1061F0001BD0816A026A406A0978007806E0144A76 -:106200003C2311783C0038120100507843439A181F -:106210000432002D03D1022901D0032902D16D21BE -:1062200022610855206900280DD08188002901D1FC -:10623000012070BD8079022805D1221C074907483A -:10624000F8F74BFF02E03C0074120100201CEFF74E -:10625000B5F8002070BD00002861010068610100F0 -:10626000A1DA0000A06A010010B500210020F9F7B2 -:1062700039FEC400F9F754FE2418F9F747FE08491F -:1062800020180988084C40183C00B012010006494B -:10629000098840186061F9F746FE054909884018E9 -:1062A0004000A06110BD0261010004610100D479C9 -:1062B0000100A66901001140081C10B51C1C191C26 -:1062C00008311860F1F731FE60603C00EC1201000B -:1062D00010BD0000F8B5061C22480F1C4168914211 -:1062E00003D000218160C1604260C46815E02820AD -:1062F0001D4960434018051C0622311CEFF770F859 -:10630000002807D1A81D391CF9F710FD3C002813FF -:106310000100002801D00120F8BD01342407240F1A -:10632000124880688442E5D1104C2823A0680F4DA4 -:10633000584340190622311CEFF7D3F8A0682823F0 -:106340005843401906302222391CEFF7CAF83C00A6 -:1063500064130100A06801300007000FA060E1682D -:10636000814203D101310807000FE0600020D6E729 -:10637000EC650100A0F4010010B50021032000F03D -:10638000E5FF054CA068002804D101F007FD616815 -:106390003C00A0130100401A606010BD0000D060F6 -:1063A000010002680A6001607047011C0068002853 -:1063B00001D002680A6070470000FEB5141C1D1C65 -:1063C0000022D24301ABF3F782FF01980026284058 -:1063D00001903C00DC1301000025002720601EE036 -:1063E0000121B9400A1C024018D0884301903906A7 -:1063F000090E7019001902910177081CF9F7C6FC03 -:10640000002806D0301C0019013602993030017086 -:1064100004E0281C3C001814010001350299001901 -:106420000172013701980028DDD17019A061656003 -:10643000E662FEBD0000B0B5144D041C287A0128A8 -:1064400002D10420F6F7ADF9211CA86AF5F721FC6A -:10645000002803D104203C0054140100F6F7A4F9ED -:10646000B0BD02202870288C002800D06081688C84 -:10647000002800D0A081A88C002800D0E081E86925 -:1064800001230204120C201C0249FCF719FFB0BDC5 -:10649000F46E0100A17700003C0090140100F8B5F3 -:1064A000194E051CB069002800D13068FFF73BFC8D -:1064B000154F041C503700280BD06068291C7860E9 -:1064C00001203863201CF5F7EAFB002804D10020E6 -:1064D000F8BD0023FB62FAE700233C00CC14010066 -:1064E0002377F86A002801D10120F862387A012860 -:1064F00007D0F86906490204120C281CFCF7E6FED6 -:1065000001E0FB62B3610120E5E70000A46E010039 -:10651000DD02010070B50D1C041C161C3C000815A2 -:106520000100042C1BD21048834207D258000F49A7 -:10653000EFF7FBF8FF30000A013800E000201F35BC -:10654000EA066107090ED20E11437207520D11437C -:106550000006000A0843064AA100505070BD3C00E6 -:106560004415010001218D20EFF7ACFE70BD000045 -:10657000409C000000803801E8600100094A80006A -:106580001058400940010722024307480368002BC6 -:10659000FCDB42600906016001680029FCDB082081 -:1065A0003C008015010070470000E86001003020C9 -:1065B0000700B0B5041C0D1C0749A00008580028AE -:1065C00003D102218D20EFF780FE291C201CF6F755 -:1065D000A8FAB0BD0000E8600100B0B5041C0D1CB5 -:1065E00007493C00BC150100A0000858002803D151 -:1065F00002218D20EFF76CFE291C201CFFF7C4FF41 -:10660000B0BD0000E8600100F8B50D1C161CF7F7DE -:1066100017F9041C2868404F817800293BD1C178C4 -:10662000002958D13C00F8150100F8F7F8F9228E3E -:10663000618E8A4204D0A16A0918E069814210D9AA -:106640003849321C486B01304863206A01302062AF -:10665000386801303860E0686369291CEEF7D8FEBD -:10666000F8BD013212043C0034160100120C2286DF -:10667000A162B868002834D12C480C2300681B1A8A -:106680009A4207D219239B01AF2292015843101A54 -:10669000814226D30120B86001210C2000F07AFE4F -:1066A0001FE001291DD1C0783C0070160100172899 -:1066B0001AD1A08EE18E884214D3E968096809795D -:1066C00009060FD5606A321C01306062E0686369B8 -:1066D000291CEEF7A3FEE868016808310B2000F0E2 -:1066E0005CFEC3E70130A086A08D3C00AC16010023 -:1066F000E18D884204D103210220EFF7F5FDB8E7D0 -:1067000060684560866000686060F8680130F86025 -:10671000A08D411CA1850028ABD10848B969FDF7BF -:1067200061FE221C0221F12002F064F83C00E81610 -:106730000100A1E70000FC5A0100905C010018571D -:106740000100C460010080B5021C0221F02002F0AB -:1067500054F880BD0000002803D102484178C907E1 -:10676000FCD5704700000400070080B500063C001F -:106770002417010001D1F1F771FE80BD80B5F4F757 -:10678000E5FA80BD80B5F6F7EBF880BD0149002041 -:10679000087470477869010080B5C00703D50249C5 -:1067A000012000F01DFC80BD50C300000006000E5B -:1067B0003C0060170100012880B502D1F6F7E1F92D -:1067C00080BD0028FCD1F1F74CFE80BD000080B5F3 -:1067D000F6F7D7F980BD034980B500200874F6F7B5 -:1067E000FEF980BD00007869010080B50006000E4A -:1067F000F1F73C009C17010071FE80BD10B5012827 -:1068000008D0022803D0032801D0EFF7A7FDF6F740 -:10681000E9F910BD01F0F8FA041CFAF75DFD241A3D -:10682000FAF73EFD084900280BD0486A002808D036 -:10683000064884423C00D817010005D2011B012202 -:10684000072001F0F4FEE5E700204861E2E77869FF -:10685000010050C30000094980B5486900280CD0E8 -:10686000086ACA69801A002807DD002048610121F2 -:10687000072001F010FF3C0014180100F6F7B8F9EA -:1068800080BD00007869010080B500F0E7FB80BDA5 -:1068900080B500F03FFC0020F7F7D4FC80BD00007D -:1068A00080B500F037FCFDF76FFCF5F773FD30F0B5 -:1068B00047FB80BD044880B53C0050180100C16A08 -:1068C000006BF2F7DEFF0120F7F789F880BDA46CBA -:1068D000010010B5F3F741F80D4C002804D0012059 -:1068E000E064F7F7B2FC10BD01210120F3F7E9F8ED -:1068F000FDF74DFC606D002803D03C008C180100B2 -:10690000F3F782F8002801D0F5F74AFD0120F2F7ED -:10691000C1FC10BDA46C0100044880B5C16A006BC5 -:10692000F2F7B2FF0120F7F75DF880BDA46C01001B -:1069300080B500F0F5FBF5F733FDFCF73C00C81817 -:10694000010031FDF9F7CBFF0420F2F7A6FC80BD72 -:106950000000034880B5C16A006BF2F798FF80BD64 -:106960000000A46C010080B500F0DDFB0020F7F70B -:106970003CF830F0EEFA80BD000080B500213C000C -:10698000041901000120FFF719FA0120F2F788FC31 -:1069900080BD000080B500F0C9FBFCF707FD0121B8 -:1069A0000120FFF70BFA0420F2F77AFC80BD00000B -:1069B00080B500220021002000F08AFB80BD00008D -:1069C0003C0040190100034880B5826A012104207F -:1069D00000F081FB80BDD479010080B50022002148 -:1069E000032000F078FB80BD0000034880B5826A78 -:1069F0000121042000F06FFB80BDD479010080B537 -:106A000000223C007C1901000021032000F066FBFD -:106A100080BD0000064880B5816842690069511850 -:106A2000814203D90121012000F058FB80BD000004 -:106A3000D4790100064880B58288816800695118C0 -:106A4000814203D93C00B81901000121022000F065 -:106A500048FB80BD0000D479010010B5084C207BB4 -:106A6000216AF9F79CFAA1694218A0682169801887 -:106A7000884203D90121022000F033FB10BDD479F4 -:106A8000010080B500223C00F41901000021002023 -:106A900000F02AFB80BD00000006000E012880B532 -:106AA00002D1F6F78FF880BD0028FCD1F1F7FAFC8F -:106AB00080BD000080B5F6F785F880BD80B5000682 -:106AC000000EF1F729FD80BD3C00301A0100B0B581 -:106AD00002250228104C0BD1FBF747FC002801D1FE -:106AE000FEF74FFF2570A1680C48FDF7A8FCB0BD6C -:106AF00003280DD108487D231C380069DB0058436A -:106B0000191C40184108022000F03C006C1A0100DA -:106B100091FA2570B0BDF8F731F9B0BD7869010080 -:106B20003463010010B5054CE068002801D1EFF78F -:106B300039FC0220207000F0AFFA10BD7869010026 -:106B4000034880B5826A0121042000F03C00A81AA5 -:106B50000100D3FA80BDD479010080B50022002164 -:106B6000032000F0CAFA80BD000080B50022002199 -:106B7000002000F0C2FA80BD0000034880B54269E1 -:106B80000121012000F0B9FA80BDD47901003C0058 -:106B9000E41A0100064880B58288002A02D001214B -:106BA000022002E000220021002000F0A9FA80BDAE -:106BB000D479010010B5064C207B216AF9F7FEF963 -:106BC000A16942180121022000F09AFA10BD0000CC -:106BD0003C00201B0100D479010080B50022002177 -:106BE000002000F090FA80BD000038B5FAF741FEB1 -:106BF0000020F0F780F8009000AB1C885D88F8F763 -:106C00003CF9002C02D0FDF79EFA02E00120F6F7D5 -:106C10000AFF3C005C1B0100291C201CFCF7B8FC8F -:106C2000002C02D0F5F7E0FB02E0002000F0DCF9D8 -:106C30000320002C00D102200006000EF2F74EFBCC -:106C400038BD0000034880B5826A0121042000F0AD -:106C50005DFA80BD3C00981B0100D479010080B52D -:106C600030F09BF980BD80B500220021032000F0A8 -:106C700050FA80BD0000034880B54269012101201F -:106C800000F047FA80BDD4790100044880B58288BD -:106C9000002A03D001213C00D41B0100022000F097 -:106CA0003BFA80BDD479010010B5064C207B216AE7 -:106CB000F9F790F9A16942180121022000F02CFA9D -:106CC00010BD0000D479010080B5FCF793FB0121D1 -:106CD0000120FFF797F804203C00101C0100F2F798 -:106CE00006FB80BD000080B52FF06BFB00280AD0AA -:106CF0000120F2F7FCFAFAF72AFC002802D104205E -:106D0000F6F75DF880BD03211620EFF732FB80BD5A -:106D10000000024880B50068EEF73C004C1C010002 -:106D2000C5FB80BDD4790100034880B542690121CB -:106D3000012000F0F7F980BDD479010080B530F072 -:106D400035F980BDB0B5184CAA20005D042819D1D2 -:106D50000125E562256301F093F8A0663C00881CDC -:106D6000010001F0FCFDF2F72EFE00280ED00220FB -:106D7000F2F7C3FAA56001F086F864306060FAF7B4 -:106D80008AFD01210120FFF746F8B0BD0120F2F78E -:106D9000B4FA0020A06000210120FFF73CF83C007D -:106DA000C41C0100F2F766FE0028F1D0FAF776FD68 -:106DB000B0BD0000A46C010080B50020EFF7D6FE46 -:106DC00080BD000080B50120EFF7D0FE80BD00003F -:106DD000AC21095C024A09028918C0318160704700 -:106DE0003C00001D01007075010080B5012804D130 -:106DF00003C90968EEF764FB80BD01211420EFF799 -:106E0000C4FA80BD0000002802D1024840687047E3 -:106E10004068704700005875010010B50024F8F76D -:106E20001CFB3C003C1D0100002804D04030807A4F -:106E3000052800D10124201C10BD000004480021B9 -:106E4000406801E0016340680028FBD17047000002 -:106E500058750100B0B5041C0D1CF7F7A5F84034B7 -:106E6000E572B0BD3C00781D0100F8B5071CF8F7CD -:106E7000FAFA041C04D005211420EFF78CFA28E05C -:106E80000025144928024618301C443006221249B5 -:106E9000EEF72DFB002802D1AC208555341C0135BE -:106EA000032DEED3002C3C00B41D010014D0391C7E -:106EB000201CF8F72BF80949002020601839486891 -:106EC0006060002800D004604C60CA68002A03D0CB -:106ED0000121201CEEF7FEFA201CF8BD70750100A0 -:106EE0005846010080B5F8F73C00F01D0100C1FADA -:106EF000002804D106211420EFF753FA80BDF5F7DE -:106F000016FC80BD000080B5F8F7B3FA80BD10B55F -:106F1000094C2188022903D11420EFF742FA04E03A -:106F2000A3688A009850481C20803C002C1E010059 -:106F3000208801380004000C10BD000058750100C5 -:106F40000B1C111C084A80B51288904206D2DA68E0 -:106F5000C0001218142001F0BBFB80BD03211420D7 -:106F6000EFF722FA80BD0000587501003C00681E52 -:106F70000100084A80B51288904206D2C968C00054 -:106F80000918142001F0DBFB80BD04211420EFF769 -:106F90000EFA80BD0000587501000149C8607047B5 -:106FA00000005875010080B506224430EEF73C0021 -:106FB000A41E0100ABFA002801D1012080BD0020F1 -:106FC00080BD00001CB5144C2069002823D0207817 -:106FD0000A2801D000F0FCF8002060610F484079D9 -:106FE000A070002801D0012815D1FDF7EDFE019019 -:106FF0003C00E01E0100FDF782FE009000AB187916 -:107000001978401A187158795978401A58710198AE -:10701000F2F789FE0520207000F0BFF91CBD7C78D6 -:1070200001000C5A010008B5044A009014320020F7 -:10703000024B3C001C1F01000249F1F77DF908BD1D -:107040002C750100B1A80000B0B5002806D00128B9 -:1070500006D0022807D10C4C012507E00B4C04E0B8 -:107060000A4C2A3C01E0084CB634002500F02CFF05 -:107070000749896E3C00581F01000919091AA142ED -:1070800000D900212A1C162001F031FBB0BD71028D -:1070900000000C050000A46C01008CB500AB8E2133 -:1070A0001980FCF738F901906846FBF7A6FA8CBD09 -:1070B0000000BFB5134A3C00941F010001910D1C54 -:1070C000117C8843041C2143081C1074A0070BD5B5 -:1070D0000E4800900120029000F0FCFE0C49401880 -:1070E00003906846F9F76AFFE0070CD5F1F72CFD2D -:1070F000002803D0074885423C00D01F010000D281 -:107100000190064800906846F9F709FFBFBD78690D -:10711000010081EA000010270000A086010075EA46 -:10712000000010B50A4C606900280ED10120606192 -:10713000A1680748FDF7CBF900213C000C200100B5 -:10714000A068F9F7D1FB01220720044901F0D8FA21 -:1071500010BD00007869010034630100983A000016 -:1071600010B50C1C111C064A002B107003D000280F -:1071700002D1F9F7F5FD10BD201CF9F73C004820BD -:10718000010001FE10BDA0790100B0B50A4C051C3C -:10719000E36A201F0133E3620088002906D0A1685A -:1071A00089182161054A00F0FCFE01E000F0CFFEE5 -:1071B0002577B0BD0000D479010055E300003C0004 -:1071C00084200100011C034880B54088FFF7ECFED5 -:1071D00080BD0000987C0100034880B5C168183864 -:1071E0008088FFF7E1FE80BD707C010080B5002142 -:1071F000162001F0BFFA0121162001F0BBFA80BD74 -:107200003C00C020010010B50B4C20780A2810D09B -:10721000012060610A21132001F0AFFA0A2060709A -:107220002070FDF73CFB0120FDF7E9FB0020FAF799 -:10723000C4F910BD00007C78010010B50C4C002092 -:107240000B493C00FC2001002063E062503988615A -:107250002070084838210C38007A08558121182000 -:1072600001F08EFA2069012802D10020F5F73EFBDB -:1072700010BD0000F46E0100B0B51C4C00252C229E -:10728000011D201C3C00382101009AB0EEF739FAAC -:1072900018492C31081C007A8A69002A13D1022867 -:1072A00003D1A068002820D004E000281DD1606828 -:1072B00000281AD0800288610E4869462438006888 -:1072C000EFF7CBFB11E03C00742101000022022803 -:1072D00003D1A068002809D104E0002808D1606823 -:1072E000002803D18A61FFF7B1FF01E080028861C5 -:1072F000281C1AB0B0BD0000C86E0100F8B50C49DA -:10730000022048600B4900053C00B02101000860E4 -:107310000B4FB868F9687C68451A2E1C04E0A06819 -:107320006168EEF709F92468013DF8D27C60F868DD -:107330008019F860F8BD402007000010070044E302 -:107340000100F8B51F4E041C30693C00EC2101001F -:107350000121F9F799FA1D49600040181038817B26 -:107360001B4A5172C07B10741A4F1B4D0E2C0AD150 -:1073700001220221082001F0F3FB0320FF2141310B -:107380003986142108E00222012108203C0028222D -:10739000010001F0E8FB1249022039861021A97191 -:1073A000E8711048114A00191038C07B002803D03A -:1073B00001215173107301E0002050730021201C43 -:1073C000FDF7E5FD3069F9F708FBF8BD00003C006A -:1073D00064220100407C0100764601000C80070019 -:1073E0003080070000800700FF0100005C570100AB -:1073F000D080070010B5154C144A217800201832AF -:1074000005291DD006291BD0072901D0082906D13E -:107410003C00A022010091680520102900DB062015 -:1074200020700120A178002861700BD00020FAF7AD -:10743000DCF800216078F4F73CFA0A221E211320C0 -:1074400001F07FF910BDD16907201029E8DB082081 -:10745000E6E73C00DC2201007C780100B0B50D1CA1 -:10746000011C041C44310020F6F740FA3034002D92 -:1074700007D00EC80EC408C8103808C4F4F7C4F901 -:10748000B0BD1ECC1EC0B0BDF8B5081C111CF4F771 -:1074900087FA084C3C00182301000025084E084FCD -:1074A00006E0306B002803D035632068EEF755F80E -:1074B00038680028F5D0F8BD00005C5B0100E4FEF0 -:1074C0000100845A010080B50006000E00F007F8A4 -:1074D00080BD80B50A1C3C0054230100232101F02B -:1074E0002BFA80BDB0B50D1C041C122803D301215A -:1074F0002320EEF79BFF0649A000085804E012C8BD -:10750000281CEEF72EF8201C0028F8D1B0BD000092 -:10751000685B0100F8B50E1C3C00902301000025BB -:10752000041C122803D301212320EEF782FF134805 -:10753000A700C45908E02068B04203D103212320EA -:10754000EEF777FF251C6468002CF4D10C4A043A4E -:107550001068002801D0416811603C00CC23010074 -:10756000002804D102212320EEF766FFF8BD002198 -:1075700041600660002D01D06860F7E70149C851FD -:10758000F4E70000685B010070B50E1C051C0024C8 -:10759000122803D301212320EEF74EFF3C000824DC -:1075A00001000D4BAA00985804E00168B14204D0D4 -:1075B000041C40680028F8D170BD0028FCD0002CC5 -:1075C000416801D1995000E061600021034A0160E7 -:1075D000043A11684160106070BD685B01003C00B6 -:1075E00044240100F3B581B0002817D00178FF29A9 -:1075F00014D04578441902348027013C2678013D97 -:10760000BE43301CF8F782FC012181400298014002 -:1076100002D03E43301C2070002DEED1FEBD000094 -:107620003C0080240100104B10B55968411A0F2905 -:107630000DDC0E22D243914209DB1A1C926800290C -:1076400001DD002A03DA00290DDA002A0BDC0433FD -:1076500003C3FDF710FD041CFDF713FD002802D045 -:10766000201C3C00BC240100FFF792FE10BD00006E -:1076700018630100F8B5644C071C6078A178884253 -:107680000FD1081CFDF7CEF8E060042060700A22DC -:107690001E21132001F070F800216078F4F724F91E -:1076A000F8BD04283C00F82401006ED1584EFDF7C7 -:1076B000BCF800907178041C0020052921D201A398 -:1076C0005B5C5B009F440B0F141A02005148514948 -:1076D000604341187D20C000EEF787F811E0872055 -:1076E00060434D4902E03C003425010045204D49EE -:1076F0006043401808E04C48CD2109016043401A1E -:1077000002E0462060438238060648480721007997 -:107710003616081A001900906846FEF75FFD381CFF -:10772000FDF72EFB0099424A3C00702501004900FC -:10773000515A48433949041C8878002801D001284F -:107740001ED13549002803D13A480578042002E0CB -:10775000384845780C203049C968491B0818009002 -:107760006846FEF73EFD009833493C00AC25010019 -:1077700040002031085A2A494443C868A84201D928 -:10778000012500E000252E4821184000EEF7A2F860 -:10779000041C002D03D0FDF7C3FA02E03DE0FDF725 -:1077A000F3FA002F02D125480E3801E03C00E8250D -:1077B000010023480A380168611ACB1C01DB032948 -:1077C00000DD04600168A14201D2013104E0A14260 -:1077D00003D9002901D0013901600168381CFDF787 -:1077E000C0FB104C0A2060700A221320A1683C00E4 -:1077F0002426010000F0D2FF606800F0F7FA0028AC -:1078000000D15FE700F0BAFB1149002340180E4990 -:1078100060601E39C856B042F3D00E70311C002093 -:10782000FFF784FE4EE7FFF715FE4BE77C7801007B -:107830003C006026010060D7FFFF608F0100540B01 -:107840000000C90900008EFEFFFF0C5A0100125A09 -:10785000010020A1070040420F0030B50C4BFE2470 -:107860001B880440C0075D076D0FDB08C00F9C42FA -:107870000BD83C009C260100A218043A9A4207D378 -:107880001A1B895C0122AA40114001D00221084341 -:1078900030BD0000FA60010080B5002803D0011C53 -:1078A0001420F5F7FFFA80BDB0B5041CF7F708FD0A -:1078B000134D00283C00D82601001DD1A00716D585 -:1078C00002208443114801222A624068002813D014 -:1078D000F2F751F900280FD10B48E430807A0128E3 -:1078E00000D00022111C0120F2F7A5F904E000F0FD -:1078F0004EFBE861F2F73C00142701006BF9A96A1E -:10790000002902D0201CEDF75CFEB0BD606C0100C8 -:10791000B05701002048B0B58168012904D1007832 -:10792000002801D1FDF772FD1B4D803D2C1C7034E9 -:1079300020780338052818D23C005027010001A305 -:107940001B5C5B009F44041527272700FBF7F1FF12 -:10795000607B011CFF3161730028F7D10420207087 -:10796000A889F8F7DAF9011C00220F2000F025FFA2 -:10797000B0BDEFF7CEFF6A21495B3C008C270100C8 -:1079800088420BD0E889F8F7CBF9011C00230022CC -:107990000F2000F0F7FF07202070B0BDFDF73AFE82 -:1079A000B0BD000084660100F0B585B0041C038002 -:1079B000180C60800D1C5178107809023C00C82713 -:1079C00001004840A080D178907809024840E080CA -:1079D0005179107909024840208168461A491422D9 -:1079E000EDF7E3FE00230020D907C90F8C464200C3 -:1079F0005607760F6146891949006E5C49193C00AB -:107A00000428010049786F4609024E4081007958E8 -:107A10000F4F4900615A01304E403106360A760058 -:107A2000C90D795AF61901277F02F6193688714077 -:107A3000A65A8919A1520528DCDB2089C018013318 -:107A40003C0040280100082B2081D2DB05B0F0BDAE -:107A50000000D8560100D8520100F0B5051C0C1CDE -:107A60001E1C002089B04100535A013006AF7B52E2 -:107A70000528F8DB108900AB3A498019588468461C -:107A800018223C007C280100EDF798FE0020410000 -:107A90000A195278635C6F46120253408200BA584A -:107AA00006AF5200BA5A314F013053401A061B0A32 -:107AB0005B00D20DBA5ADB1901277F02DB191B8844 -:107AC0005A4006AB3C00B82801005B5AD21806ABFE -:107AD0005A520628DEDB617B207B00AB090248405E -:107AE000598C48404108C0034840198B40181883FE -:107AF000E17BA07B09024840198B48404108C00344 -:107B00004840598B40183C00F4280100588302205B -:107B1000410006AA8A18203AD28B01305308D203BA -:107B20005A4006AB5B5AD21806AB5A520628EFDB16 -:107B3000300A28707004400E202108436870AE702F -:107B40006178207800AB09023C00302901004840F0 -:107B5000598C4840C005000EE8700020410006AA7C -:107B6000535A4A190130137106AB595A090A517117 -:107B70000628F3DB09B0F0BD0000EC560100D85236 -:107B80000100F0B54668051C60303C006C2901001E -:107B900085B0049060E068680C2107690020EEF76A -:107BA0002DFE7061018904390904090C0181706995 -:107BB000006840180421EEF721FEF0617069202171 -:107BC000046804980422407B800108433C00A829F3 -:107BD0000100E07028694089A07028694089000A86 -:107BE000207029690C31A018EDF79BFD2078202129 -:107BF0004006400E0843607028690A300188013150 -:107C00000904090C018004D128690C3001683C008A -:107C1000E4290100013101603562617920790902AE -:107C20004018A17909044018E17909064318009326 -:107C3000A0782178090240180404240C1020EEF7E3 -:107C400013FFB06128693A1C0168009B01A80A3241 -:107C50003C00202A0100FFF7C8FE2869231C0168A8 -:107C6000B06901AAFFF711FF3668002E9CD10349C5 -:107C700004486A68F7F763FB05B0F0BD0000FD6BD0 -:107C80000000A06A0100013807494000095C002992 -:107C900006D03C005C2A010004491C39085C00281D -:107CA00001D001207047002070470000E6780100F5 -:107CB000FEB5051C002002901348171C00680C1C20 -:107CC0008678301CFDF728FA002801D10298FEBD05 -:107CD000002D08D13C00982A0100206800AB1871E3 -:107CE00060685871A068987103203880291C301C86 -:107CF00001AA00F00EF8002DECD000AB197921603C -:107D0000597961609979A1600C213980E2E7F86BBB -:107D10000100F8B5151C3C00D42A0100421E0138B0 -:107D200047003F181F483E18002906D001240322AF -:107D3000311C281CEDF704FD32E06878012400288E -:107D400005D02978081801380E2800D90024002C05 -:107D500026D0002A07D12A213C00102B010012480E -:107D6000EDF79FFC1C211148EDF79BFC0F48032207 -:107D7000291C301CEDF7E7FC0C487178C05DB27827 -:107D800000290ED0002A0CD001224318084D06E02D -:107D90004100491910398A73B7783C004C2B010017 -:107DA0000130CF738342F6D8FEF760F8201CF8BD8F -:107DB000EB620100CA78010070B5051C1C48002365 -:107DC000C056431C32D1A87AF8F70CF900260028D7 -:107DD000184C08D0E869E16B00290BD13C00882BD6 -:107DE000010066630121E163A66306E0A869E16B17 -:107DF000002902D06663A663E663A16B0131A1632B -:107E0000820301D50E4A1043E26B002A00D04042A3 -:107E1000626B1018606308290BD1002801DD3C005B -:107E2000C42B0100012003E0002803DA0020C04336 -:107E3000EFF762FE6663A66370BD0000F46B01009D -:107E4000846A01000000FEFF0C21054A41438918A5 -:107E500080B58978002901D1F3F7F2FA80BD0000DE -:107E60003C00002C0100607B010080B5011C00205B -:107E7000F7F703FA80BD80B5011C0120F7F7FDF983 -:107E800080BD02498968401AC00F70470000000198 -:107E9000070002498968081AC017013070470001BD -:107EA00007003C003C2C010005494A6801231A43A5 -:107EB0004A608A681018886048689843486070472C -:107EC0000001070010B5154B00210A019A58002A3D -:107ED00017D101240A019C50D21810730023537348 -:107EE000022301283C00782C01000E4A05D1C8006D -:107EF0008018103002789A4304E0C80080181030CF -:107F000002781A43027002E001310829E0DB0829F7 -:107F100004D101219920EEF7FEFA03490804000C70 -:107F200010BDAC7301003C00B42C010000600700E0 -:107F3000FFFF0000F7B5194F194E0C1CC100C919FD -:107F4000B268103181B0013A4A600B781D1C0D22D5 -:107F500093430B70012282403A73124B0001039A43 -:107F6000C0188260104A101C3C00F02C0100203028 -:107F7000877900AB1F70C0795870B0680330002358 -:107F8000261A01D5041C01234C600D70002B04D06F -:107F9000201CFFF78AFF0028FAD000AB1888D08495 -:107FA000FFBD00600700000107003C002C2D010010 -:107FB000AC7301000010070030B50020C0430B4C2B -:107FC000094B0022D10009190D7CED0707D549693D -:107FD0009D68491B00D50021814200D2081C013256 -:107FE000082AEFDB30BD0000000107003C00682DCF -:107FF000010000600700B0B508280BD2084D04014D -:108000002959002904D000F04AF800202851B0BDB9 -:10801000022100E003219920EEF789FAB0BDAC738C -:108020000100034900014018417B082211433C0034 -:10803000A42D010041737047AC73010001488068B2 -:10804000704700000001070070B50B4E094D00227B -:10805000D0008419207CC00707D56069FFF726FF90 -:10806000002802D0A868323060610132082AEFDBB4 -:108070003C00E02D010070BD000000010700006021 -:108080000700024AC00080180174704700000060B9 -:1080900007000449C0004118087C0823021C9A43C9 -:1080A0000A74704700000060070070B5082817D2F6 -:1080B0000E493C001C2E01008A680E4D013AC10099 -:1080C00049194A610C4B9A7910310C780D26B4434A -:1080D0000C700121814029739A71094A07490001F6 -:1080E0008018416070BD05219920EEF729FA70BD16 -:1080F000000107003C00582E01000060070020101E -:108100000700D1750000AC730100F8B59E461A4B0C -:1081100094469B681A4CC2001219013B5361151C0E -:10812000184CA6792A1C103213780D27BB43137004 -:108130000127124B87403C00942E01001F73A6714B -:10814000124E0001801963464360734683601378C2 -:10815000407BA679012718433843143500AB1E70C5 -:10816000E4795C70064B9B680333CC1A00D5191C6C -:108170002960107000AB18883C00D02E0100034C21 -:10818000203CE084F8BD00010700006007002010DB -:108190000700AC73010000B5011CFFF75EFF421839 -:1081A000101CFFF792FE0028FAD000BD0000891ACB -:1081B000401A9918884201D801203C000C2F010078 -:1081C0007047002070470000F8B50F1C041C002801 -:1081D00001D1EEF7EFF9211C0120FFF719FA412038 -:1081E000005D002801D1002504E0022801D1052509 -:1081F00000E00125E068EEF729FBA66B3C00482F64 -:108200000100002E10D0002F06D02F20025D206A22 -:10821000416B281CEDF744FAA069002801D0EEF765 -:1082200046FC206AEEF743FC201CEEF740FC301CB5 -:10823000F8BDB0B5041CC06B002809D020693C0013 -:10824000842F0100008BEEF755F9002803D0211C84 -:108250000620FFF7E3F9084D201CA96DFFF7BAFFD0 -:10826000002807D0E8680130E860286A01382862F1 -:10827000FCF778F8B0BD0000C469010010B5064CE9 -:108280003C00C02F0100E16DFFF7A7FF002804D0DC -:10829000E0690138E061FCF768F810BD0000C469CE -:1082A00001000C230C495843401810B54468A168DC -:1082B000002902D0201CEDF7F3F9E06B002808D06C -:1082C00020693C00FC2F0100008BEEF719F9002813 -:1082D00002D0201CF9F726F910BD0000607B0100D8 -:1082E000F8B522494868800006D40120400708609C -:1082F0004A69920000D448601D4F787EC306012071 -:10830000021CDB0E3C00383001009A400A6079699B -:108310008C688C602107890F09D0210704D50B21B7 -:108320009E20EEF728F900E078640C208443124880 -:108330003D68065D6C682C3406E0A0680068A060AB -:10834000E968281CEDF73C0074300100B2F9013EE9 -:10835000F6D2A068806800280DD0408900280AD095 -:10836000786C002807D178698068800703D10C21D8 -:108370009E20EEF703F9F8BD00100700CC6D010058 -:10838000B4440100094980B53C00B0300100087ECA -:10839000C206D20E01209040074A106000200A69F0 -:1083A000C04390600868243106C90369EDF786F977 -:1083B00080BDCC6D010000100700F8B54468061CB4 -:1083C0002C3420680D1C806800903C00EC300100CB -:1083D000002800D0C5602068006820604068002840 -:1083E00003D00A219E20EEF7CFF820684560281CB4 -:1083F00002E000224260081CC1680029F9D17168BE -:1084000060270B1C40339C469B78CA7E3C00283179 -:1084100001005B011207120F3B401A438B8FFF27AD -:108420003F041B043B401A4390231A4342606346B7 -:108430009A780132D207D20F9A70896BC160216895 -:1084400088600098002801D00098C5600A4F3C0061 -:1084500064310100BD79A06900280CD00022A2611E -:1084600074686069EFF72EFFE06A616940684860F0 -:10847000616901200860BD71F8BD0000201007008F -:10848000FEB544680F1C01942C34201C123002905D -:108490003C00A03101002CE00C20EEF700FB051C95 -:1084A000606800281DD10298002100900020EEF79E -:1084B0000EFA061C00980421EEF709FA011C019837 -:1084C000C07E0007000FD03070600198C07E0007AA -:1084D000000F3C00DC310100F0304860301CEEF74A -:1084E00019F96560E66001E0206805606068286051 -:1084F000256000206860A860381CFF300006000E70 -:10850000391C071C0029CAD16068A060FEBD0000AC -:10851000FFB5051C3C0018320100081C002681B084 -:10852000F4F72FFE041C02D06068FF2801D1062654 -:1085300028E0211C20310A78012A01D1032621E0FC -:10854000012725600F7011C51D48083D686103981B -:108550006A46E86004983C005432010028611A48D9 -:10856000A8611A48E8611A4828621A486862207EA1 -:10857000A168EDF7B3FE002806D1607EE1686A4687 -:10858000EDF7ACFE002807D00426311C9E20EEF744 -:108590000DF8301C05B0F0BD3C00903201006A4679 -:1085A0000F491D20EDF79DFE01210D48490701608F -:1085B000227E3B1CD206D20E93404360627ED206DE -:1085C000D20E974047604160E6E731330100D9326F -:1085D000010091310100DD3001003C00CC3201008E -:1085E000FD320100713301000010070042682C3297 -:1085F000506843680B6081684B890B818368002158 -:10860000D9604160816000685060002070470000C0 -:1086100070B54268FF269187106B0C043C0008334C -:108620000100051C3604344043685968B1432143B6 -:1086300059600068A842F7D1106B516940684860E2 -:1086400051690120086070BD0000B0B54368081C86 -:1086500059629A6200250AE04581C4682A1C3C00E0 -:1086600044330100002C03D19A7E1207120F1032FE -:108670004260201C0028F2D118694160196901206C -:10868000086002480068EDF737F8B0BD5C5B010098 -:1086900001200549400780B58860044801680D2025 -:1086A0003C0080330100FEF7E6FF80BD00000010B3 -:1086B0000700C4600100F8B50E4F0C4E002448209E -:1086C0006043C5194821281CEDF77BF81C20604346 -:1086D0008119281D1C22EDF7FEF81C23E8560549D8 -:1086E000FBF73C00BC330100CDF80134012CE9D389 -:1086F000F8BD0000B8440100CC6D01001532010046 -:10870000FFB5051C0A30061C81B0F2F7DDF8184FE2 -:10871000041C3988EFF7BCFC3288786802807288C4 -:10872000023002803C00F8330100B188124E4180D3 -:10873000288808364005002805DA6988039A201C35 -:10874000F7F701FD00E000207080F8F75EFC0121E2 -:1087500009030028308801D0884300E008433080B6 -:108760000548002200213C00343401001430EFF7AA -:1087700065FC201CF9F774F805B0F0BDB07A010073 -:1087800010B50E4C6068F8F795F92068006A00286B -:1087900013D1F8F7BFFC002808D021680120086237 -:1087A0001F210022832000F03C00703401009FF95B -:1087B00002E06068F8F721FAFFF797FC216808618A -:1087C00010BD147A0100FEB51B4E0F1C1D1C141C9D -:1087D000B060081CF7F72BFFB08034733562381C8B -:1087E00001AA02A9F7F725FF00AB3C00AC34010059 -:1087F000187A012818D118790B2808D1307F242342 -:108800000F49584340188068ECF788FFFEBD00AB65 -:1088100018790A2808D1F7F739FD071C291C201CF4 -:10882000F7F716FD3818B080307F24233C00E83479 -:1088300001000449584340184068ECF772FFE8E72C -:108840000000D479010094460100B0B5FFF753FC55 -:10885000041CFBF7FCFA0C4D29680969091B0C1A6A -:1088600002211F2000F08BF8142C06DD02223C00B0 -:1088700024350100211C1F2000F050F80120B0BD5C -:1088800029680120896A0029F9D00020B0BD0000C4 -:10889000147A0100F8B51A4D071CAE790121194C64 -:1088A00000202268002A14D1AE71A268D06806CADE -:1088B0003C0060350100ECF73CFFAE790021134A23 -:1088C000506901305061A0688068A0606268904281 -:1088D00006D10120206003E001300C340328E3DBE3 -:1088E000002F08D100290AD00A484068002806D085 -:1088F000FAF73C009C350100F5FF03E0012F03D09F -:10890000002901D1AE71CEE7AE71F8BD201007008D -:1089100018D90100A8600100705D010080B5012335 -:10892000F5F77CF880BD000080B50023F5F776F8F8 -:1089300080BD00003C00D8350100F8B5134B002481 -:108940001B8898421BD2114BC000C01845680668AE -:108950002868002817D10E4FA8684368B34209D190 -:10896000C3688B4206D10368934201D0531C01D1E6 -:108970000124476080683C00143601006B68834224 -:10898000EED103E001218020EDF740FE201CF8BD70 -:1089900056570100845D010029E30000F8B5174F28 -:1089A0000A1CBE79164D00236C6807E021689142CD -:1089B00002D12179814204D03C0050360100231CB1 -:1089C000E468002CF5D117E0002C15D0002B0DD158 -:1089D000E3680D486B600088002B02D1FFF7D1FBE4 -:1089E00006E00A4A9968FFF7F6FB01E0E068D86004 -:1089F0002868E0602C6002E001213C008C36010018 -:108A0000FFF7A4FFBE71F8BD201007007C5D0100D8 -:108A10002C7401002138010070B5094EB579F9F7C1 -:108A2000AFFE041C09D0201CEDF70CFB05498A6839 -:108A300080188860086801300860B5713C00C8364D -:108A40000100201C70BD20100700A860010009482B -:108A500080B54068021C0BE00169002907D0824202 -:108A600004D0816805480088FFF7E5FA80BDC0683A -:108A70000028F1D180BD7C5D01002C7401003C0018 -:108A800004370100054880B54268002A04D0044834 -:108A900000889168FFF7D2FA80BD00007C5D01007C -:108AA0002C74010005480168002904D0C068002822 -:108AB00001D00120704700207047000018D9010044 -:108AC0003C004037010080B5F6F7D1FA80BD131C99 -:108AD0000D4AB0B5128890420FD203290DD20A4A2E -:108AE000C00014580A4DAC4207D113500C2359430F -:108AF000084BC91880184160B0BD02218020EDF7F5 -:108B000094FD3C007C370100B0BD000056570100C9 -:108B1000845D010009A0000018D90100F8B50F1C00 -:108B20001E1C151C041C111CFFF74AFF331C2A1CB9 -:108B3000391C201CF4F78AFFF8BD0000F7B59446F5 -:108B4000FF2921D03C00B837010015480088814238 -:108B500021D2144A154EC8008518B4796868026895 -:108B6000002A03D1031D0CCB9A4211D043689A68A6 -:108B700042600E4A176901371761B4710022026022 -:108B80000098D86060463C00F43701001860197402 -:108B900028685860FEBDB471062100E007218020DE -:108BA000EDF74CFDF6E7000056570100845D01002B -:108BB00020100700A8600100B0B5144D6C68002CAF -:108BC00001D0844204D00C213C00303801008020C8 -:108BD000EDF737FDB0BDFFF7B8FAA168401A0D49AF -:108BE000884203DA10218020EDF72BFD21792268DD -:108BF0000120FFF7ACFFE3686B60002B05D007484E -:108C0000064A00889968FFF7FEFA3C006C380100BC -:108C10002868E0602C60B0BD7C5D010018FCFFFF9F -:108C2000213801002C740100B0B5154C0820211C1E -:108C300080310870134A4104116013480068134DD5 -:108C40006B69184001D1102000E000203C00A838DA -:108C50000100A8235B5D1843231C40331873516047 -:108C600020788008800020700020FFF712FBFFF7BB -:108C700072FA643028660138A06120780321084325 -:108C80002070B0BD000000900700001007003C00FD -:108C9000E438010010000700A46C010038B50A4C4C -:108CA000211C20318A7900AB1A70C979074D59709F -:108CB0006978884203D1F8F713FCFF20687000AB95 -:108CC0001888E08438BD0000001007004C7B0100CC -:108CD0003C0020390100F8B50B1C061C041D7F3335 -:108CE00014D033685D18356023881F180623FF569B -:108CF000EB1B336023881818817120880130000431 -:108D0000000C2080904201D300202080101C31688C -:108D1000ECF73C005C3901006DFEF8BD0E490A7CA1 -:108D200083781A430A74427883789A430B7C93437E -:108D30000B748A7C43781A438A748A7C03789A433A -:108D40008A74027843781A434B7C1A434A744A7CEB -:108D5000C07882433C00983901004A747047100083 -:108D60000700B0B5064D00242006000EEDF7F7F819 -:108D7000A100695808710134042CF5DBB0BD107BEB -:108D800001000B480C497D234269DB00002AC86BB7 -:108D900007D0C0181A013C00D43901009042C863C2 -:108DA00001D90748C8637047FF38F538C86398424F -:108DB000F9D2CB6370470000F4680100447D0100E4 -:108DC0007017000070B50D1C041C161CFBF7F6FA9A -:108DD000B0432843011C201C3C00103A010000F065 -:108DE000CCFA70BD000080B50B4A002909D00229D9 -:108DF0000FD1011C0848D2783830FFF778FF0649B8 -:108E000006E0011C044812792030FFF770FF034987 -:108E1000086080BD0000AC7C01003C004C3A0100C1 -:108E2000C8670100C467010080B50B4A002909D05A -:108E300002290FD1011C084852796830FFF75AFF08 -:108E4000064906E0011C044892795030FFF752FFB2 -:108E50000349086080BD0000AC7C01003C00883AFA -:108E60000100D0670100CC67010008B50421009122 -:108E7000817E4368032906D1011C0C3101206A461A -:108E8000ECF79AFC08BD1968C160FBE7000010B55B -:108E9000031C0020084C0021CA00121992783C00E3 -:108EA000C43A01009A4203D1C8000019406810BDBD -:108EB0000131090609160629F1DB10BDCC5A010063 -:108EC000F8B50F1C161C0025FEF78EF9041C0AD0FD -:108ED0004A20005D052806D1381CF1F781FE0028E4 -:108EE0003C00003B010001D001253460281CF8BD86 -:108EF000000070B50D1C161C0024FEF778F9002840 -:108F00000BD04A21095C052907D10169002904D148 -:108F10003060F1F704FD01242860201C70BDF8B515 -:108F2000061C3C003C3B010000250C1C081CF1F712 -:108F30005DFE002801D0002105E0201CF1F774FE41 -:108F4000002814D00121301CF4F780FB0090002889 -:108F50000DD0084F01250622311C381CECF7C2FC4D -:108F60000622211C3C00783B0100B818ECF7BDFC40 -:108F70000098F860281CF8BD0000707C01000021FA -:108F8000002806D04278072A03D1C079012800D1F1 -:108F90000121081C7047F8B5051C0027164EF1F793 -:108FA00028FE002807D03C00B43B0100F1F7C0FBCD -:108FB000002810D10024F1F7BBFC06E0F1F702FE17 -:108FC000002808D00124F1F799FD011C0622301C6D -:108FD000ECF78EFC0127002F0DD0211C281CF4F784 -:108FE0003BFB011C054806223C00F03B0100063813 -:108FF000C160291CECF77FFC0120F8BD0020FCE7D4 -:109000000000767C0100F0B5071C006802210468AE -:10901000786987B00140002500290591744E12D06F -:1090200022880121130502D4C0073C002C3C01001A -:10903000C11701316F480029006801D0013004E0F8 -:109040001106890E2D2901D1033030602088800758 -:1090500067D17869C00764D503AA04A9201CF7F773 -:109060004BFB00AB187C002807D0187C3C00683C08 -:109070000100022858D1187B4007400F042853D81C -:1090800020790599C007C01701300290002902D14C -:109090000298002848D10599002904D020880005AD -:1090A00001D400203060C020EDF7CBFD051C3C0052 -:1090B000A43C0100201C0A300690FEF7ADF8061C07 -:1090C000281C08302388021D111DDB0506D5069BD0 -:1090D0000360201C10301060201D0EE0231D136063 -:1090E0002288920505D5221C10320260069B0B6077 -:1090F0003C00E03C010004E0069B0360201C1030B3 -:1091000008602869F1F743FC002808D0012812D034 -:10911000022858D100AB187C002854D112E000ABD3 -:10912000187C02280BD1002E4DD04B20805D0228E8 -:1091300049D13C001C3D010007E063E000AB187C16 -:10914000002802D1381CFEF71BFF2088410430485C -:1091500011D5002E52D000AB197C002926D00299DF -:10916000002902D0B06A007800E0007801281DD004 -:10917000032843D13C00583D01001AE000AB197CA4 -:10918000022916D1197B042913D0197B0C2910D080 -:109190002249096800290CD0002E0AD00299002922 -:1091A00002D0B06A007800E00078012829D00328B6 -:1091B00027D02822391C3C00943D0100281C88300F -:1091C000ECF70AFC00AB197C281C80300171197B7C -:1091D00041716C606E611BE00599002914D0114843 -:1091E000846C002C10D00022002E04D04036B07ABF -:1091F000052800D1012200923C00D03D0100F87A00 -:10920000BA7A2969C307DB0F0698ECF700FB281C24 -:10921000EDF707FD0025281C07B0F0BD0000C46A6B -:1092200001006861010028610100C469010080B586 -:109230000220FFF770F880BD00003C000C3E0100EA -:10924000B0B51D4D012817D0A22806D0A32803D100 -:1092500001211520FFF708FCB0BD002901D11748F6 -:1092600002E07D20C000484300230122011C286049 -:109270001520FFF7A7FCB0BD012904D03C00483EF3 -:1092800001000229FAD100F02AF8B0BD6C68F5F7A8 -:10929000DEFCFEF7A8FF6860002C09D029680A23CD -:1092A0005943001B884203D901211520EDF717FA15 -:1092B000012215202968FFF7A6FBB0BD00003C0085 -:1092C000843E0100047901000087930301200449D2 -:1092D000400380B5086003211520EDF703FA80BD37 -:1092E00000100700074880B5BE210173017A1022E3 -:1092F000114301720023022215200349FFF768FC85 -:109300003C00C03E010080BD000000030700809FBC -:10931000D50080B5002803D00A1C1521A22002E048 -:1093200000221521A320FFF766FC80BD000010B5C8 -:1093300000F019F80A48BE210173037A1022934302 -:1093400001243C00FC3E0100234303720173017AB7 -:109350009143202211430172022215200249FFF796 -:109360005BFB10BD00030700809FD50080B5022184 -:109370001520FFF785FB0448BE210173017A1122F5 -:10938000914301723C00383F010080BD00000003A2 -:109390000700F8B5061C051C60360027446822E06B -:1093A00008210020EDF741FB6061018904390904BF -:1093B000090C01816069006840180421EDF735FB54 -:1093C000E0616069717B3C00743F010000688901C5 -:1093D000C17029690C310322ECF7BAFA28690C3004 -:1093E0000168013101602562A7612468002CDAD18F -:1093F000024903486A68F6F7B3F8F8BDFD6B000050 -:10940000A06A010080B500073C00B03F01000009E0 -:109410000902090A084302490860FFF720FF80BDDE -:1094200000006000070008001400C8000000E80306 -:10943000000010001400C8000000E80300001C0039 -:109440001400C8000000E80300003C00EC3F0100ED -:109450002401070032000000E8030000400601007C -:109460000600000007000000416E62697E64616FC3 -:109470006F00000052656C6561736520365F375F71 -:109480003135204275696C6420323A353C00284001 -:1094900001003239382053657020303420323030AA -:1094A000392031373A31333A3230202848573D3469 -:1094B0003A332C4254434F455829000000003200F3 -:1094C0001C00102030405060FFFFFFFFFFFF3C00FA -:1094D00064400100000000000100000001000000E5 -:1094E00000000000E8037000000000000100000020 -:1094F0000000000002000000D0073800000000005B -:109500000100000001000000040000007C151500AF -:109510003C00A0400100000000000100000001002C -:1095200000000B00000070171E0001000000010089 -:109530000000000000000C000000282316000100BD -:109540000000010000000000000012000000F82AE6 -:109550000B003C00DC4001000000000001000000A6 -:109560000100000016000000E02E120001000000C3 -:1095700001000000000000001800000050460E002E -:1095800001000000010000000000000024000000B5 -:10959000F05508003C0018410100010000000000E7 -:1095A0000000010000002C000000C05D0E00010062 -:1095B0000000010000000000000030000000E88012 -:1095C0000400010000000000000001000000420053 -:1095D0000000A08C0A003C00544101000100000082 -:1095E00001000000000000004800000080BB0A00ED -:1095F0000100000001000000000000006000000009 -:10960000F0D20A000100000001000000000000008C -:109610006C000000C00090003C0090410100C000C0 -:109620009000C00090001400100014001000C00052 -:1096300090001400100014001000C00090001400EE -:109640001000C0009000140010001400100014005E -:109650001000C0009000600048003C00CC410100B8 -:109660006000480014001000140010006000480062 -:1096700014001000140010006000480014001000D6 -:1096800060004800140010001400100014001000C6 -:10969000020004010B020C03120416053C000842F0 -:1096A00001001806000E000E2407000E2C083009D9 -:1096B000000E000E000E420A000E480B000E000EB7 -:1096C000000E000E000E600C000E000E6C0D00006F -:1096D00000000000000000000080C0FFFFFF3C0011 -:1096E00044420100B6FFFFFFD3FFFFFFC9FFFFFFAA -:1096F000FFFFFF7F000000000000000000000000EE -:1097000000000000000000000000000051B0000058 -:109710000C00000051B000000C00000059AF000028 -:109720003C008042010000000000A5AF00000000E6 -:1097300000004DAF00000600000000000000000027 -:10974000000045B00000060000000000000000001E -:109750000000D5AF000000000000ADB00000000028 -:1097600000003C00BC42010095DB0000000000004E -:1097700095DB00000000000099B000000C00000024 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A000000000003C00F8420100000000002D17FE -:1097B00001003517010021170100D99C000049174D -:1097C00001003D170100D19C0000D19C00001D1A32 -:1097D0000100D19C0000011A0100311A0100251A74 -:1097E00001003D1701003C0034430100811A0100D3 -:1097F000D19C000079170100D99C00005D17010081 -:10980000A11701009517010081170100211801001F -:10981000F5170100000008000C000000100008000F -:1098200008000000010000003C007043010002003D -:109830000000040000000800000010000000191CD7 -:1098400001008941000089410000854100008541F7 -:1098500000008541000085410000894100008541EC -:10986000000085410000351B01003C00AC430100B5 -:109870009D1B0100011C010089410000894100007D -:109880008941000085410000651801002918010088 -:1098900039180100BD180100894100004D18010070 -:1098A000A518010085410000011901003C00E843B2 -:1098B0000100D9180100ED180100151901008941B6 -:1098C0000000894100008941000085410000894174 -:1098D000000089410000691C010089410000711CE1 -:1098E00001008941000089410000FDDB00003C00CF -:1098F000244401001D7C000000008000F5DA000017 -:1099000014008100FDDD000008008200C5DD0000BC -:109910003800830045DC00001000840099DC000062 -:109920000C00860039DC00001000880011DE000009 -:109930003C006044010010008A0035DD00000C008E -:109940008C00ADDF00001C008E00C9DE0000380076 -:109950008F00EDDC00003800900075DF00000C0087 -:1099600091008DDC00000C009300B9DD00000C00BC -:1099700094003C009C44010000080808100C0C0CEA -:10998000080C080C080C0808080814080814003013 -:109990000001010200000000AD300100153001009F -:1099A00020300700303007000607020300000000E7 -:1099B000000000003C00D8440100FFFFFF00FFFF53 -:1099C000FF00FFFFFF000000000080C90200943F7D -:1099D0000300E08B5A00053A8500C8F20600F84CF7 -:1099E000560020A73D00B74A0000B74A000000001B -:1099F0000000000000003C001445010001010102CC -:109A00000202030303040404050600002D7C000089 -:109A10000000FF00FD9500000800FF00ED9700002A -:109A200008008200CD9500000C0083004D960000D8 -:109A30000C0085002D7C00003C005045010000001A -:109A4000FF002D7C00000000FF002D7C00000000C6 -:109A5000FF003D9600000C008900D9970000080027 -:109A60008A00919500000800FF002D7C0000000096 -:109A7000FF002D7C00000000FF003C008C45010031 -:109A8000F997000008008D002D7C00000000FF0009 -:109A90002D7C00000000FF00C997000030009000FE -:109AA0001195000018009100159600000800920022 -:109AB000599500003C009300299600003C00C845E1 -:109AC000010008009400A19500000800950081970E -:109AD00000000C0096006D97000010009800000038 -:109AE00000000000FF00000000000000FF00000870 -:109AF00008080808000000100800000800103C00DA -:109B000004460100080C0C0C0C1C0C0C0800000096 -:109B10000D8B0000F58A0000E98A0000018B00002F -:109B200014080C0C100C0000B1980000800000001C -:109B300019990000810000003D7C000080000000B9 -:109B40003C00404601003D99000082000000099958 -:109B50000000830000003D7C000085000000000044 -:109B6000000000000102020104040808813780F3AC -:109B7000AAAA03000000AAAA030000F86DA96DA913 -:109B80006EA93C007C4601006EA86EA86EA86FA767 -:109B90006FA76FA76FA66FA670A670A570A4000030 -:109BA000B51B0100C91B0100E11B0100E59C000081 -:109BB000A51B0100E59C0000891B0100D59C00004D -:109BC000D59C00003C00B8460100D11A0100E51AFE -:109BD0000100051B0100251B0100B11A0100E59CD5 -:109BE00000009D1A0100D59C0000C11A01008919CE -:109BF0000100A9190100C9190100F1190100791921 -:109C00000100E59C00003C00F446010065190100DC -:109C1000D59C0000D59C0000D59C0000D59C000080 -:109C2000D59C0000D59C0000D59C0000551C01006F -:109C3000451C0100451C0100D59C0000D59C00007E -:109C4000D59C0000D59C00003C0030470100D59C0D -:109C5000000055190100E59C00004119010031196F -:109C60000100D59C000002050A00000002040A0061 -:109C70000000C5200000212100002521000039211D -:109C8000000049210000552100003C006C47010004 -:109C900061210000ED2100000D22000021220000C2 -:109CA0003D22000049220000C5220000E122000000 -:109CB000F5220000E91F0000E91F0000E91F000075 -:109CC000E91F0000E91F0000112300003C00A84725 -:109CD00001001D23000089230000A5230000B923F3 -:109CE0000000112000001D2000006D2000008D20CC -:109CF0000000B92000000001020303050606080960 -:109D000008090909C480CA8080808080D0803C0016 -:109D1000E4470100D6D9DCDFE2808080E5E880807E -:109D20008080EBEEF1F4F7FAFD0001000200030081 -:109D30000400050006000700080009000A000B00E7 -:109D40000C000E00100011001300160018001B007C -:109D50003C00204801001E00220026002B0030009D -:109D600036003C0044004C0055005F006B0078005A -:109D700086009700A900BE00D500EF00FF7F0C0011 -:109D8000060002000000FEFFFCFFFBFFFAFFF9FFE8 -:109D9000F8FF3C005C480100F7FFF6FFF5FFF4FF19 -:109DA000F3FFF2FFF1FFF0FFEFFFEEFFEDFFECFF3F -:109DB000EBFFEAFFE9FFE8FFE7FFE6FFE5FFE4FF6F -:109DC000E3FFE2FFE1FFE0FFDFFFDEFFDDFFDCFF9F -:109DD000DCFF00003C00984801000000000000008B -:109DE0000000B17C4100115A40E2B27C4100055AAA -:109DF00040E2AF7C4100F95940E2B07C4100ED59AE -:109E000040E2246701000E0000E35C6701000E00E1 -:109E100000E30A6101003C00D4480100010000E3B6 -:109E20000E610100010000E3326701000E0000E353 -:109E30006A6701000E0000E30B610100010000E30E -:109E40000F610100010000E3406701000E0000E324 -:109E5000786701000E0000E33C00104901000C612E -:109E60000100010000E310610100010000E34E6702 -:109E700001000E0000E3866701000E0000E30D61A3 -:109E80000100010000E311610100010000E3C0488E -:109E900001000400000AE04801003C004C490100B8 -:109EA0000400000A004901000400000A20490100E2 -:109EB0000400000A18670100040000E2287501018F -:109EC0007DA940E22C750100040000E2207501002C -:109ED000040000E244750100040000E23C008849EF -:109EE0000100F0590100040000E200000000000041 -:109EF00000000000000000000000247501000400C4 -:109F000000E2B87C0100040000E28DA9000001001D -:109F100000DA1D750100010000E2C46701003C0089 -:109F2000C4490100040000E200000000000000003D -:109F3000215900000E0000D9C8670100040000E2AA -:109F4000CC670100040000E2D0670100040000E2D9 -:109F500065D90000040000DAA5D90000040000DA89 -:109F60003C00004A010001590000010000DA32679C -:109F700001000E0000E36A6701000E0000E31159C2 -:109F80000000010000DA0000000000000000B048FE -:109F900001000200000AA04801000200000A404936 -:109FA00001003C003C4A01000500000A684901002C -:109FB0000900000A6C570100040000E2386101004A -:109FC000040000E20000000000000000AC6E010090 -:109FD000040000E2B06E0100040000E270570100CE -:109FE000040000E23C00784A0100E8590100080042 -:109FF00000E3DC5801144DFD40E32C59011439FDF8 -:10A0000040E3C05801000E0000E300000000000023 -:10A0100000000000000000000000647341003D2EBD -:10A0200044E27C5901143C00B44A01009D2F44E3F2 -:10A030005C5701000E0000E2792E0400010000DBF5 -:10A04000A0580100020000E3A2580100020000E352 -:10A05000A05701000E0000E3D1880100010000DAE2 -:10A060001D890100040000DA3C00F04A01009588D7 -:10A070000100040000DB312F04000E0000D9C52EC2 -:10A0800004000E0000D9686C010115D540E2C057EC -:10A090000100080000E3C8570100340000E39C6C95 -:10A0A0000100080000E3B05801033C002C4B010004 -:10A0B000E9D440E2BC580100040000E29DA3000086 -:10A0C000600000D970790100040000E27879010095 -:10A0D000040000E27C5A0100040000E25D1C000064 -:10A0E000110000D9246E0100040000E23C00684B1E -:10A0F000010018580105D5D540E3FC5701001400B4 -:10A1000000E3048E0103E5D540E3005B0100040099 -:10A1100000E2185B0100400000E2D4670100040087 -:10A1200000E28D370000040000DBBD3600003C007B -:10A13000A44B0100040000DBFC600100020000E20F -:10A14000907D0100040000E270690100040000E25B -:10A150000000000000000000B04901001A00000AE1 -:10A16000904B01000600000AA458810005FD40E361 -:10A170003C00E04B0100804A01000C00000A0C5A30 -:10A180008101252D44E3E04A01000300000A186321 -:10A190004100FDBB40E208570100010000E29C487D -:10A1A0000100040000E20000000000000000F84A86 -:10A1B00001003C001C4C01000200000ACC740100AC -:10A1C000030000E365734100A92E44E2F659010142 -:10A1D000D12C44E3084B01000400000A07000000F2 -:10A1E0000100006A284B01000200000A887D01007E -:10A1F000040000E23C00584C010000750104656F4A -:10A2000040E3BC7801000E0000E3384B010004007D -:10A21000000A0457010004000062584B01000200CC -:10A22000000A804B01000200000A684B0100030095 -:10A23000000A8C7D01003C00944C0100040000E207 -:10A24000392D0400040000DB947D0100040000E2CD -:10A2500000000000000000000000000000000000FE -:10A260000000000000000000104001000000006439 -:10A27000A84C01000400000A3C00D04C0100000082 -:10A28000000000000000C84C01000100000AD04C92 -:10A2900001000200000A0000000000000000E77A50 -:10A2A0000100010000E2E87A0100010000E2000084 -:10A2B000000000000000ED7A01003C000C4D0100A0 -:10A2C000010000E2EE7A0100010000E2000000005F -:10A2D00000000000F37A0100010000E2F47A0100BE -:10A2E000010000E20000000000000000F97A010017 -:10A2F000010000E2FA7A0100010000E23C00484D52 -:10A300000100E84C01000300000A004D01000300B9 -:10A31000000A184D01000300000A304D010003003F -:10A32000000A905C0100040000E2945C010004005B -:10A3300000E2985C0100040000E29C5C01003C002B -:10A34000844D0100040000E2A05C0100040000E272 -:10A35000A45C0100040000E2A85C0100040000E22B -:10A36000AC5C0100040000E2B05C0100040000E20B -:10A37000B45C0100040000E2B85C0100040000E2EB -:10A380003C00C04D0100BC5C0100040000E2C05C68 -:10A390000100040000E2C45C0100040000E2905CE3 -:10A3A0000100380000E3684D01000E00000AD84D9E -:10A3B0000100020000FA1261810131D540E306611B -:10A3C00001003C00FC4D0100020000E20B610100B5 -:10A3D000010000E30F610100010000E308610100DA -:10A3E000020000E2507B0100040000E200000000D7 -:10A3F00000000000384E01000E0000649C5701016F -:10A40000918841E33C00384E01006E41676FE26580 -:10A4100060696F20414200000000F04D010009001A -:10A42000000A484E01000100000AE84D0100010049 -:10A43000000A0000000000000000484D0100040078 -:10A44000000A286101013C00744E0100BDD540E2C4 -:10A450006961410085D540E230610100040000E2FD -:10A4600034610100040000E23C610100040000E2EC -:10A4700034610100040000E244610100040000E2D4 -:10A48000000000000400006A3C00B04E0100704E65 -:10A4900001000800000A18610100020000E21C61CE -:10A4A0000100040000E220610100020000E22461DA -:10A4B0000100040000E2B84E01000200000AC84E8C -:10A4C00001000200000AD84E01003C00EC4E0100E1 -:10A4D0000200000A96480100060000E3E062010065 -:10A4E000040000E2000000000400006A9B7D0100FF -:10A4F000010000629C7D010002000062607C01009E -:10A50000040000E2010000000400006A3C00284F43 -:10A5100001002D6301000100006200000000000046 -:10A520000000000000000000000049D500000E00FF -:10A5300000D9F467010002000062467D01000100BD -:10A5400000629C7C0100040000E2987C01003C0059 -:10A55000644F010002000062A07C0100060000625E -:10A56000587C010002000062647C01000600006269 -:10A570005A7C0100020000626A7C01000600006251 -:10A58000010000000400006AE4620100040000E22F -:10A590003C00A04F0100E8620100030000E200005F -:10A5A00000000400006A000000000400006A0100CE -:10A5B00000000400006A000000000400006A0000BF -:10A5C00000000400006A000000000400006A0000AF -:10A5D00000003C00DC4F01000400006A00000000A5 -:10A5E0000400006A000000000400006A000000008F -:10A5F0000400006A000000000400006A000000007F -:10A600000400006A000000000400006A000000006E -:10A610000400006A3C001850010000000000040023 -:10A62000006A000000000400006A0000000004004E -:10A63000006A000000000400006A0000000004003E -:10A64000006AF04E01002A00000A01000000040028 -:10A65000006A752A01003C00545001000C0000DB28 -:10A66000020000000400006A752A01000C0000DBF3 -:10A67000030000000400006A752A01000C0000DBE2 -:10A68000040000000400006A752A01000C0000DBD1 -:10A69000050000000400006A3C0090500100752A8B -:10A6A00001000C0000DB060000000400006A752AAF -:10A6B00001000C0000DB070000000400006A752A9E -:10A6C00001000C0000DB080000000400006A752A8D -:10A6D00001000C0000DB090000003C00CC50010030 -:10A6E0000400006A752A01000C0000DB0A0000006B -:10A6F0000400006A752A01000C0000DB0B0000005A -:10A700000400006A752A01000C0000DB0C00000048 -:10A710000400006A752A01000C0000DB3C000851AF -:10A7200001000D0000000400006A752A01000C0001 -:10A7300000DB0E0000000400006A752A01000C0016 -:10A7400000DB485001000200000A585001000200DE -:10A75000000A685001000200000A785001003C0025 -:10A76000445101000200000A885001000200000A62 -:10A77000985001000200000AA85001000200000ADF -:10A78000B85001000200000AC85001000200000A8F -:10A79000D85001000200000AE85001000200000A3F -:10A7A0003C0080510100F85001000200000A0851ED -:10A7B00001000200000A185101000200000A405086 -:10A7C00001000100000AE84E01000100000A00003B -:10A7D0000000000000000000000000000000B04E7B -:10A7E00001003C00BC5101000100000A0000000013 -:10A7F00000000000285101000E00000A00000000C7 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A82000000000003C00F8510100985101000C00AC -:10A83000000A504E01000400000AE04C0100010033 -:10A84000000A0000000000000000C04B01001D00D5 -:10A85000000AF85101000500000A248007000000EA -:10A8600000001D8007003C00345201000800000079 -:10A870002A8007005C00000024800700020000001E -:10A880001D800700200000002A8007006A000000E9 -:10A8900024800700020000001D8007002000000047 -:10A8A0002A8007006A0000003C007052010000018D -:10A8B00002030405060708090A0B0C0D0E0F101100 -:10A8C00012131415161718191A1B1C1D1E1F0163CD -:10A8D0000000A1630000C5630000B1620000C56311 -:10A8E0000000216300004D6300003C00AC520100F9 -:10A8F000A163000001630000A163000006050505D7 -:10A9000005050505050505050505030506070809EF -:10A910000A0A0C0D0E0F0F1011000000A5C684F8D6 -:10A9200099EE8DF60DFFBDD6B1DE54913C00E85294 -:10A93000010050600302A9CE7D5619E762B5E64DCD -:10A940009AEC458F9D1F408987FA15EFEBB2C98EAF -:10A950000BFBEC4167B3FD5FEA45BF23F75396E479 -:10A960005B9BC2751CE1AE3D6A4C5A6C417E3C005B -:10A970002453010002F54F835C68F45134D108F987 -:10A9800093E273AB53623F2A0C08529565465E9D75 -:10A990002830A1370F0AB52F090E36249B1B3DDF47 -:10A9A00026CD694ECD7F9FEA1B129E1D74582E3412 -:10A9B0003C00605301002D36B2DCEEB4FB5BF6A424 -:10A9C0004D7661B7CE7D7B523EDD715E9713F5A665 -:10A9D00068B900002CC160401FE3C879EDB6BED451 -:10A9E000468DD9674B72DE94D498E8B04A856BBB2C -:10A9F0002AC53C009C530100E54F16EDC586D79A49 -:10AA000055669411CF8A10E9060481FEF0A04478BF -:10AA1000BA25E34BF3A2FE5DC0808A05AD3FBC21A1 -:10AA2000487004F1DF63C17775AF634230201AE5E7 -:10AA30000EFD6DBF3C00D85301004C811418352623 -:10AA40002FC3E1BEA235CC88392E5793F25582FC34 -:10AA5000477AACC8E7BA2B3295E6A0C09819D19EC8 -:10AA60007FA366447E54AB3B830BCA8C29C7D36B50 -:10AA70003C2879A7E2BC3C00145401001D1676ADB9 -:10AA80003BDB56644E741E14DB920A0C6C48E4B82F -:10AA90005D9F6EBDEF43A6C4A839A43137D38BF2B6 -:10AAA00032D5438B596EB7DA8C0164B1D29CE04940 -:10AAB000B4D8FAAC07F325CF3C0050540100AFCA1C -:10AAC0008EF4E9471810D56F88F06F4A725C24380D -:10AAD000F157C773519723CB7CA19CE8213EDD96AB -:10AAE000DC61860D850F90E0427CC471AACCD890C1 -:10AAF000050601F7121CA3C25F6A3C008C540100DA -:10AB0000F9AED06991175899273AB92738D913EB7C -:10AB1000B32B3322BBD270A98907A733B62D223CB1 -:10AB2000921520C94987FFAA78507AA58F03F85952 -:10AB30008009171ADA6531D7C684B8D03C00C854EA -:10AB40000100C382B029775A111ECB7BFCA8D66DB9 -:10AB50003A2CC6A5F884EE99F68DFF0DD6BDDEB170 -:10AB6000915460500203CEA9567DE719B5624DE6B7 -:10AB7000EC9A8F451F9D8940FA87EF15B2EB3C0098 -:10AB8000045501008EC9FB0B41ECB3675FFD45EA3C -:10AB900023BF53F7E4969B5B75C2E11C3DAE4C6A44 -:10ABA0006C5A7E41F502834F685C51F4D134F90848 -:10ABB000E293AB7362532A3F080C955246659D5E43 -:10ABC0003C0040550100302837A10A0F2FB50E096F -:10ABD00024361B9BDF3DCD264E697FCDEA9F121B9D -:10ABE0001D9E5874342E362DDCB2B4EE5BFBA4F6F9 -:10ABF000764DB7617DCE527BDD3E5E711397A6F533 -:10AC0000B9683C007C5501000000C12C4060E31F86 -:10AC100079C8B6EDD4BE8D4667D9724B94DE98D410 -:10AC2000B0E8854ABB6BC52A4FE5ED1686C59AD7B5 -:10AC3000665511948ACFE9100406FE81A0F078448D -:10AC400025BA4BE33C00B8550100A2F35DFE80C07D -:10AC5000058A3FAD21BC7048F10463DF77C1AF7551 -:10AC600042632030E51AFD0EBF6D814C1814263565 -:10AC7000C32FBEE135A288CC2E39935755F2FC8202 -:10AC80007A47C8ACBAE73C00F4550100322BE69590 -:10AC9000C0A019989ED1A37F4466547E3BAB0B8322 -:10ACA0008CCAC7296BD3283CA779BCE2161DAD76A8 -:10ACB000DB3B6456744E141E92DB0C0A486CB8E4FD -:10ACC0009F5DBD6E43EFC4A63C003056010039A81D -:10ACD00031A4D337F28BD5328B436E59DAB7018C5E -:10ACE000B1649CD249E0D8B4ACFAF307CF25CAAF1F -:10ACF000F48E47E910186FD5F0884A6F5C723824DB -:10AD000057F173C79751CB23A17C3C006C560100CF -:10AD1000E89C3E2196DD61DC0D860F85E0907C424B -:10AD200071C4CCAA90D80605F7011C12C2A36A5FB1 -:10AD3000AEF969D0179199583A2727B9D938EB134A -:10AD40002BB32233D2BBA970078933A73C00A85686 -:10AD500001002DB63C221592C9208749AAFF5078E0 -:10AD6000A57A038F59F809801A1765DAD73184C696 -:10AD7000D0B882C329B05A771E117BCBA8FC6DD600 -:10AD80002C3A0400000000000000010000003C001C -:10AD9000E45601000200000003000000050000006E -:10ADA000000000000100000002000000030000009D -:10ADB00004000000010000000172657145727252CA -:10ADC0006561736F6E000000010000000500000067 -:10ADD0003C0020570100C48E0100249A01000000AD -:10ADE000000030000000249A0100A4B2010000001D -:10ADF00000006C000000A4B2010014C801000000B3 -:10AE00000000C00000001020304050BB30000100A6 -:10AE100000003C005C5701001416181A1C1E20226A -:10AE20002426282A2B2C01007017000001000000A6 -:10AE30000D250000413F0100652901000D2500009E -:10AE4000F55E0000413F0100413F010002040B0C90 -:10AE5000121618243C00985701003048606C01001D -:10AE60000000101010101010101010101010101002 -:10AE700000006400000001000000FFFFFFFF010070 -:10AE80000000000210121100000118000000020072 -:10AE90000000010000003C00D45701000000000049 -:10AEA000000000000200000004000000000000009C -:10AEB00000000000E093040040420F00000000008A -:10AEC0000100000000800000DF40CFFD0040830053 -:10AED00000000000010200003C00105801000000CA -:10AEE0000000000000000000000040008081000021 -:10AEF0008000BFFF7F7E0102000000000000000014 -:10AF0000000001000000786F010000000000B86F31 -:10AF1000010000000000F86F01003C004C580100E7 -:10AF2000000000003870010000000000787001008F -:10AF300000000000B870010000000000F87001007F -:10AF4000000000003871010000000000787101006D -:10AF50000001000090710100000100003C008858D1 -:10AF60000100A87101000001000000050A01060BA4 -:10AF700002070C03080D040900000303010100048B -:10AF800000040406161E1F0000000000000100005F -:10AF900080000000000000FFFFFF181818183C0098 -:10AFA000C458010018181818181818181818000094 -:10AFB000618B4A00618F4A00618B4A0005E3C00043 -:10AFC00005CBC00005BBC00085BAC00085A2C0008B -:10AFD0008592C000858AC000857AC0004589C0007E -:10AFE0003C00005901004571C0004569C000456141 -:10AFF000C0004559C0004551C0004549C000454109 -:10B00000C0004539C0004531C0004529C000452178 -:10B01000C000602D0600602D0600602D0600602D2A -:10B0200006003C003C590100602D06006028060027 -:10B030005026060050210600501F0600501C060036 -:10B04000501A06005018060050160600501406004C -:10B050005012060050100600500E0600500C06005C -:10B06000500A06003C00785901002B0B06001D75A4 -:10B07000C0001D75C0001D75C0001D75C0001D7588 -:10B08000C0001D75C0001D6DC000DD5BC000DD4B44 -:10B09000C000DD43C000DD3BC000DD33C000DD2B60 -:10B0A000C000DD23C0003C00B4590100DD1BC0001E -:10B0B000DD13C000DD13C000DD13C000DD13C000D0 -:10B0C000DD13C000050505040403030202010100AD -:10B0D000000005050504040303020201010000004D -:10B0E00000000000881300003C00F0590100070038 -:10B0F000000080005B004002E0FDF200B8FCA4010B -:10B1000000000F0000000F000000030B9F5F07010D -:10B110002A04210417040E040404FB03F103E803CA -:10B12000C903AA038A036B034C033C002C5A010099 -:10B130002D030E03EE02EC02010316032B03400362 -:10B1400055036A037F039403A903BE03D303E803F3 -:10B15000BE0394036A030002040607090A0B0C0DE0 -:10B160001010101010101010101000033C00685A3E -:10B17000010005080B0E1010101010101010101008 -:10B18000101010100000010000000100000000007D -:10B1900000000000000000000000000000000000AF -:10B1A00000000000000000000000000000003C0063 -:10B1B000A45A010000000000000000000000000090 -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F0003C00E05A010000000000000000000000D8 -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B2300000003C001C5B010000000000000000005A -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B27000000000003C00585B0100000000000000DE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B0000000000000003C00945B01000000000062 -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F00000000000000000003C00D05B01000000E6 -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000003C000C5C010068 -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B370000000000000000000000000003C00485CED -:10B3800001000000000000000000000000000000BC -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B00000000000000000000000000000003C0051 -:10B3C000845C01000000000000000000000000009C -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B400003C00C05C010000000000000000000000E3 -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000003C00FC5C0100000000000000000067 -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B48000000000003C00385D0100000000000000EA -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C0000000000000003C00745D0100000000006E -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B5000000000000000000003C00B05D01000000F1 -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B54000000000000000000000003C00EC5D010075 -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B580000000000000000000000000003C00285EF9 -:10B5900001000000000000000000000000000000AA -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C00000000000000000000000000000003C003F -:10B5D000645E0100000000000000000000000000A8 -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B610003C00A05E010000000000000000000000EF -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000003C00DC5E0100000000000000000073 -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B69000000000003C00185F0100000000000000F6 -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D0000000000000003C00545F0100000000007A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B7100000000000000000003C00905F01000000FD -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B75000000000000000000000003C00CC5F010081 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B790000000000000000000000000003C00086005 -:10B7A0000100000000000000000000000000000098 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D00000000000000000000000000000003C002D -:10B7E00044600100000000000000000000000000B4 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820003C008060010000000000000000000000FB -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000003C00BC60010000000000000000007F -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A000000000003C00F860010000000000000003 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000003C00346101000000000086 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B9200000000000000000003C0070610100000009 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B96000000000000000000000003C00AC6101008D -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000003C00E86112 -:10B9B0000100000000000000000000000000000086 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E00000000000000000000000000000003C001B -:10B9F00024620100000000000000000000000000C0 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30003C00606201000000000000000000000007 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000003C009C62010000000000000000008B -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB000000000003C00D86201000000000000000F -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000003C00146301000000000092 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB300000000000000000003C0050630100000015 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB7000000000000000000000003C008C63010099 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000003C00C8631E -:10BBC0000100000000000000000000000000000074 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF00000000000000000000000000000003C0009 -:10BC000004640100000000000000000000000000CB -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC40003C00406401000000000000000000000013 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000003C007C640100000000000000000097 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC000000000003C00B86401000000000000001B -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000003C00F4640100000000009E -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000003C0030650100000021 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD8000000000000000000000003C006C650100A5 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000003C00A8652A -:10BDD0000100000000000000000000000000000062 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE000000000000000000000000000000003C00F6 -:10BE1000E4650100000000000000000000000000D8 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE50003C0020660100000000000000000000001F -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000003C005C6601000000000000000000A3 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED000000000003C009866010000000000000027 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000003C00D466010000000000AA -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000003C001067010000002D -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF9000000000000000000000003C004C670100B1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000003C00886736 -:10BFE0000100000000000000000000000000000050 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C0100000000000000000000000000000003C00E4 -:10C02000C4670100000000000000000000000000E4 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C060003C0000680100000000000000000000002B -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A00000003C003C6801000000000000000000AF -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E000000000003C007868010000000000000033 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C120000000000000003C00B468010000000000B6 -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000003C00F068010000003A -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000003C002C690100BD -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E0000000000000000000000000003C00686942 -:10C1F000010000000000000000000000000000003E -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C2200000000000000000000000000000003C00D2 -:10C23000A4690100000000000000000000000000F0 -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C270003C00E06901000000000000000000000038 -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B00000003C001C6A01000000000000000000BB -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000003C00586A01000000000000003F -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C330000000000000003C00946A010000000000C2 -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000003C00D06A0100000046 -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000003C000C6B0100C9 -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F0000000000000000000000000003C00486B4E -:10C40000010000000000000000000000000000002B -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000003C00C0 -:10C44000846B0100000000000000000000000000FC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C480003C00C06B01000000000000000000000044 -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C00000003C00FC6B01000000000000000000C8 -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000003C00386C01000000000000004A -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C540000000000000003C00746C010000000000CE -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000003C00B06C0100000052 -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000003C00EC6C0100D6 -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C600000000000000000000000000003C00286D59 -:10C610000100000000000000000000000000000019 -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000003C00AE -:10C65000646D010000000000000000000000000008 -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C690003C00A06D01000000000000000000000050 -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D00000003C00DC6D01000000000000000000D4 -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C71000000000003C00186E010000000000000056 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C750000000000000003C00546E010000000000DA -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C7900000000000000000003C00906E010000005E -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D000000000000000000000003C00CC6E0100E2 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000003C00086F65 -:10C820000100000000000000000000000000000007 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000003C009C -:10C86000446F010000000000000000000000000014 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0003C00806F0100000000000000000000005C -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E00000003C00BC6F01000000000000000000E0 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C92000000000003C00F86F010000000000000063 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C960000000000000003C003470010000000000E6 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A00000000000000000003C007070010000006A -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E000000000000000000000003C00AC700100EE -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000003C00E87072 -:10CA300001000000000000000000000000000000F5 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000003C008A -:10CA70002471010000000000000000000000000020 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0003C00607101000000000000000000000068 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF00000003C009C7101000000000000000000EC -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB3000000000003C00D87101000000000000006F -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB70000000000000003C001472010000000000F2 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB00000000000000000003C0050720100000076 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF000000000000000000000003C008C720100FA -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC30000000000000000000000000003C00C8727E -:10CC400001000000000000000000000000000000E3 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000003C0078 -:10CC8000047301000000000000000000000000002C -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0003C00407301000000000000000000000074 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD000000003C007C7301000000000000000000F7 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD4000000000003C00B87301000000000000007B -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD80000000000000003C00F473010000000000FF -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC00000000000000000003C0030740100000082 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE0000000000000000000000003C006C74010005 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE40000000000000000000000000003C00A8748A -:10CE500001000000000000000000000000000000D1 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000003C0066 -:10CE9000E474010000000000000000000000000039 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0003C00207501000000000000000000000080 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF100000003C005C750100000000000000000003 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF5000000000003C009875010000000000000087 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000003C00D4750100000000000B -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD00000000000000000003C001076010000008E -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D01000000000000000000000003C004C76010011 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D050000000000000000000000000003C00887696 -:10D0600001000000000000000000000000000000BF -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D0900000000000000000000000000000003C0054 -:10D0A000C476010000000000000000000000000045 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0003C0000770100000000000000000000008C -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000003C003C77010000000000000000000F -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D16000000000003C007877010000000000000093 -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A0000000000000003C00B47701000000000017 -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E00000000000000000003C00F077010000009B -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D22000000000000000000000003C002C7801001D -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D260000000000000000000000000003C006878A2 -:10D2700001000000000000000000000000000000AD -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A00000000000000000000000000000003C0042 -:10D2B000A478010000000000000000000000000051 -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F0003C00E07801000000000000000000000099 -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000003C001C79010000000000000000001B -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D37000000000003C00587901000000000000009F -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B0000000000000003C00947901000000000023 -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F00000000000000000003C00D07901000000A7 -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D43000000000000000000000003C000C7A010029 -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D470000000000000000000000000003C00487AAE -:10D48000010000000000000000000000000000009B -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B00000000000000000000000000000003C0030 -:10D4C000847A01000000000000000000000000005D -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D500003C00C07A010000000000000000000000A4 -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000003C00FC7A0100000000000000000028 -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000003C00387B0100000000000000AB -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C0000000000000003C00747B0100000000002F -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D6000000000000000000003C00B07B01000000B2 -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D64000000000000000000000003C00EC7B010036 -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D680000000000000000000000000003C00287CBA -:10D690000100000000000000000000000000000089 -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C00000000000000000000000000000003C001E -:10D6D000647C010000000000000000000000000069 -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710003C00A07C010000000000000000000000B0 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000003C00DC7C0100000000000000000034 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D79000000000003C00187D0100000000000000B7 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000003C00547D0100000000003B -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D8100000000000000000003C00907D01000000BE -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D85000000000000000000000003C00CC7D010042 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000003C00087EC6 -:10D8A0000100000000000000000000000000000077 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D00000000000000000000000000000003C000C -:10D8E000447E010000000000000000000000000075 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D920003C00807E010000000000000000000000BC -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000003C00BC7E0100000000000000000040 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A000000000003C00F87E0100000000000000C4 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000003C00347F01000000000047 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000003C00707F01000000CA -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA6000000000000000000000003C00AC7F01004E -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000003C00E87FD3 -:10DAB0000100000000000000000000000000000065 -:10DAC0000000000000000000000070B50125074EB6 -:10DAD000AD0375610A20FAF76CFF30688003C40F4C -:10DAE000B5610A20FAF765FF201C70BD00003C00FC -:10DAF000248001001000070070B501256D04002886 -:10DB0000104C01D0656100E0A56160682843606049 -:10DB1000A0682843A0600A20FAF74EFF0126B6034A -:10DB200066610A20FAF748FFA6610120FAF744FF70 -:10DB30003C0060800100A068A843A06060682843A2 -:10DB400060600A20FAF73BFF70BD1000070070B557 -:10DB50000125104C6D046561606828436060A06811 -:10DB60002843A060EE08A6610A20FAF728FF666144 -:10DB70000A203C009C800100FAF724FFA5610A20DE -:10DB8000FAF720FFA6610A20FAF71CFFA068A84355 -:10DB9000A06060682843606070BD0000100007004E -:10DBA00070B501250E4C6D04A56160682843606066 -:10DBB000A06828433C00D8800100A060EE086661A0 -:10DBC0000A20FAF702FF65610A20FAF7FEFEA66155 -:10DBD0000A20FAF7FAFEA068A843A060606828430C -:10DBE000606070BD00001000070070B5051C0024C7 -:10DBF0008026281C30403C0014810100FFF788FF7C -:10DC00006806050E0134082CF6DBFFF76DFF70BDCA -:10DC100080B5021C0B218020FBF73EFB80BD00007D -:10DC2000F8B512480025071CFF37061D0137281CD0 -:10DC3000F9F7EAFD041C17D03C005081010020696F -:10DC4000002804D0E06A002803D00020E062251CF0 -:10DC5000F0E77B68002B05D0321C211C44310120E9 -:10DC6000E8F734F9201C4430F9F737FEE2E7F8BD55 -:10DC7000000020F70100114870B53C008C810100C4 -:10DC80000068FF281DD1FF203230FAF7A7FE0E4DA5 -:10DC90006C680E48FAF7A2FE6868241A012000F0AA -:10DCA00095FD6E680948FAF799FE6868211C0A39E3 -:10DCB000301A884202D30A34A04202D93C00C881FB -:10DCC0000100002000F085FD70BDF4740100000328 -:10DCD00007009303000070B500F04DF80120EDF748 -:10DCE00034F9114D182168600020E9F7F2F9286035 -:10DCF00004688020208000260622FF21201D3C0091 -:10DD0000048201006680E8F70BFA201C0A300949FA -:10DD1000F2F72EFD201C10300749F2F729FDE682AC -:10DD200003CDE9F7F9F8024901201439886070BD84 -:10DD300090D901001261010024F701007047000032 -:10DD40003C004082010010B5064C00220220E16830 -:10DD5000F0F711FB6078022801D100F01AF910BD2C -:10DD6000000040D9010080B5A120FFF750FF80BD21 -:10DD7000000040000E21084080B5A030FFF747FFAB -:10DD800080BD3C007C82010010B5054C2068002855 -:10DD900004D0E9F787F900202060606010BD000022 -:10DDA00090D9010010B5074C0121074A21610220DA -:10DDB0001070616100F0D6FC00F0C8FB201CEDF78C -:10DDC0009FFA10BD3C00B882010020F701007CD909 -:10DDD000010070B5021C081C0225002A134E14D045 -:10DDE00000F011FC3078012108433070307828436E -:10DDF000307000207D214901B279920700D50134AD -:10DE000001308842F8DB3C00F4820100201C70BD28 -:10DE10003078A843307030784008400030700549B1 -:10DE200048680122120490434860012070BD000040 -:10DE3000880007006C000700FFB509AE002060CE27 -:10DE4000286000239C4630603C0030830100694616 -:10DE500001AA17E0DB070ED5124B1C56631C0AD033 -:10DE600001272B68A7403B432B601368DB0702D5D3 -:10DE700033683B4333600B685B080B6013685B08D7 -:10DE8000136001300B68002B01D03C006C83010053 -:10DE90002228E2D3634601332020022B9C4602A9AC -:10DEA00003AAF2DBFFBD0000B48D0100B0B5041C75 -:10DEB0000D1C1E2100220320054BF9F7B3F8211C8D -:10DEC0000320F9F7F5F8291C0320F9F73C00A88393 -:10DED0000100F1F8B0BD80380100B0B51C4C1C4DFC -:10DEE0002178022909D0032919D004291FD0052936 -:10DEF00023D1002000F017FB23E0686114481C3098 -:10DF0000C16802698918C16000F02FFBE0683C001D -:10DF1000E48301000138E06016D13220E060FFF7B1 -:10DF2000A3FE11E0002000F001FB00F02DFC012019 -:10DF3000207009E0002000F0F9FAFFF745FF03E048 -:10DF400005210B20E8F746FF68696168E7F7DDFF08 -:10DF50003C0020840100B0BD00007CD9010020F706 -:10DF60000100F7B5041C171CFFF721FE200AFFF77C -:10DF700018FF2006000EFFF762FEFFF718FEA12033 -:10DF8000FFF75DFE002516E0002000244006060E87 -:10DF9000FFF73C005C840100D1FD0006000E304319 -:10DFA0000134082CF5DB291C019A0135BD4250547F -:10DFB00001DA002000E00120FFF7D4FDBD42E6DBDE -:10DFC000FFF71EFEFEBD000080B5FFF719FE092118 -:10DFD000890300223C00988401000220F0F7E9F94F -:10DFE00080BD0921890380B500220220F0F7C9F91C -:10DFF000012109488903816142680A4342608268BD -:10E000001143816001214904816182688A438260F1 -:10E010004268114341603C00D484010080BD00008F -:10E0200010000700F0B5041CC0687B4E056830780E -:10E0300085B0012801D0022872D100212069F2F7B1 -:10E0400041F97649F2F724FC002869D0201C2030E1 -:10E05000417A082902D1724A3C0010850100002152 -:10E060005161007A226A1821F2F7C9FBE16A371C74 -:10E0700040186C49029030780E1CFF360A1D01369C -:10E080000128049207D0654A02991C32281CEDF73A -:10E09000E2FB00286BD0322120693C004C85010056 -:10E0A000F2F716F9019020690121F2F711F9011C2C -:10E0B0005E480123019AEDF707FC002804D15B4874 -:10E0C000EDF792FA0021B96056481C308168EAF7F2 -:10E0D00019FC201C143003900499F2F73C00888549 -:10E0E0000100D5FB002805D10022BA6004980399ED -:10E0F000F2F76BFB4F4928890988884203D0002238 -:10E100004C49BA60088003212069F2F7E4F800283E -:10E1100010D04649827820310B7994469A423C00CF -:10E12000C485010009D00022BA6062460A71807875 -:10E130000121F3F705F900E077E006212069F2F705 -:10E14000CDF8002808D081783A4840308288914242 -:10E1500002D00022BA6081802A212069F2F7BEF83D -:10E160003C000086010000280DD08078F169334A18 -:10E17000814208D00021B960F061101CEDF709FB65 -:10E180002F48EDF7FAFA38783B1C012817D1022006 -:10E1900018702A4F01233B61274B03CD1C33083DE8 -:10E1A000029A3C003C860100EDF7B0FA381CEDF70E -:10E1B000D7F83268002A03D000210120E7F7C4FE17 -:10E1C00000F0F4F9201CF9F7D5FB071C11D1201C35 -:10E1D000F9F788FB071C2ED001233B616889402199 -:10E1E000C85373683C0078860100002B04D0211CC2 -:10E1F0000020049AE7F7ACFE0123FB62206932217C -:10E20000F2F775F8051C20690121F2F770F80E4E3F -:10E21000011C2A1C301CEDF7C0FB00280ED1322156 -:10E220002069F2F764F83C00B4860100051C2069FF -:10E230000121F2F75FF8011C3B1C2A1C301CEDF792 -:10E24000D7FA05B0F0BD00007CD9010040F801000C -:10E2500020F70100021C081C802A80B506D0812A04 -:10E2600003D004210B20E8F73C00F0860100D9FD23 -:10E2700080BDFFF75CFE80BD000003488178FF2968 -:10E2800001D0007970470020704780F8010030B558 -:10E2900089B000930E4D131C041C2A1CECF725FDBD -:10E2A00001A906A8A268ECF7CEFE3C002C8701006D -:10E2B00001AA06A9281C636AEDF744FA041C012888 -:10E2C00004D1281CEDF72CF800F04AF8201C09B006 -:10E2D00030BD000020F7010080B5EDF72BF800F00D -:10E2E0007DF80248EDF702FA80BD00003C00688727 -:10E2F000010020F7010080B500280BD10648EDF79A -:10E30000F8F900F06EF80120EDF7EBFA034903206D -:10E31000F9F735FE80BD20F701006D870100B0B52B -:10E32000104D041C131C2A1C88B0ECF702FD3C00A5 -:10E33000A4870100211C0A310622281DE7F7A4FE4C -:10E34000694605A86269ECF787FE281CECF7EEFF2A -:10E350007F23DB43281C6A4605A9EDF7F9F900F095 -:10E360001DF808B0B0BD000020F701000A4880B5D4 -:10E370003C00E08701000178002906D0022901D085 -:10E38000052907D10321017080BD0121017000F032 -:10E390002EFA80BD03210B20E8F74FFD80BD7CD90C -:10E3A0000100094980B50878002806D0022801D06C -:10E3B00005283C001C88010005D10420087080BDA0 -:10E3C000FFF738FD80BD02210B20E8F739FD80BD45 -:10E3D0007CD9010080B502210B20044AFAF782FFA4 -:10E3E000F6F786FD0249086180BD0000DD86010068 -:10E3F0007CD901003C00588801000C4880B50178A8 -:10E4000006290ED202A35B5C5B009F44000006035A -:10E4100007070706002000F0C2F880BD0521017043 -:10E4200080BD04210B20E8F70EFD80BD00007CD9E3 -:10E430000100704700003C009488010010B50D4BAE -:10E44000041C181C1030002C08D0DB885B045B0C0B -:10E450000B80807B48800420108008E0DA8801244B -:10E46000E40322400C882243DA804988817301202A -:10E4700010BD0000300007003C00D088010070B5DE -:10E48000104E021C0023F056002A02D0087001240E -:10E4900015E00023CD56854201D1012070BD281C16 -:10E4A00000F05FF9041C0AD00748357000680028A6 -:10E4B00003D000210A20F9F728FD3C000C89010057 -:10E4C00000F016FA201C70BDF46B01003CD901006D -:10E4D000031C081C002B80B506D0042111800422E7 -:10E4E0000449E7F7E3FD02E0006800F0CFF90120FE -:10E4F00080BD0000F474010010B5FFF73C004889AE -:10E50000010097FBFFF789FC041CFFF7B8FBFFF73E -:10E5100084FC002C02D1012800D110BD002010BDC8 -:10E520000000F8B5204F041C78780E1C02282ED06D -:10E530001E4AF968916114231D49584340183C0054 -:10E5400084890100417BB878F8F714FE00F08AF95D -:10E55000002504E00021B878F8F70CFE0135787842 -:10E560001423144958434018807AA842F2DC00254D -:10E5700008E00021B878F8F7FDFD0F48006820702A -:10E580003C00C089010001340135B542F4DB094A81 -:10E59000F86850617878022806D1B868321C211CCE -:10E5A0000004000CFFF725FDB8688019B860F8BDBD -:10E5B000000040D9010010000700648D01003020E8 -:10E5C00007003C00FC89010070B5061C0C4D0024BE -:10E5D0002C70FFF739FC0A4818211C30AC60E7F7B3 -:10E5E00043FD08484461F9F763F9002E06D1064857 -:10E5F0002969F6F7A7FC0020ECF7B0FE70BD00001B -:10E600007CD901003C00388A010020F70100346306 -:10E61000010030B5124C85B0206800281CD00F488E -:10E6200014388068002801D1FFF7C1FB206800235F -:10E63000006801AA04300121ECF7D1FD0849084A1D -:10E6400008310C3100923C00748A010003C900AB10 -:10E650004518997B019A20682B1CF2F72BFE05B018 -:10E6600030BD000090D901002981010010B5134C84 -:10E67000142360705843124BC1188A88E2801858DE -:10E68000E060087AA070FF283C00B08A010012D038 -:10E69000002208210D4BF8F722FD00220220E1683C -:10E6A000EFF7BDFE0A49E06848614A6802434A60E4 -:10E6B0008A68104388606078022801D1FFF7DFFC88 -:10E6C00010BD40D90100648D01003C00EC8A0100BE -:10E6D000B80B000010000700FE300006000E0621F7 -:10E6E000154B4143585C82061448920E4271C9187A -:10E6F0004A78D206D20E027142780C231A43427035 -:10E7000042788B78920892009B079B0F3C00288BE5 -:10E7100001001A4342700278C0239A4340320270CB -:10E72000027838231A4302700278C97804239A4386 -:10E730008900194011430170012070470000D88DF5 -:10E740000100880007008FB50020029003903C0074 -:10E75000648B0100074802AA03A900910192438932 -:10E76000028903C8FFF7D4FB03980299FFF704FC62 -:10E770008FBD0000048E010008494A78002A03D1A9 -:10E78000888000208860704714235A43044BD218B5 -:10E790003C00A08B0100D2884243C88842438A6073 -:10E7A000704740D90100648D0100F8B5254E041C66 -:10E7B000307A400840003072B07A0020B0720127F1 -:10E7C000012C204D01D0FC4213D1307B38433073F3 -:10E7D00000223C00DC8B0100211C0020FFF76EFBB7 -:10E7E000631C01D13F21E973B17AA0221143B172B8 -:10E7F000317A39433172F8BD307B400840003073C4 -:10E800000122211C0120FFF759FB01200021E9739F -:10E81000B17A02223C00188C01001143B172B17A26 -:10E8200004221143B172B17A30221143B172317AAC -:10E830003943317208494A6880239A434A600A681A -:10E840001A430A60317B39433173D7E700008800EF -:10E850000700400007003C00548C01006C000700DA -:10E86000B0B50E4D0E482969F6F79EFB0D48ECF742 -:10E8700093FD0D48094C00881C34A082F1F75AFF23 -:10E880002061FAF797F8021C231C00210020ECF706 -:10E890008BFF3220E860FFF73C00908C0100A5FA66 -:10E8A000B0BD7CD9010034630100DD84010020F794 -:10E8B0000100B0B50A4D687800280ED0142308492D -:10E8C00058434018447A06E0A868E0400106090E63 -:10E8D000A878F8F776FC083CF6D53C00CC8C010013 -:10E8E000B0BD000040D90100648D0100011C144836 -:10E8F000B0B501601348027F02239A430277027F7A -:10E90000012422430277104D00290CD0012200215E -:10E910000320EFF79FFD0D49487CA0433C00088D84 -:10E9200001004874687A20436872B0BD017F2143BA -:10E930000177687A400840006872012200210320B4 -:10E94000EFF7B1FDB0BDF47401003000070088009E -:10E9500007001000070010B5074C211C00203C00E8 -:10E96000448D0100F9F756FB05480023C0560128E5 -:10E9700003DD211C0020F9F719FB10BD651A00000A -:10E98000F46B01000000020008010100021804FFFE -:10E9900082E8D78000000000008000000001000134 -:10E9A0003C00808D010000180006020305010100F3 -:10E9B00000000000000080000100FF1000FFFFFFCA -:10E9C000FFFFFF0000000000020020000100021015 -:10E9D0000006020305010100000004050607080CFB -:10E9E0000D0E3C00BC8D0100FF1415161718191BE5 -:10E9F0001C1DFF1A1113120F10FF0200FF01030963 -:10EA00000A0B0000300D02000000280E0300000079 -:10EA10001E0C00000000300D020100001E0C000161 -:10EA20000000230D3C00F88D0100020100001D0DC7 -:10EA3000020100000000FFFEFB6D000080000200EC -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA60000000000000003C00348E010000000000A7 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA00000000000000000003C00708E010000002B -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE000000000000000000000003C00AC8E0100AF -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB20000000000000000000000000003C00E88E33 -:10EB300001000000000000000000000000000000D4 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000003C0069 -:10EB7000248F0100000000000000000000000000E1 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0003C00608F01000000000000000000000029 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF00000003C009C8F01000000000000000000AD -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC3000000000003C00D88F010000000000000030 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 -:10EC70000000000000003C001490010000000000B3 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB00000000000000000003C0050900100000037 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF000000000000000000000003C008C900100BB -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED30000000000000000000000000003C00C8903F -:10ED400001000000000000000000000000000000C2 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED700000000000000000000000000000003C0057 -:10ED800004910100000000000000000000000000ED -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC0003C00409101000000000000000000000035 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 -:10EE000000003C007C9101000000000000000000B8 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 -:10EE4000000000003C00B89101000000000000003C -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000003C00F491010000000000C0 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 -:10EEC00000000000000000003C0030920100000043 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF0000000000000000000000003C006C920100C6 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF40000000000000000000000000003C00A8924B -:10EF500001000000000000000000000000000000B0 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 -:10EF800000000000000000000000000000003C0045 -:10EF9000E4920100000000000000000000000000FA -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 -:10EFD0003C00209301000000000000000000000041 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000003C005C9301000000000000000000C4 -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F05000000000003C009893010000000000000048 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000003C00D493010000000000CC -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 -:10F0D00000000000000000003C001094010000004F -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F11000000000000000000000003C004C940100D2 -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F150000000000000000000000000003C00889457 -:10F16000010000000000000000000000000000009E -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F1900000000000000000000000000000003C0033 -:10F1A000C494010000000000000000000000000006 -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E0003C0000950100000000000000000000004D -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F2200000003C003C9501000000000000000000D0 -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000003C007895010000000000000054 -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A0000000000000003C00B495010000000000D8 -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E -:10F2E00000000000000000003C00F095010000005C -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED -:10F32000000000000000000000003C002C960100DE -:10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD -:10F360000000000000000000000000003C00689663 -:10F37000010000000000000000000000000000008C -:10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D -:10F3A00000000000000000000000000000003C0021 -:10F3B000A496010000000000000000000000000012 -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F0003C00E0960100000000000000000000005A -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC -:10F4300000003C001C9701000000000000000000DC -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000003C005897010000000000000060 -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C -:10F4A000000000000000000000000000000000005C -:10F4B0000000000000003C009497010000000000E4 -:10F4C000000000000000000000000000000000003C -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F00000000000000000003C00D0970100000068 -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB -:10F5200000000000000000000000000000000000DB -:10F53000000000000000000000003C000C980100EA -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B -:10F570000000000000000000000000003C0048986F -:10F58000010000000000000000000000000000007A -:10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B -:10F5B00000000000000000000000000000003C000F -:10F5C000849801000000000000000000000000001E -:10F5D000000000000000000000000000000000002B -:10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B -:10F600003C00C09801000000000000000000000065 -:10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA -:10F6300000000000000000000000000000000000CA -:10F6400000003C00FC9801000000000000000000E9 -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000003C00389901000000000000006C -:10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C0000000000000003C007499010000000000F0 -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F7000000000000000000003C00B0990100000073 -:10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000000C9 -:10F74000000000000000000000003C00EC990100F7 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F780000000000000000000000000003C00289A7B -:10F790000100000000000000000000000000000068 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 -:10F7C00000000000000000000000000000003C00FD -:10F7D000649A01000000000000000000000000002A -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F810003C00A09A01000000000000000000000071 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 -:10F8400000000000000000000000000000000000B8 -:10F8500000003C00DC9A01000000000000000000F5 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F89000000000003C00189B010000000000000078 -:10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000000000000048 -:10F8C0000000000000000000000000000000000038 -:10F8D0000000000000003C00549B010000000000FC -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 -:10F9100000000000000000003C00909B010000007F -:10F9200000000000000000000000000000000000D7 -:10F9300000000000000000000000000000000000C7 -:10F9400000000000000000000000000000000000B7 -:10F95000000000000000000000003C00CC9B010003 -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000000077 -:10F990000000000000000000000000003C00089C87 -:10F9A0000100000000000000000000000000000056 -:10F9B0000000000000000000000000000000000047 -:10F9C0000000000000000000000000000000000037 -:10F9D00000000000000000000000000000003C00EB -:10F9E000449C010000000000000000000000000036 -:10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA20003C00809C0100000000000000000000007D -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA600000003C00BC9C0100000000000000000001 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA000000000003C00F89C010000000000000085 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000003C00349D01000000000008 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000003C00709D010000008B -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000000000000B5 -:10FB500000000000000000000000000000000000A5 -:10FB6000000000000000000000003C00AC9D01000F -:10FB70000000000000000000000000000000000085 -:10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000000000003C00E89D94 -:10FBB0000100000000000000000000000000000044 -:10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE00000000000000000000000000000003C00D9 -:10FBF000249E010000000000000000000000000042 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 -:10FC30003C00609E01000000000000000000000089 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 -:10FC700000003C009C9E010000000000000000000D -:10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB000000000003C00D89E010000000000000091 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000003C00149F01000000000014 -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD300000000000000000003C00509F0100000097 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD7000000000000000000000003C008C9F01001B -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000003C00C89FA0 -:10FDC0000100000000000000000000000000000032 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF00000000000000000000000000000003C00C7 -:10FE000004A001000000000000000000000000004D -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 -:10FE40003C0040A001000000000000000000000095 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE800000003C007CA00100000000000000000019 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 -:10FEC000000000003C00B8A001000000000000009D -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF00000000000000003C00F4A001000000000020 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000003C0030A101000000A3 -:10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF8000000000000000000000003C006CA1010027 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000003C00A8A1AC -:10FFD0000100000000000000000000000000000020 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 -:02000004800278 -:1000000000000000000000000000000000003C00B4 -:10001000E4A101000000000000000000000000005A -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:100050003C0020A2010000000000000000000000A1 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:1000900000003C005CA20100000000000000000025 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D000000000003C0098A20100000000000000A9 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:100110000000000000003C00D4A20100000000002C -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:1001500000000000000000003C0010A301000000AF -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000003C004CA3010033 -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D0000000000000000000000000003C0088A3B8 -:1001E000010000000000000000000000000000000E -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000003C00A2 -:10022000C4A3010000000000000000000000000066 -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:100260003C0000A4010000000000000000000000AD -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A00000003C003CA40100000000000000000031 -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000003C0078A40100000000000000B5 -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:100320000000000000003C00B4A401000000000038 -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:1003600000000000000000003C00F0A401000000BC -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D -:1003A000000000000000000000003C002CA501003F -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E0000000000000000000000000003C0068A5C4 -:1003F00001000000000000000000000000000000FC -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000003C0090 -:10043000A4A5010000000000000000000000000072 -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:100470003C00E0A5010000000000000000000000BA -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B00000003C001CA6010000000000000000003D -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F000000000003C0058A60100000000000000C1 -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:100530000000000000003C0094A601000000000044 -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:1005700000000000000000003C00D0A601000000C8 -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000003C000CA701004B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F0000000000000000000000000003C0048A7D0 -:1006000001000000000000000000000000000000E9 -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000003C007E -:1006400084A701000000000000000000000000007E -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:100680003C00C0A7010000000000000000000000C6 -:10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C00000003C00FCA7010000000000000000004A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:10070000000000003C0038A80100000000000000CC -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:100740000000000000003C0074A801000000000050 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:1007800000000000000000003C00B0A801000000D4 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C000000000000000000000003C00ECA8010058 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:100800000000000000000000000000003C0028A9DB -:1008100001000000000000000000000000000000D7 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000003C006C -:1008500064A901000000000000000000000000008A -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890003C00A0A9010000000000000000000000D2 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D00000003C00DCA90100000000000000000056 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:10091000000000003C0018AA0100000000000000D8 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000003C0054AA0100000000005C -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:1009900000000000000000003C0090AA01000000E0 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D000000000000000000000003C00CCAA010064 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A10000000000000000000000000003C0008ABE7 -:100A200001000000000000000000000000000000C5 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A500000000000000000000000000000003C005A -:100A600044AB010000000000000000000000000096 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0003C0080AB010000000000000000000000DE -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE00000003C00BCAB0100000000000000000062 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B2000000000003C00F8AB0100000000000000E5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000003C0034AC01000000000068 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA00000000000000000003C0070AC01000000EC -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE000000000000000000000003C00ACAC010070 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C20000000000000000000000000003C00E8ACF4 -:100C300001000000000000000000000000000000B3 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C600000000000000000000000000000003C0048 -:100C700024AD0100000000000000000000000000A2 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0003C0060AD010000000000000000000000EA -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000003C009CAD010000000000000000006E -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D3000000000003C00D8AD0100000000000000F1 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000003C0014AE01000000000074 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB00000000000000000003C0050AE01000000F8 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF000000000000000000000003C008CAE01007C -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E30000000000000000000000000003C00C8AE00 -:100E400001000000000000000000000000000000A1 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E700000000000000000000000000000003C0036 -:100E800004AF0100000000000000000000000000AE -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0003C0040AF010000000000000000000000F6 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000003C007CAF0100000000000000000079 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F4000000000003C00B8AF0100000000000000FD -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000003C00F4AF01000000000081 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC00000000000000000003C0030B00100000004 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:10100000000000000000000000003C006CB0010087 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:101040000000000000000000000000003C00A8B00C -:10105000010000000000000000000000000000008F -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:1010800000000000000000000000000000003C0024 -:10109000E4B00100000000000000000000000000BB -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0003C0020B101000000000000000000000002 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000003C005CB10100000000000000000085 -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000003C0098B1010000000000000009 -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:101190000000000000003C00D4B10100000000008D -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D00000000000000000003C0010B20100000010 -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:10121000000000000000000000003C004CB2010093 -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:101250000000000000000000000000003C0088B218 -:10126000010000000000000000000000000000007D -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:1012900000000000000000000000000000003C0012 -:1012A000C4B20100000000000000000000000000C7 -:1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E0003C0000B30100000000000000000000000E -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000003C003CB30100000000000000000091 -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000003C0078B3010000000000000015 -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A0000000000000003C00B4B301000000000099 -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000003C00F0B3010000001D -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:10142000000000000000000000003C002CB401009F -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:101460000000000000000000000000003C0068B424 -:10147000010000000000000000000000000000006B -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A00000000000000000000000000000003C0000 -:1014B000A4B40100000000000000000000000000D3 -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F0003C00E0B40100000000000000000000001B -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000003C001CB5010000000000000000009D -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000003C0058B5010000000000000021 -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B0000000000000003C0094B5010000000000A5 -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000003C00D0B50100000029 -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:10163000000000000000000000003C000CB60100AB -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:101670000000000000000000000000003C0048B630 -:101680000100000000000000000000000000000059 -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B00000000000000000000000000000003C00EE -:1016C00084B60100000000000000000000000000DF -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:101700003C00C0B601000000000000000000000026 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:1017400000003C00FCB601000000000000000000AA -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:10178000000000003C0038B701000000000000002D -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000003C0074B7010000000000B1 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000003C00B0B70100000034 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:10184000000000000000000000003C00ECB70100B8 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000003C0028B83C -:101890000100000000000000000000000000000047 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C00000000000000000000000000000003C00DC -:1018D00064B80100000000000000000000000000EB -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:101910003C00A0B801000000000000000000000032 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:1019500000003C00DCB801000000000000000000B6 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:10199000000000003C0018B9010000000000000039 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000003C0054B9010000000000BD -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000003C0090B90100000040 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A5000000000000000000000003C00CCB90100C4 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000003C0008BA48 -:101AA0000100000000000000000000000000000035 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD00000000000000000000000000000003C00CA -:101AE00044BA0100000000000000000000000000F7 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B20003C0080BA0100000000000000000000003E -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B600000003C00BCBA01000000000000000000C2 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA000000000003C00F8BA010000000000000046 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE0000000000000003C0034BB010000000000C9 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000003C0070BB010000004C -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C6000000000000000000000003C00ACBB0100D0 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000003C00E8BB55 -:101CB0000100000000000000000000000000000023 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000003C00B8 -:101CF00024BC010000000000000000000000000003 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D30003C0060BC0100000000000000000000004A -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D700000003C009CBC01000000000000000000CE -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB000000000003C00D8BC010000000000000052 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF0000000000000003C0014BD010000000000D5 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000003C0050BD0100000058 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E7000000000000000000000003C008CBD0100DC -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000003C00C8BD61 -:101EC0000100000000000000000000000000000011 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000003C00A6 -:101F000004BE01000000000000000000000000000E -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40003C0040BE01000000000000000000000056 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F800000003C007CBE01000000000000000000DA -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC000000000003C00B8BE01000000000000005E -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:102000000000000000003C00F4BE010000000000E1 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:1020400000000000000000003C0030BF0100000064 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:10208000000000000000000000003C006CBF0100E8 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000003C00A8BF6D -:1020D00001000000000000000000000000000000FF -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000003C0093 -:10211000E4BF01000000000000000000000000001B -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:102150003C0020C001000000000000000000000062 -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:1021900000003C005CC001000000000000000000E6 -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D000000000003C0098C001000000000000006A -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:102210000000000000003C00D4C0010000000000ED -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:1022500000000000000000003C0010C10100000070 -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000003C004CC10100F4 -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D0000000000000000000000000003C0088C179 -:1022E00001000000000000000000000000000000ED -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000003C0081 -:10232000C4C1010000000000000000000000000027 -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:102360003C0000C20100000000000000000000006E -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A00000003C003CC201000000000000000000F2 -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E000000000003C0078C2010000000000000076 -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC -:102420000000000000003C00B4C2010000000000F9 -:10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:1024600000000000000000003C00F0C2010000007D -:10247000000000000000000000000000000000005C -:10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000003C002CC3010000 -:1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E0000000000000000000000000003C0068C385 -:1024F00001000000000000000000000000000000DB -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000003C006F -:10253000A4C3010000000000000000000000000033 -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:102570003C00E0C30100000000000000000000007B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B00000003C001CC401000000000000000000FE -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F000000000003C0058C4010000000000000082 -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:102630000000000000003C0094C401000000000005 -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:1026700000000000000000003C00D0C40100000089 -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000003C000CC501000C -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F0000000000000000000000000003C0048C591 -:1027000001000000000000000000000000000000C8 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:1027300000000000000000000000000000003C005D -:1027400084C501000000000000000000000000003F -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780003C00C0C501000000000000000000000087 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C00000003C00FCC5010000000000000000000B -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:10280000000000003C0038C601000000000000008D -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000003C0074C601000000000011 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:1028800000000000000000003C00B0C60100000095 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C000000000000000000000003C00ECC6010019 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:102900000000000000000000000000003C0028C79C -:1029100001000000000000000000000000000000B6 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:1029400000000000000000000000000000003C004B -:1029500064C701000000000000000000000000004B -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990003C00A0C701000000000000000000000093 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000003C00DCC70100000000000000000017 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A1000000000003C0018C8010000000000000099 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000003C0054C80100000000001D -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A900000000000000000003C0090C801000000A1 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD000000000000000000000003C00CCC8010025 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B10000000000000000000000000003C0008C9A8 -:102B200001000000000000000000000000000000A4 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B500000000000000000000000000000003C0039 -:102B600044C9010000000000000000000000000057 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0003C0080C90100000000000000000000009F -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000003C00BCC90100000000000000000023 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C2000000000003C00F8C90100000000000000A6 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000003C0034CA01000000000029 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA00000000000000000003C0070CA01000000AD -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE000000000000000000000003C00ACCA010031 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D20000000000000000000000000003C00E8CAB5 -:102D30000100000000000000000000000000000092 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D600000000000000000000000000000003C0027 -:102D700024CB010000000000000000000000000063 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0003C0060CB010000000000000000000000AB -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000003C009CCB010000000000000000002F -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E3000000000003C00D8CB0100000000000000B2 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000003C0014CC01000000000035 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB00000000000000000003C0050CC01000000B9 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF000000000000000000000003C008CCC01003D -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000003C00C8CCC1 -:102F40000100000000000000000000000000000080 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F700000000000000000000000000000003C0015 -:102F800004CD01000000000000000000000000006F -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0003C0040CD010000000000000000000000B7 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000003C007CCD010000000000000000003A -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:10304000000000003C00B8CD0100000000000000BE -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000003C00F4CD01000000000042 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C00000000000000000003C0030CE01000000C5 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:10310000000000000000000000003C006CCE010048 -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:103140000000000000000000000000003C00A8CECD -:10315000010000000000000000000000000000006E -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:1031800000000000000000000000000000003C0003 -:10319000E4CE01000000000000000000000000007C -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D0003C0020CF010000000000000000000000C3 -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000003C005CCF0100000000000000000046 -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000003C0098CF0100000000000000CA -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:103290000000000000003C00D4CF0100000000004E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000003C0010D001000000D1 -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:10331000000000000000000000003C004CD0010054 -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:103350000000000000000000000000003C0088D0D9 -:10336000010000000000000000000000000000005C -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:1033900000000000000000000000000000003C00F1 -:1033A000C4D0010000000000000000000000000088 -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E0003C0000D1010000000000000000000000CF -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:1034200000003C003CD10100000000000000000052 -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000003C0078D10100000000000000D6 -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A0000000000000003C00B4D10100000000005A -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000003C00F0D101000000DE -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000003C002CD2010060 -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:103560000000000000000000000000003C0068D2E5 -:10357000010000000000000000000000000000004A -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A00000000000000000000000000000003C00DF -:1035B000A4D2010000000000000000000000000094 -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F0003C00E0D2010000000000000000000000DC -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:1036300000003C001CD3010000000000000000005E -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000003C0058D30100000000000000E2 -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B0000000000000003C0094D301000000000066 -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000003C00D0D301000000EA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:10373000000000000000000000003C000CD401006C -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000003C0048D4F1 -:103780000100000000000000000000000000000038 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B00000000000000000000000000000003C00CD -:1037C00084D40100000000000000000000000000A0 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:103800003C00C0D4010000000000000000000000E7 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:1038400000003C00FCD4010000000000000000006B -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:10388000000000003C0038D50100000000000000EE -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C0000000000000003C0074D501000000000072 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000003C00B0D501000000F5 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:10394000000000000000000000003C00ECD5010079 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000003C0028D6FD -:103990000100000000000000000000000000000026 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000003C00BB -:1039D00064D60100000000000000000000000000AC -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A10003C00A0D6010000000000000000000000F3 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A500000003C00DCD60100000000000000000077 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A9000000000003C0018D70100000000000000FA -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD0000000000000003C0054D70100000000007E -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000003C0090D70100000001 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B5000000000000000000000003C00CCD7010085 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000003C0008D809 -:103BA0000100000000000000000000000000000014 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000003C00A9 -:103BE00044D80100000000000000000000000000B8 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20003C0080D8010000000000000000000000FF -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C600000003C00BCD80100000000000000000083 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA000000000003C00F8D8010000000000000007 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE0000000000000003C0034D90100000000008A -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D200000000000000000003C0070D9010000000D -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D6000000000000000000000003C00ACD9010091 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000003C00E8D916 -:103DB0000100000000000000000000000000000002 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000003C0097 -:103DF00024DA0100000000000000000000000000C4 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30003C0060DA0100000000000000000000000B -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E700000003C009CDA010000000000000000008F -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB000000000003C00D8DA010000000000000013 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF0000000000000003C0014DB01000000000096 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F300000000000000000003C0050DB0100000019 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F7000000000000000000000003C008CDB01009D -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000003C00C8DB22 -:103FC00001000000000000000000000000000000F0 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000003C0085 -:1040000004DC0100000000000000000000000000CF -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040003C0040DC01000000000000000000000017 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:1040800000003C007CDC010000000000000000009B -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C000000000003C00B8DC01000000000000001F -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:104100000000000000003C00F4DC010000000000A2 -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:1041400000000000000000003C0030DD0100000025 -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000003C006CDD0100A9 -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C0000000000000000000000000003C00A8DD2E -:1041D00001000000000000000000000000000000DE -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000003C0072 -:10421000E4DD0100000000000000000000000000DC -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:104250003C0020DE01000000000000000000000023 -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:1042900000003C005CDE01000000000000000000A7 -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D000000000003C0098DE01000000000000002B -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:104310000000000000003C00D4DE010000000000AE -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:1043500000000000000000003C0010DF0100000031 -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000003C004CDF0100B5 -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D0000000000000000000000000003C0088DF3A -:1043E00001000000000000000000000000000000CC -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:1044100000000000000000000000000000003C0060 -:10442000C4DF0100000000000000000000000000E8 -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:104460003C0000E00100000000000000000000002F -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A00000003C003CE001000000000000000000B3 -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E000000000003C0078E0010000000000000037 -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:104520000000000000003C00B4E0010000000000BA -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:1045600000000000000000003C00F0E0010000003E -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000003C002CE10100C1 -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E0000000000000000000000000003C0068E146 -:1045F00001000000000000000000000000000000BA -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:1046200000000000000000000000000000003C004E -:10463000A4E10100000000000000000000000000F4 -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:104670003C00E0E10100000000000000000000003C -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000003C001CE201000000000000000000BF -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F000000000003C0058E2010000000000000043 -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000003C0094E2010000000000C6 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:1047700000000000000000003C00D0E2010000004A -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B000000000000000000000003C000CE30100CD -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F0000000000000000000000000003C0048E352 -:1048000001000000000000000000000000000000A7 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:1048300000000000000000000000000000003C003C -:1048400084E3010000000000000000000000000000 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880003C00C0E301000000000000000000000048 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000003C00FCE301000000000000000000CC -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:10490000000000003C0038E401000000000000004E -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000003C0074E4010000000000D2 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:1049800000000000000000003C00B0E40100000056 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C000000000000000000000003C00ECE40100DA -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A00000000000000000000000000003C0028E55D -:104A10000100000000000000000000000000000095 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A400000000000000000000000000000003C002A -:104A500064E501000000000000000000000000000C -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90003C00A0E501000000000000000000000054 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000003C00DCE501000000000000000000D8 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B1000000000003C0018E601000000000000005A -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000003C0054E6010000000000DE -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B900000000000000000003C0090E60100000062 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD000000000000000000000003C00CCE60100E6 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000003C0008E769 -:104C20000100000000000000000000000000000083 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C500000000000000000000000000000003C0018 -:104C600044E7010000000000000000000000000018 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0003C0080E701000000000000000000000060 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000003C00BCE701000000000000000000E4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D2000000000003C00F8E7010000000000000067 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000003C0034E8010000000000EA -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA00000000000000000003C0070E8010000006E -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE000000000000000000000003C00ACE80100F2 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000003C00E8E876 -:104E30000100000000000000000000000000000071 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E600000000000000000000000000000003C0006 -:104E700024E9010000000000000000000000000024 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB0003C0060E90100000000000000000000006C -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000003C009CE901000000000000000000F0 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F3000000000003C00D8E9010000000000000073 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000003C0014EA010000000000F6 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000003C0050EA010000007A -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF000000000000000000000003C008CEA0100FE -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000003C00C8EA82 -:10504000010000000000000000000000000000005F -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:1050700000000000000000000000000000003C00F4 -:1050800004EB010000000000000000000000000030 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C0003C0040EB01000000000000000000000078 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:1051000000003C007CEB01000000000000000000FB -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000003C00B8EB01000000000000007F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:105180000000000000003C00F4EB01000000000003 -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000003C0030EC0100000086 -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000003C006CEC010009 -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:105240000000000000000000000000003C00A8EC8E -:10525000010000000000000000000000000000004D -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:1052800000000000000000000000000000003C00E2 -:10529000E4EC01000000000000000000000000003D -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D0003C0020ED01000000000000000000000084 -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:1053100000003C005CED0100000000000000000007 -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000003C0098ED01000000000000008B -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:105390000000000000003C00D4ED0100000000000F -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000003C0010EE0100000092 -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000003C004CEE010015 -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C -:105450000000000000000000000000003C0088EE9A -:10546000010000000000000000000000000000003B -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:1054900000000000000000000000000000003C00D0 -:1054A000C4EE010000000000000000000000000049 -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E0003C0000EF01000000000000000000000090 -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:1055200000003C003CEF0100000000000000000013 -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000003C0078EF010000000000000097 -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B -:1055A0000000000000003C00B4EF0100000000001B -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000003C00F0EF010000009F -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000003C002CF0010021 -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:105660000000000000000000000000003C0068F0A6 -:105670000100000000000000000000000000000029 -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000003C00BE -:1056B000A4F0010000000000000000000000000055 -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F0003C00E0F00100000000000000000000009D -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:1057300000003C001CF1010000000000000000001F -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:10577000000000003C0058F10100000000000000A3 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B0000000000000003C0094F101000000000027 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000003C00D0F101000000AB -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:10583000000000000000000000003C000CF201002D -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000003C0048F2B2 -:105880000100000000000000000000000000000017 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000003C00AC -:1058C00084F2010000000000000000000000000061 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900003C00C0F2010000000000000000000000A8 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:1059400000003C00FCF2010000000000000000002C -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:10598000000000003C0038F30100000000000000AF -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C0000000000000003C0074F301000000000033 -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A000000000000000000003C00B0F301000000B6 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A4000000000000000000000003C00ECF301003A -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000003C0028F4BE -:105A90000100000000000000000000000000000005 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000003C009A -:105AD00064F401000000000000000000000000006D -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10003C00A0F4010000000000000000000000B4 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B500000003C00DCF40100000000000000000038 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B9000000000003C0018F50100000000000000BB -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD0000000000000003C0054F50100000000003F -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C100000000000000000003C0090F501000000C2 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C5000000000000000000000003C00CCF5010046 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000003C0008F6CA -:105CA00001000000000000000000000000000000F3 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000003C0088 -:105CE00044F6010000000000000000000000000079 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20003C0080F6010000000000000000000000C0 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D600000003C00BCF60100000000000000000044 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA000000000003C00F8F60100000000000000C8 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE0000000000000003C0034F70100000000004B -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E200000000000000000003C0070F701000000CE -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E6000000000000000000000003C00ACF7010052 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA0000000000000000000000000003C00E8F7D7 -:105EB00001000000000000000000000000000000E1 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000003C0076 -:105EF00024F8010000000000000000000000000085 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30003C0060F8010000000000000000000000CC -:105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F700000003C009CF80100000000000000000050 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB000000000003C00D8F80100000000000000D4 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF0000000000000003C0014F901000000000057 -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:1060300000000000000000003C0050F901000000DA -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:10607000000000000000000000003C008CF901005E -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B0000000000000000000000000003C00C8F9E3 -:1060C00001000000000000000000000000000000CF -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000003C0064 -:1061000004FA010000000000000000000000000090 -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:106140003C0040FA010000000000000000000000D8 -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:1061800000003C007CFA010000000000000000005C -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C000000000003C00B8FA0100000000000000E0 -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:106200000000000000003C00F4FA01000000000063 -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:1062400000000000000000003C0030FB01000000E6 -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000003C006CFB01006A -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C0000000000000000000000000003C00A8FBEF -:1062D00001000000000000000000000000000000BD -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:1063000000000000000000000000000000003C0051 -:10631000E4FB01000000000000000000000000009D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:106350003C0020FC010000000000000000000000E4 -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000003C005CFC0100000000000000000068 -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D000000000003C0098FC0100000000000000EC -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:106410000000000000003C00D4FC0100000000006F -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:1064500000000000000000003C0010FD01000000F2 -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:10649000000000000000000000003C004CFD010076 -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D0000000000000000000000000003C0088FDFB -:1064E00001000000000000000000000000000000AB -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:1065100000000000000000000000000000003C003F -:10652000C4FD0100000000000000000000000000A9 -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:106560003C0000FE010000000000000000000000F0 -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000003C003CFE0100000000000000000074 -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E000000000003C0078FE0100000000000000F8 -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:106620000000000000003C00B4FE0100000000007B -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:1066600000000000000000003C00F0FE01000000FF -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A000000000000000000000003C002CFF010082 -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E0000000000000000000000000000C0068FF37 -:1066F00001000000000000000000000000003C005D -:106700000010040070B52B4806218175C175017E0B -:10671000490849000176017E02229143017626490B -:106720000B785B085B000B7004238B700C234376A3 -:10673000202303751A244475242484761024C476F7 -:106740003C003C1004002A254D70057A3026B543E4 -:1067500020350572857A6D086D008572857A9543BE -:106760008572857A042635438572857A08263543F5 -:106770008572857AA5438572057B2C430473047B5F -:106780001C433C00781004000473047B40252C4318 -:106790000473847A23438372837AAB438372037BCB -:1067A00080242343037308789043087008780122FB -:1067B00010430870087804229043087070BD0000F0 -:1067C0000C8007003C00B4100400808007000149E1 -:1067D00004204873704740800700034980B50020BB -:1067E000088000F00AFB80BD0000FC6B01007047D0 -:1067F000000080B500F067FB80BD80B50A49182015 -:10680000C1F73BFA09493C00F01004000220C1F72F -:1068100037FA08491F20C1F733FA07491C20C1F78E -:106820002FFA06490320C1F72BFA80BD992A0000F0 -:1068300041250000552500005D2500003925000098 -:1068400080B5BFF791FD80BD3C002C11040080B5E0 -:10685000054A05490A20BFF74EFF0120044980027E -:106860000860486080BDB4740100B164000000108D -:10687000070080B500F091FE80BD80B5054A05494E -:106880001B20BFF738FF012004493C0068110400B9 -:10689000C0060860486080BDB87401002D6E00001D -:1068A0000010070080B5044800F080FE0349002076 -:1068B0004860886080BD0000414B0000BC7401004E -:1068C00080B5C5F7D5FECEF7D9F803493C00A41131 -:1068D0000400086003490A20D1F7EFF880BDBC74BA -:1068E0000100496E000080B5012220210620C8F772 -:1068F00056FCBFF770FE03490020086020210248C3 -:10690000BFF763F980BDCC5C0100646D01003C0001 -:10691000E0110400084880B50068002805D006484A -:106920005430426A0021BFF7F3F8044A04490320B7 -:10693000BFF7ACFD80BD0000506D010089980000DC -:106940009198000080B500F003F800F019F880BDC0 -:106950003C001C12040010B5094C6021201CBFF73C -:106960003AF90020C043A0602060FF200230E0849C -:106970002022201C40300249BFF75BF910BD0010F7 -:1069800007007052010000200A49C0438860094B8B -:106990000A493C0058120400002082000130000621 -:1069A000000E20289950F8D30649044A081C1030DC -:1069B000083A03C27047000000100700E07E0100A3 -:1069C0007575000000A00700044800210022002384 -:1069D0000EC00C383C009412040001214160704745 -:1069E0000000707801007047000003480021002279 -:1069F00000230EC008C070470000885A01000449F7 -:106A000080B500204861024840211C30BFF7E9F8FA -:106A100080BDFC5A01003C00D012040080B5CEF7C6 -:106A20003FF80349886103490320D1F755F880BD39 -:106A3000FC5A01000D17010080B5C0F7A5F980BD13 -:106A4000FEB56C4900200090C8786B4C6B4F430733 -:106A5000C006C017DB0EE3583C000C1304000130E5 -:106A600038623B61081C8078664E03224107A036DD -:106A70000296490F3172890061583C1C6161019195 -:106A8000C006C00F7862201C002787610020211CEF -:106A9000C86159485949007809793C0048130400F5 -:106AA0005A4C4E07760F711C8C46B1008E465649E3 -:106AB0008031002824D0524F01287F781AD0022834 -:106AC00071D14F48002F0CD0012F6CD140794D4D22 -:106AD0004007400F8200AA584B4D01303C00841300 -:106AE0000400EA61A07304224B48484DC8614A483B -:106AF000002F00D04A482F1C11E04248002F55D1EA -:106B00000770022747703F484078002810D00128BE -:106B100001D002284AD13F483D4FC8613F483C0060 -:106B2000C013040088613A4970460858351CB861A2 -:106B30006046607304E03C48022288613B48C861BB -:106B40000020324906E00E18B6787607760F042E3C -:106B50002FD801309042F6D3C8792E4FC007C00F0E -:106B60003C00FC130400F86033484168194341605D -:106B7000816819438160019AB9698C461143FA69A9 -:106B8000866811438E4386604668314341600199AF -:106B90000B43181C614608431043011C00220220CD -:106BA000C7F73C003814040003FA1E4E403E7078CC -:106BB000C008C00028437070701C017800E029E014 -:106BC0000825A94301700120C043B08000210120A5 -:106BD000CFF76CFC301C8030817809090901817085 -:106BE0000F2101703C0074140400164A69041160FE -:106BF0005160029E1021327A7B6A002B00D1002165 -:106C000011432173817829438170E0780121084381 -:106C1000E070D2F7F2F9012000900098FEBDC05755 -:106C200001006C4301003C00B0140400A46C01009E -:106C300040900700C91D0000811D0000A51D000037 -:106C4000991D0000F11D0000100007000010070052 -:106C50000349002088620870487008710862704714 -:106C6000AC7E010080B501213C00EC140400002042 -:106C7000CDF769FF80BDB0B50F48C0F718FC0E4DC9 -:106C8000032028700D490D480C3948600D480A4C06 -:106C9000886040211834201CBEF7C1FFFF216868BE -:106CA000090608432060FF2106223C002815040045 -:106CB000201DBFF779F80120E060B0BDC0A8130A1D -:106CC000206E0100C0A81301FFFFFF0080B502493C -:106CD0000120C8F745FF80BD9D1C000098B50C4CF5 -:106CE00000206060E0600B4B0B4982003C006415A3 -:106CF0000400013020289950FADB6A460949052032 -:106D0000BFF72FFD0020C043206006492020086007 -:106D1000486098BD00000040070030740100A9756C -:106D20000000B59F000000100700054900203C004E -:106D3000A0150400086005488178282291438170DD -:106D40008178114381707047786E01000000070060 -:106D500070470000414810B50068022188433F4950 -:106D60000860081C0068022108433C4908603C4850 -:106D70003C00DC1504004068802188433A494860A3 -:106D8000081C006880210843374908603748017AA9 -:106D9000012421430172017A022211430172017A16 -:106DA000042291430172017A082211430172017B8E -:106DB00021433C00181604000173017B0222114399 -:106DC0000173017B042211430173017B08221143EB -:106DD00001732E214173817B3822914328318173C5 -:106DE00020214174817BC908C900033181732221AC -:106DF000C17320493C0054160400097A41721E49AF -:106E0000497A01743C220277011C10314A735023E5 -:106E10008B735A23CB730D23011C20310B70174B3E -:106E200043840E234B7000214182302101700521E3 -:106E30004170042141713C00901604008471C471BA -:106E40000C210171F82141800F49CA728A72032214 -:106E50000A7209224A7208220A73027A40231A43EC -:106E600002724C73FFF7A2FC0848017821430170BD -:106E700010BD0000F00007003C00CC160400F40038 -:106E800007000C800700764601002409000080807E -:106E90000700A080070080B518210948BEF7D7FE7B -:106EA000084800213C3841608160C1600161416156 -:106EB000816101210162FFF75CFF3C0008170400BB -:106EC000C0F76CFF80BD0000247E0100B0B52148F2 -:106ED000006840081F4940000860081C0068012144 -:106EE00008431C4908601C4A1079012108431071AD -:106EF000107902218843107100F06CF83C004417AF -:106F00000400107A012108431072107AFE21884390 -:106F10000A301072282090725A20D072114D14201D -:106F200028772C1C1034A0731620A8751820E8753B -:106F3000FFF7A1FC0C486886E07B4006400E3C0051 -:106F4000801704000E210843E073E07B8021084392 -:106F5000E07307484179042211434171B0BD00003C -:106F6000F00007000080070030800700FF010000EC -:106F70005000070080B5FFF7AFFF00201449C04361 -:106F80003C00BC1704008860C1F70BF913490020CE -:106F90004862C860486108618861C8610F4B086237 -:106FA0000F4A086338331A8001225A710B4A403263 -:106FB000D0601360082313815060094A8A62FF225F -:106FC0000A703C00F81704004870054800210022B0 -:106FD000503000230EC0C1F7FFF880BD003007001D -:106FE000046C0100BEBA0000857500000348102142 -:106FF00081710221C1713021417270470080070008 -:10700000704700003C003418040000B5C1F7DBFBFA -:1070100000BD7047000080B5CDF787FD014988604D -:1070200080BD50D9010080B506210548BEF7FDFDA1 -:10703000044900200439086000F067F800F003F804 -:1070400080BDEC6701003C007018040010B5074CCF -:107050002C21201CBEF710FE0120207003490020C7 -:107060001C39C8600861886110BD000078690100A2 -:1070700080B5CDF75DFD0949886009490820D0F742 -:1070800073FD08490920D0F73C00AC1804006FFDDF -:1070900007491120D0F76BFD0648C2F774F980BD8F -:1070A00000007869010021350000A1380000453456 -:1070B0000000BD26010080B586B00F48C4F745F931 -:1070C00000F045F8FFF7D7FFFFF73C00E818040091 -:1070D000ABFF0C490320D0F74DFD0B4869460090EB -:1070E0000020019009480490094802900948039043 -:1070F000094805900020C4F7CFF806B080BD000015 -:10710000F467010045350000953200003C00241969 -:107110000400A07D0100FD320000CD310000457D5E -:10712000010010B5CDF7D5FC0948094C302160614C -:1071300008487430BEF7A9FD0020A062064920610E -:10714000E1636064A06414212165606210BD3C00AD -:1071500060190400B9750000447D0100701700003B -:1071600080B502210920044AD1F7E8FECDF7ECFCF6 -:107170000249086380BD000039390000447D0100E8 -:1071800080B5AC210348BEF783FD00F051F800F054 -:107190003C009C19040049F880BDA46C010008B5AE -:1071A00000F04DF800F045F800211620184AD1F7FC -:1071B000C8FE174A0421101C403001700021817064 -:1071C0001121C18014490181101C8030C17808222E -:1071D00091433C00D8190400C170C1781143C170BB -:1071E0006A460F491420BFF7F5FA0E490720D0F779 -:1071F000CDFC0D490F20D0F7C9FCCDF7ABFC0B49F6 -:1072000008600A4844388068002802D00020C6F789 -:107210006FF908BD3C00141A0400B53B0000009053 -:107220000700E7FD00008D410000CD480000D9496E -:107230000000A46C010080B500F06FFC80BD7047B9 -:10724000000080B500F061FC80BD70470000B0B563 -:1072500030210C48BEF73C00501A040025FD0B4CB1 -:1072600000250A48843C3822032170386560BEF747 -:10727000DDFD0648382201213838BEF7D7FD0E2043 -:10728000A5606070207000F01DF8B0BD946701002B -:10729000044900B5012048603C008C1A0400886055 -:1072A000C860C3F7F8FF00BD0000D467010080B5D7 -:1072B00002210A20024AD1F750FE80BD00001D5A6B -:1072C000000080B500F005F880BD80B500F0FDFB42 -:1072D00080BD80B502490420D0F73C00C81A0400E4 -:1072E00061FC80BD651F000000211748C94380B5BF -:1072F000164B0170181C102220300271002210332E -:107300009A73427904231A434271427918239A43AB -:1073100008324271081CD7F759F800283C00041BBA -:10732000040003D101219A20BFF7CBFB502009496B -:1073300050220A60C8608860486008610120486186 -:107340000020D7F7D8F80449FF20086080BDF46B0F -:1073500001003000070004020700F47401003C0043 -:10736000401B040080B5D7F7FBF880BD10B5FFF7D0 -:10737000ABFBBFF7DDFB8148CDF798FA0024231C57 -:1073800004220421002001F039FA002801D0BFF7BF -:10739000C9FB231C0022FF21002001F02FFA002846 -:1073A0003C007C1B040001D0BFF7BFFB231C002264 -:1073B000FF21002001F025FA002801D0BFF7B5FB1E -:1073C000C4F727FF704884706F497F2088706E492A -:1073D0000C60032008606B4844706C480480694866 -:1073E000C0783C00B81B0400082108436749C870F6 -:1073F000081CC078042108436449C87001F07EFA73 -:10740000FFF77EFFFFF72CFE01F046FBFFF718FBAE -:1074100001F052FAFFF782FB5F48C16810229143E6 -:10742000C16001693C00F41B04005D4A1143016125 -:107430000169D20A91430161C1685A4A1143C1608E -:10744000816A594A1143816200F077F901F01FF80F -:1074500000F093FA01F099FB00F0F1FF00F099FCC5 -:1074600000F0DDFC00F03C00301C040083FCFFF762 -:10747000B3FC01F031FA01F071FAFFF787FAFFF778 -:107480009BFA012101204B4AD1F77CFD012102200A -:10749000494AD1F777FD02210320484AD1F772FD0E -:1074A00002210420464AD1F73C006C1C04006DFD0B -:1074B00002210520454AD1F768FD02210620434AF2 -:1074C000D1F763FD01210720424AD1F75EFD022179 -:1074D0001720404AD1F759FD022108203F4AD1F731 -:1074E00054FDFFF7C8FD3D4804603C00A81C0400A3 -:1074F0004460FFF717FAFFF709FAFFF74FFC00F0B7 -:1075000043F9FFF733FAFFF7FBFA01F085F801F0D2 -:10751000EBF901F023FA01F071F900F0E3FFFFF756 -:107520006FFA00F0AFF900F0BDF900F03C00E41C88 -:107530000400ADFC00F09BFEFFF7CDFAFFF7ABFEB9 -:1075400000F0C3F9FFF7ABFD00F08DFF00F021FF65 -:1075500000F065F900F097F900F0FDFE00F0E5FE9F -:1075600000F03FF900F073F9FFF737FE00F03C0040 -:10757000201D040021F900F073FBFFF7E5FB00F08C -:10758000D3FBFFF7A9FE00F0BBFB00F009FF00F002 -:10759000DBF91848C9F756F81748C9F72BF8002245 -:1075A0000121F020D1F72EFD002010BDA9690000B7 -:1075B0003C005C1D040000000700F00007002C00E8 -:1075C0000700001007003C000800C03F7438FCDFD3 -:1075D0007F3855690000E5130000610C00006D0C58 -:1075E00000003D0C0000F10D0000C53300003D0F10 -:1075F00000003C00981D0400ADD80000800007008A -:10760000505701000440010080B501F0A9F900F0D5 -:10761000C9F8FFF7C5FE01F003FB01F093FAFFF78D -:10762000CBF92C48FFF7E8F900F0AAF800F058FF72 -:10763000FFF734FD3C00D41D0400FFF7F2FBFFF719 -:107640007AFAFFF700FA00F034F900F03CF901F0A3 -:10765000E2F8FFF77AF9FFF772F9FFF79AF901F00C -:1076600066F901F08EF901F0E0F800F006FF00F095 -:10767000F0FB00F046FB3C00101E040000F0BCFFD5 -:1076800000F0E4FC00F020FEFFF740FAFFF746FEB2 -:10769000FFF756FD00F02CF900F0FAFE00F08AFE2C -:1076A00000F0D4F800F0B4F800F078FE00F04EFEE0 -:1076B00000F0DEF8FFF7ACFD3C004C1E040000F0CB -:1076C0008CF800F0F8FAFFF776FBFFF720FE01F0E8 -:1076D000A6FA00F048FB00F07CFE00F05CF9BEF773 -:1076E00057FD002080BD803801000149002008605E -:1076F0007047A87E010010B5041C3C00881E0400E1 -:1077000001D1BFF739FA0F487D21C900846001809B -:107710000D490161802141800021C16001620B4857 -:1077200041801421818007214181064A4623043289 -:107730000524137054700A21917081763C00C41E98 -:1077400004000376048110BD0000C87401000087A6 -:10775000930330000700094880B50169426911436D -:107760008269C0691143014300220320C6F7BFFCB0 -:10777000CCF71BFA0020C2F792F980BD00003C0054 -:10778000001F0400A46C0100054880B50021816041 -:107790000221C16003394160C7F73AFF80BD000094 -:1077A0004020070008B56A4604491520BFF754F881 -:1077B0000120034940050860486008BDA52101007B -:1077C0003C003C1F04000010070070470000064802 -:1077D00080B58068C001800F05D10322C143C6F780 -:1077E000BAFCD6F700FE80BD00001000070070470D -:1077F000000080B502212A20064AD1F7EAFB0022C8 -:1078000007203C00781F04000449BEF7EDFE044841 -:10781000C7F758FC80BD00008D890000D59B000093 -:107820001046010002480021002200230EC07047CC -:10783000806E010080B502212C20064AD1F7CCFBD6 -:10784000002200203C00B41F04000449BEF7CFFE14 -:1078500004490220C8F70BFA80BD058A0000E99BA5 -:107860000000B18B000002480021002200230EC05E -:1078700070471075010080B502212B20044AD1F712 -:10788000AEFB002202203C00F01F04000249BEF7BC -:10789000B1FE80BD2D8A00008D8C00007047000075 -:1078A00080B502212D20074AD1F79CFB0022012040 -:1078B0000549BEF79FFE0548CBF756FA0448CCF7BA -:1078C000F7F880BDAD8A00003C002C20040021E2C6 -:1078D0000000F9DF00002044010070470000024969 -:1078E00000200860012048607047AC79010080B535 -:1078F00002490D20D0F79BF980BD619800007047C8 -:10790000000080B5CDF777F903493C0068200400FA -:107910000860011C0248CDF797F980BDA8790100E5 -:10792000C460010080B500F029F880BD80B586B044 -:107930000C48C3F76DFDD6F7D3FB0B480D490090FB -:107940000A48049101900A48694602903C00A4202C -:1079500004000020039005900120C3F700FD0749B3 -:107960000320D0F76AF906B080BD20F70100118727 -:107970000100958701005587010098D901006D87A6 -:10798000010080B50120D6F790FC034900203C009F -:10799000E02004000860486002481439486080BD57 -:1079A00090D901003D82010070B50026094C094DB7 -:1079B0002660666044215035281CA661BEF7C8F9D0 -:1079C0001420E060E8632820E861A06028642E703D -:1079D0003C001C21040070BD0000A46E010080B5B5 -:1079E00002211820044AD1F70CFB03490820D0F7E4 -:1079F0002AF980BD0000159C0000699C0000FEB5BE -:107A0000264D2878C0070CD425490020087028701E -:107A100024483C00582104008178490849008170BD -:107A200081780122114381700024FF261F4F013607 -:107A3000211C01A8C6F732F800AB187901281FD025 -:107A4000022819D003281ED1B8680021B043B860BD -:107A5000786830433C009421040078603A683240F2 -:107A6000A02005E03B683340934201D0012101E0B2 -:107A70000138F7D27868B0437860002903D001A8B4 -:107A800000F027FF02E001A800F045FF01342406C2 -:107A90002416062CCFDB3C00D0210400044902222E -:107AA0000878104308702870FEBD0000040007002D -:107AB000E06001000000070010000700B0B50020E2 -:107AC00015231449012542008D54521801300E2807 -:107AD0005370F8D30F481C223C000C2204001C38C1 -:107AE000BEF773F90D480E212A38BEF71CF90B4971 -:107AF000002008600B4C2A21201CBEF714F92570C9 -:107B00000E2060701720A070074853210170452196 -:107B1000417020218170B0BD00003C00482204006B -:107B2000E6780100E4620100EB620100E862010016 -:107B30000C490D48002241600C4981600C49C1602C -:107B40000C4901610C4941610C498261C1610C49D8 -:107B500001620C4941620C4981620C493C0084225B -:107B60000400C162C26370470000C9750000287A32 -:107B70000100C17500008175000099750000CD7588 -:107B800000008975000091750000B57500008D75C5 -:107B90000000C5750000B0B50E480E4908603C00F5 -:107BA000C02204000831C0F743FE0C49002548609C -:107BB0000B480A4C05600B48803C05601020207182 -:107BC000E070A07160712720C043C3F7F7FB282045 -:107BD000C3F7FCFB2572B0BDFF3F00002C7D010008 -:107BE0003C00FC2204001C6701002067010080B5F6 -:107BF0002C210148BEF7C7F880BD3C7E010080B54E -:107C000038210148BEF7BFF880BD687E010080B50D -:107C100002210E20024AD1F70CFA80BD000021E0BB -:107C200000003C003823040070470000F0B585B028 -:107C3000002700AB2F4E1F8100250024281CD6F7FB -:107C4000A1FB022D03D1D6F7F5FA00280CD00124B0 -:107C5000012D03D1072000AB187101E000AB1F71AB -:107C600000AB18793C0074230400D6F708FC002C04 -:107C700039D0082103A8D6F7F2FA00AB187BFE280A -:107C800031D1587B01282AD1022102A8D6F7E7FA80 -:107C900000AB1889002826D018891849884222D0BC -:107CA00019890020BFF73C00B023040013F9041C1D -:107CB000006900AB1989D6F7D5FA206800AB1A899C -:107CC000011C0831083ACBF7A1F9002806D0022898 -:107CD00004D0022194203760BEF762FF201CBFF75A -:107CE000C7F8D4E7012194203C00EC230400BEF740 -:107CF0005AFFD5F726FF01352D062D0E042DA5D3ED -:107D000005B0F0BD000058570100FFFF00000A4811 -:107D10000021021C183280B5094B02E0016083800B -:107D200008308242FAD104486C213C002824040027 -:107D30006C38BEF737F804490220C7F7D1FF80BD81 -:107D40007C790100FC0500009D75000080B50221D2 -:107D500026200D4AD1F77CF90C48C8F773FF0C4870 -:107D6000C8F776FF0B491020CFF794FF3C0064243E -:107D700004000A490C20CFF790FF09490020C7F7FB -:107D8000B2FFCCF76EFF0749086080BD00009DA6DA -:107D90000000A9A4000081A4000031A70000B96D73 -:107DA0000000BDA600000C790100024908783C00E3 -:107DB000A0240400400840000870704758000700E5 -:107DC0000021084880B541618161017041704160C6 -:107DD00081601422C26001614262C161FFF704F850 -:107DE00080BD00001C75010080B502211D20044AE1 -:107DF0003C00DC240400D1F734F903490820CFF714 -:107E000052FF80BD000011E3000009E4000080B5CE -:107E1000012125200A4AD1F724F9CCF728FF084987 -:107E2000086208490120CFF73EFF07490220CFF73B -:107E30003AFF3C0018250400FEF7E6FF0548C1F7AD -:107E4000E1F980BD29A900001C750100A1AA00006C -:107E50002D19000045A8000010B5064C0C22227018 -:107E6000A0180549BDF7D8FF0020C8F785FB012001 -:107E7000A06010BD3C0054250400A4690100905787 -:107E80000100B0B51F4C00256580012020700A203C -:107E9000A0809020E08030202081902060813020E0 -:107EA000A0811748042207211230BEF74CF814486D -:107EB0000422052116303C0090250400BEF746F848 -:107EC0001248114AE08120827032157055700020EE -:107ED0003C23410143438918F4319B1801300428A5 -:107EE0005960F5DB084806221A300949BDF79AFFA8 -:107EF0000748054C0C300FC83C00CC25040020344A -:107F00000FC42021201CBDF762FFB0BD0000F86047 -:107F100001002C090000584001007047000007488C -:107F200010B50068002808D00648BEF79CFE041C67 -:107F3000FFF79DFE201CBEF796FE3C0008260400BD -:107F400010BD000058570100B5AD0000044980B5D0 -:107F50000020887002212020024AD1F791F880BDCC -:107F6000B479010025B5000080B5CCF78FFE01493A -:107F7000486180BDB479010080B518213C004426D9 -:107F800004001448BDF729FF1448012101700021A5 -:107F9000C1604170016100F002F900F0AAF800F040 -:107FA0001EF800F0BAF900F0CCF900F020F900F06A -:107FB00064F900F0CEF900F0FCF800F082F93C0022 -:107FC0008026040000F028F800F06EF800F04AF86F -:107FD000FFF7C2FF00F072F980BD0000407C010095 -:107FE00018630100B0B5084C0025084825772060CB -:107FF000CEF7F0FD0020E562D0F7D0FA211F08800F -:108000003C00BC260400D0F76CFBB0BD0000D47966 -:1080100001009575000080B5CCF7C1FC80BD054915 -:1080200080B500200870487003480449034A0830AE -:10803000CCF727FE80BD2C630100EDBC00004DBDD8 -:1080400000003C00F826040080B5CCF72BFE054963 -:108050004860011C0448CCF74BFE04490320CFF7CD -:108060003DFE80BD2C630100C4600100C1BC000066 -:1080700004480021002200230EC008C00249103825 -:10808000016070473C0034270400047A01001CE6BC -:10809000010080B5CCF709FE0549054A4860022178 -:1080A0002420D0F7FCFF0348C9F76BFD80BD047A9C -:1080B000010069BE000071EB000010B5044C1421F2 -:1080C000201CBDF796FE3C0070270400024820608B -:1080D00010BD0000147A0100ECE5010080B5CCF77A -:1080E000E7FD0749074A486002211F20D0F7DAFF61 -:1080F00005490120086005490C20CFF7F5FD80BD3A -:10810000147A0100D5BF00003C00AC270400805A5F -:10811000010085FF000080B5FFF74FFD0121212000 -:10812000024AD0F7C2FF80BD0000C9C1000080B57F -:10813000CCF7C1FD02490863C9F757FD80BD287A15 -:10814000010010B5CCF7B7FD164C3C00E827040041 -:108150002061CCF7B3FD60611448154908601649E9 -:1081600014480860CCF7AAFD1449086000F034F800 -:10817000FFF7E0FFFFF75EFF00F004F900F08EF874 -:10818000FFF76EFFFFF7B0FFFFF78CFF3C002428DE -:108190000400FFF704FF00F0AAF80A48BFF7BDFF8C -:1081A000C9F7BBFD09490020CFF7A7FD10BD407CF2 -:1081B00001007DB70000187E0100BDB800001C7EE4 -:1081C0000100207E0100B9BA0000812401003C00BA -:1081D0006028040080B538210148BDF719FE80BD34 -:1081E000905C010070470000B0B50C4C0B4D0020B6 -:1081F0000C3460602560E0600A202081281CC8F7EC -:108200003FFD281CC8F73AFD083D68600448C9F7DF -:108210003C009C2804001BFD201CC0F76EFA28803F -:10822000B0BDB87A0100D5330100F8B51F4E1D4C22 -:1082300000200C2141438200013009190831000659 -:10824000000E0428B150F4D318480C383061CEF732 -:10825000F4F93C00D8280400144CA078000900016F -:10826000A0700027E77067700024A50070590770A0 -:10827000201CBEF753F9715908710021201CCEF75C -:108280007DF901342406240E042CEED3074C20780B -:10829000000900013C00142904000A3020702078F5 -:1082A000F021884330302070A0780F210843A0705F -:1082B000F8BD00500700107B010080B5CCF79FFB94 -:1082C00080BDB0B50C4C0B4D00200C3460602560B7 -:1082D000E0600A2020813C0050290400281CC8F7D7 -:1082E000E1FC281CC8F7D4FC083D6860201CC0F7DE -:1082F0000DFA28800248C9F79BFCB0BD2C7B010019 -:108300004900010080B5CAF72FF880BD7047000012 -:10831000B0B5124D3C21281C3C008C290400BDF74F -:1083200086FD0F4828213C30BDF781FD0D48002116 -:1083300014380161C160FF21017041700A490A4A85 -:10834000416001210C20D0F7C8FE2C1C30340C3DBC -:108350000020D0F74AF920800C3C3C00C8290400DA -:10836000AC42F8D1B0BD0000607B010020A1070045 -:1083700035CD0000084900200C22424352181071EC -:1083800001300528F8DB04480021083801704160FD -:10839000FF21417070470000747A01003C00042AFC -:1083A000040080B578210148BDF747FD80BDC47B3E -:1083B000010080B5CAF797FA80BD7047000010B57C -:1083C0000B4CFF210531201CBDF737FD0948F0217A -:1083D0000851201C4030C5F78EF96C2106483C003E -:1083E000402A0400BDF72CFD0448C0216C30BDF7C5 -:1083F00027FD10BDC4690100B0D90100C86A0100A1 -:10840000B0B50B4D00241C20604340196C30C3F7FD -:108410000FFE0134042CF6DBCCF76EFCA863C7F723 -:108420003C007C2A040075F90448C9F71CFC034889 -:10843000CFF703FAB0BDC4690100FD800000E1225E -:10844000010010B5054C00202080034806210830AB -:10845000BDF7D5FC1420606010BD987C010010B5FC -:10846000084C3C00B82A04000020208060800648A8 -:1084700006210C30BDF7C6FC034806211230BDF7BB -:10848000C1FC1420A06010BD587C010070470000A2 -:1084900080B502210D20054AD0F72EFE0448C8F70A -:1084A0001FFC04483C00F42A0400CAF744FC80BDC9 -:1084B000000031D4000051B1000009B100000849AA -:1084C00080B500200860FFF7D0FFFFF7C0FFFFF77F -:1084D00004FC00F04AF8FFF70AFC00F03CF880BD0D -:1084E0000000E46501003C00302B040080B500F082 -:1084F00029F800F01BF800F051F800F031F880BDC9 -:10850000704700007047000080B5FF2189310248A4 -:10851000BDF7A2FC80BD0000DC71010080B50249FE -:108520000820CFF711FC80BD3C006C2B040059D90A -:10853000000080B50348CFF74CF90249488080BD60 -:1085400000008D1F0000987C010080B50348CFF724 -:1085500040F90249888080BD0000D5230000587C86 -:1085600001007047000080B502483C00A82B0400C1 -:10857000CAF7E4FB80BD000071E0000080B5CCF7D5 -:10858000A5FB02210F20064AD0F7C2FD14210548A1 -:10859000BDF768FC034878211430BDF763FC80BD4B -:1085A00035E200008466010080B5CCF73C00E42B86 -:1085B0000400B7FB0549086105490E20CFF7CDFB44 -:1085C00004490820CFF7C9FB80BDEC65010001021A -:1085D0000100C12E0000014900200870704740D9F9 -:1085E00001007047000001490020087070473C00FE -:1085F000202C0400A079010080B50748C8F7F2FFDD -:10860000064948600648C0F707FB0648C0F786FBE6 -:108610000548C9F7A3FA80BDA9E40000A0790100CC -:10862000B9E40000852E000081E40000074880B511 -:108630003C005C2C04000021002200230EC008C076 -:108640001038C821016000210C38024ACCF761FBC8 -:1086500080BDD0600100FDE5000080B5CCF767FB70 -:1086600004490860011C02480430CCF786FB80BD39 -:1086700000003C00982C0400C0600100094880B54F -:108680000A21017041700849084A81600021C160D7 -:10869000527982700161416128211830BDF7EEFBEB -:1086A00080BD00007C780100A08601000C5A01000A -:1086B000F8B50F493C00D42C04000F480D884F88B2 -:1086C00006790024301B684368230C49584341183D -:1086D0007D20C000BDF70FFD6100094AA64250523F -:1086E00000D13D1C01342406240E102CEAD3054988 -:1086F00001200861F8BD3C00102D0400F65901006E -:108700000C5A010034440F00125A01007C78010019 -:1087100080B500F0E7FA02490120086180BD000041 -:108720007C78010010B5041C081C0F494979002908 -:1087300001D10E4B00E00E4B3C004C2D0400002CF0 -:1087400007D0042111800A1C0124191CBDF7CDFBA0 -:108750000AE00124011C181C1288BDF7C6FB00F0BA -:10876000C4FA054901200861201C10BD00000C5A04 -:108770000100FE590100FA5901003C00882D040057 -:108780007C7801000D488CB5C18800AB0C4A9980FB -:1087900001890420D980188002211320D0F7D0FC51 -:1087A00000F0A6FA074901200861FFF78DFF6A462D -:1087B00001A90020FFF7BCFF8CBD00003C00C42DC8 -:1087C0000400F459010095F900007C780100F8B527 -:1087D000134E0125B5700520F070114910480EC9DF -:1087E0002C300EC0002070610F480F49104F00243C -:1087F0004860A0003958201CD1F7D7F801343C005C -:10880000002E0400102CF7D3064C0B4A2034201CF9 -:108810000A49B560CCF792FACCF79EFA3061206035 -:10882000F8BD000064730100B05801000418020094 -:1088300060000700D444010045FA000071FA00000E -:108840003C003C2E04000C4930B50023CC560B4BA9 -:108850000020F0251A5C1107090F09190F2901DD05 -:108860000F2102E0002900DA00212A405118195492 -:1088700001300E28EEDB30BD000064730100C058EB -:1088800001003C00782E0400B0B50D1C002808D073 -:10889000012414800520CCF7B5F88003C00F2870A0 -:1088A00007E028780122410452040520D0F7AEFDEC -:1088B0000124201CB0BD000098B5054C6068CCF7C1 -:1088C000F5FD00903C00B42E040000AB1888E08059 -:1088D000CEF7FBFF98BDA058010038B5031C081C5B -:1088E0000024002B174D07D00E2111800A1C0124F3 -:1088F000291CBDF70CFB22E01188042917D1011CAB -:1089000068461288BDF73C00F02E040003FB009877 -:10891000002801DB323000E032380090011C642076 -:10892000BDF798FB0106091600900E22281CBDF722 -:1089300085FB06E00E2905D10A1C011C281CBDF789 -:10894000E9FA0124201C38BD3C002C2F0400DA5920 -:10895000010038B5031C081C0024002B174D07D05C -:108960000E2111800A1C0124291CBDF7D6FA22E031 -:108970001188042917D1011C68461288BDF7CDFA69 -:108980000098002801DB323000E03C00682F040032 -:1089900032380090011C6420BDF762FB0106091605 -:1089A00000900E22281CBDF74FFB06E00E2905D1D2 -:1089B0000A1C011C281CBDF7B3FA0124201C38BD79 -:1089C000CC590100034880B5017800203C00A42F59 -:1089D0000400CCF7B4FB80BD0000A658010070472E -:1089E00000000249032008700020487070479C7303 -:1089F000010080B502211120024AD0F7BCFB80BDE6 -:108A00000000A1FE0000F0B50B4F1C1C00233C0031 -:108A1000E02F0400FD562B1C062D01D10120F0BDD6 -:108A2000064E051CD80034363554801941708270CA -:108A30004460581C38700020F0BD0000985A0100B6 -:108A400010B5041C0C4800F021F96078FF2804D010 -:108A50003C001C3004000123E056062100F0CDF854 -:108A6000084A012110780843074908702023184359 -:108A70000870802318431070087010BD0000919B8F -:108A80000000E06001000400070010B50A49041C62 -:108A900008783C005830040040084000087008493D -:108AA0000870084800F0F8F86078FF2804D0012327 -:108AB000E056052100F0A4F810BD0000E0600100C0 -:108AC00004000700919B00000348002100220023BE -:108AD0000EC008C03C009430040070470000E860FD -:108AE00001007047000010B5074C00206060208036 -:108AF000E06002211420044AD0F749FB02481030FC -:108B0000A06010BD000058750100051D01007047F0 -:108B1000000010B548213C00D03004000A48BDF7E1 -:108B2000E3F9094CE0214834201CBDF7DDF90020B1 -:108B3000C10009190A1C083201301B284A60F7D30A -:108B400001480438046010BD685B010080B5022153 -:108B50002320024AD0F71EFB3C000C31040080BDEC -:108B600000004523010080B5FFF76BF880BD70471A -:108B70000000F8B501201D49C00748601D49FF20CD -:108B800008731C4E10203060050135601B4C80219D -:108B9000201CBDF7ACF90021194A3C004831040003 -:108BA000154F00200B011B195A60CB00DB191874FC -:108BB00001310829F6DB0F4CFA212180124961802E -:108BC000A0606A4611490420BDF730FF6A4610498B -:108BD0000820BDF72BFF1020706075603C008431C9 -:108BE000040060680221084360600B49064A081CC3 -:108BF0001030083A03C2F8BD000000010700006011 -:108C0000070000100700AC730100D1750000204E72 -:108C10000000052C0100112C010000A007003C0001 -:108C2000C031040070B50E1C0024C4F75BFE0028A0 -:108C30003BD04568FF2D38D00C2E28D201A39B5D78 -:108C40005B009F440507090B0D101316181B1E210E -:108C5000182420E030241EE060241CE0C0241AE028 -:108C60003C00FC310400FF24813417E00924A401F6 -:108C700014E00924E40111E00F4C0FE00924240260 -:108C80000CE00924640209E00324E40206E009245C -:108C9000A40203E009219E20BEF739F86000001904 -:108CA00040083C0038320400054980044018054A59 -:108CB000A900891848606420604370BDDC0700008B -:108CC0008038010004000700024980B50860D0F731 -:108CD00097F880BD5C5B0100F8B50026174C174B78 -:108CE000194926703C0074320400002014330D88AA -:108CF000154E154A04E0C100CF187A605E5001306D -:108D0000A842F8DBC6F72BFDFF21114DA531281C29 -:108D1000BDF7FFF80021281C021C1432C260101C91 -:108D200001311429F8DB3C00B03204000026C66093 -:108D300005480C3060C009481821BDF7EDF8012046 -:108D4000043441C40020F8BD705D010009A000009A -:108D500030D9010056570100045F0100A8600100EE -:108D600080B50020CFF7B6FC3C00EC32040001498E -:108D7000088080BD00002C7401001148F8B54179CD -:108D8000002902D105780F4E01E045780F4E0223ED -:108D9000F75E0024601B784364230C495843411854 -:108DA0007D20C000BDF7F5F961003C0028330400C8 -:108DB000094AAC42505201D10023F75E0134240627 -:108DC000240E102CE9D3F8BD0C5A0100FE59010005 -:108DD000FA59010034440F00325A010038B5104CE2 -:108DE000BE252573207A1821884320723C00643305 -:108DF00004006A460D490D20BDF733FE01200B49E2 -:108E000040030860486025732D20C003206025734F -:108E1000207A102108432072064806490860002085 -:108E2000486038BD0000000307008D3E01002400AB -:108E3000A0330400001007000087930304790100A9 -:108E400080B502211520024AD0F7C8F980BD000084 -:108E50000D3E010070470000040000600400440063 -:108E60000000040040200700FFFFFFFF4D656D6F0D -:108E7000727920636865636B2E2E2E00204F4B0A9B -:108E800000000000204641494C0A000057726974F6 -:108E9000696E67206669726D7761726520646174BE -:108EA0006120746F20666C6173680A005665726990 -:108EB0006679696E67206669726D77617265206494 -:108EC0006174610A00000000566572696679206667 -:108ED00061696C6564206174206279746520256421 -:108EE0002C2030782530327820213D2030782530F4 -:108EF00032780A004669726D776172652073756316 -:108F00006365737366756C6C792073746F726564D6 -:108F100020696E20666C617368210A0005000600F6 -:108F200000000001000001480000000B0000014C9F -:108F300000000009000001780000000F0000019C03 -:108F400000000001000001D800000001000001DC69 -:108F50000000000100000108000000010000010CF9 -:108F600000000001000001100000000100000114D9 -:108F70000000000100000118000000010000011CB9 -:108F80000000000100000120000000010000012499 -:108F9000000000030000012800000001000001346F -:108FA0000000000100000138000000010000013C49 -:108FB0000000000100000140000000010000014429 -:040000058000000077 -:00000001FF +:0200000480007A +:10000000E08F100000000000000000000000000071 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:08200000481F0000800026309B +:10200800D40148D8E3B80001D553FE6A100030194E +:102018007508F1D9D202F5480040F01F0008F01FFA +:102028000008D503E06CF980EA1C0337F01F0005AF +:10203800D8020000800032008000259880002B68BC +:10204800800026D4EBCD40FC169518961492129B6E +:10205800580AE08A003B0B893008F0091800C520AF +:102068003009129A2FF9EA090708F4081800CFB1C5 +:102078001232E08900493002EDBB0001C26133032E +:10208800EDBB0000C2613004C0A85806C3806C09CB +:10209800B28C6C082FF88D082FF52FF40B8C580C88 +:1020A800CF515802E08A000F04975806C2406C09C5 +:1020B800B2836C082FF88D0820175807FE99FFF790 +:1020C8000404089CE3CD80FC3203EDBB0000CDC0C6 +:1020D8005802FE9AFFDA04975806C1706C09B28359 +:1020E8006C082FF88D0820175807FE99FFF70494FD +:1020F8003002CD5B069CF01F0007CDFBF01F0005EA +:10210800CCCB30091212CB9B069CF01F0002CECB21 +:1021180080002680EBCD40FC203DFACEFFD81497F6 +:102128007C037C1A10941892169E580BC4405809C8 +:102138005F1858A75F091268C34130063008FB686A +:10214800000B580EC430F4CC003AFAC9FFF5FC076E +:102158000D0A16985898F1DCE9082D0812F8149E13 +:10216800580ACF6112955806C0C10C970699089A6B +:102178000A9B049CF01F001A0E0C2FDDE3CD80FC97 +:102188005804C140EDB30001C1115802C230640ABD +:1021980032D9B48964082FF8850820143017CE7B0B +:1021A800580BCCC45C3E3016CCAB129532D83007F5 +:1021B8000AF8CDDB109A3308BA9B0699BA881A9B9D +:1021C800F01F00072FDDE3CD80FCFAC9FFF512955B +:1021D800CCBB32DCF01F0003CE1B00008000204C7B +:1021E80080002680D431201D189516971496178CD8 +:1021F800580CE08000B43004325132D033033092AE +:10220800E20C1800C1705805C6E06A09B28C6A0869 +:102218002FF88B082FF42FF70F8C580CCF21580567 +:10222800EBF91000F9B80100F3F81E00089C2FFD27 +:10223800D8322FF70F8A580ACF30E20A1800C500A3 +:10224800E00A1800F9BC0100F7B700FFF9BC00016B +:10225800EFFA0800C0482FF7A1BC0F8AE60A180059 +:10226800CFB0F4C80030E4081800E08B0063300BEE +:10227800F60B0028F40800182FF7F0CB00300F8A6F +:10228800F4C80030E4081800FE98FFF43738F00A64 +:102298001800C2C03648F00A1800C3403708F00AD0 +:1022A8001800C3E03788F00A1800C4503588F00ACF +:1022B8001800C4903758F00A1800C4803638F00A5D +:1022C8001800CAA16C08BA8830081899169ABA98E2 +:1022D8001A9B0A9C2FC6F01F00231804C9DB325C26 +:1022E8005805C941F01F0020C96B0D081899169AA6 +:1022F8000A9C49EB5808F00B1710F01F001A180435 +:10230800C8BB361916981AD930AA1ADC30196C0BC2 +:102318000A9C2FC6F01F00162FED1804C7DB3619CC +:10232800308A1AD916981ADA30096C0B310ACF1B81 +:10233800300BCADB169836191AD9310A1ADC30095B +:102348006C0BCE7B16983419CF8B361916981AD980 +:1023580030AA1ADC30096C0BCDCB1894C61B0000D0 +:102368008000204C80002680800034008000211CE2 +:10237800D401189BFACAFFFC300CF01F0002D802E7 +:10238800800021ECEBCD40E014951696A98CF01F47 +:1023980000095805C0A03007F01F0007EC070B0C18 +:1023A8002FF70E35FE9BFFFAF01F0004E3CD80E007 +:1023B80080002E7C80002F3080002D14EBCD40E073 +:1023C80014951696A98CF01F00095805C0A030076F +:1023D800EC07070C2FF7F01F00060E35FE9BFFFADF +:1023E800F01F0004E3CD80E080002D9C80002E20AB +:1023F80080002CC8EBCD4040204D49BCF8E80008CF +:10240800FAE90008F8EA0000498CFAEB0000304BC2 +:10241800F01F00171A9BFE7C2800F01F00163009D9 +:10242800FE7C2800129A129BF01F0013FE7C2800E5 +:10243800F01F0012302CF01F00121A96204DECE805 +:102448000008FAE90008ECEA0000E06CF980EA1CF0 +:102458000337FAEB0000F01F000B2FCD2FCDE3CD93 +:1024680080400000800034088000341880002C4030 +:1024780080002874800028B480002A2480002C70F2 +:1024880080002FF8EBCD40F8F01F0033F01F003329 +:102498004B3CF01F0034F01F00343018F00C1800CB +:1024A800C5204B2CF01F002FE06701004B0C3006B5 +:1024B800F01F002C4AF40E95C088E2675A4C0C179E +:1024C800E0470100EA0717B0E806000B0C9C0E9ADB +:1024D8000E06F01F0029E2465A4BFE98FFF0E0670F +:1024E80001004A6C3006F01F001F4A550E930E9AE1 +:1024F8004A3B0C9CF01F0023E80600093008EA0854 +:10250800070B138AF40B1800C1312FF82FF9103775 +:10251800FE9BFFF70E06E2465A4BE08B0019E26776 +:102528005A4C0C17E0470100E60717B0CE1BEC0821 +:1025380000081ADA494C1ADB1AD8F01F000A2FDDF6 +:10254800E3CF80F8491CF01F0007CAFB490CF01FB5 +:102558000005CF7B80002008800023FC80028E6C61 +:102568008000237880002FA480028E8480028E8CC5 +:1025780080003420800023C480028EAC0000000854 +:102588008000238C80028EC880028E7C80028EF4AC +:10259800EBCD4040303AE06B1B00EA1B00B7FE7CF5 +:1025A8000C00F01F001A30083019109B308AFE7C8E +:1025B8000C0031061AD6F01F001630083019109B8F +:1025C800129AFE7C0C00F01F0013300BFE7C0C00EE +:1025D800F01F0011FE7C0C00F01F00103009FE7C7B +:1025E8000C001AD9129B1AD91298129AF01F000CD3 +:1025F800301CF01F000C302BFE7C0C00F01F000A72 +:102608002FDDE3CD8040000080002B0C80002AB035 +:1026180080002AD280002AEA80002AF880002A6AEC +:1026280080002C8A80002B0248CD48D0E3B00001FE +:10263800D55348C048C10230C06248C2A505A1248C +:102648000230CFD348A048B10230C0623002300314 +:10265800A1220230CFE3488F000100008000320041 +:10266800000000080000000880028FC00000000879 +:10267800000001E88000248CD401189BFE7C18001F +:10268800F01F0002D802000080002742EBCD404036 +:10269800203D30083049FB680008BA383088500CB3 +:1026A8001696BAC8302BBAD9486CF01F00070C9A96 +:1026B8001A9BFE7C1800F01F00052FDDE3CD80403B +:1026C80080028F1C80002C40800027ACD401189B0E +:1026D800E06CE100F01F0002D802000080002694A0 +:1026E800D401F6081503A56B143BF9BE0810F00BCE +:1026F80017B0F9BE0B08F6091601F20A0039F20BF9 +:102708000D08109AF00B1603F6C80001E048FFFE0A +:10271800E08B00147818E8690000E418FFF7E01867 +:10272800FECF590EF9B9000010499919F1DAC00322 +:10273800F7E811089988D80ADA0A58ABC0F0E069B6 +:10274800270F7858EDB80001C051F1DBC00999781E +:102758005EFD5809C1002019CF5BE069270F785842 +:10276800EDB80001C04130D89978CEAB5809C030D7 +:102778002019CF6B5EFEE1B80000EDB80010C0E094 +:10278800D3033FF899387858D503300899189998A1 +:1027980099A8EA69610C99095EFC3FF8993878585C +:1027A800CF5BD703D421169714951896F01F002EE7 +:1027B8005807C2000FC93048F0091800E088001B0C +:1027C8003094E8091800E08B00160FD93078F0092A +:1027D8001800E08B00108E39E0680101F00919003B +:1027E800E08B0009EF3900083038F0091800E0885C +:1027F8000003DA2A0A9A6E0B0C9CF01F001C581C66 +:10280800CF900FC9E8091800C2906C182059F1E957 +:1028180010688D18EF3900086C1A0FD8A978F1E9FB +:1028280010E814488D1830288E39F0091900E0880E +:1028380000106C18ADB88D188EB920298DA96C18A8 +:10284800E018FFF08D183509300C8D09D8226C1866 +:102858005C79F1E910C88D18CF3B6C18B1B88D18A8 +:10286800CDAB00008000277E800026E8D401301818 +:10287800F739000DF0091800E0880005302E1C9C7F +:10288800D802E068008030199908300A7818F73BB8 +:10289800000D149EF1D9D00130F9F1DBD081F1DAC5 +:1028A800D0E1F1D9D20499181C9CD802EBCD408014 +:1028B8003018149E1297F00A18005FBAF00B18002F +:1028C8005FB91449C0B17818F1DBD021F1DED041ED +:1028D800F1D7D3089918E3CF8080302CE3CD8080DE +:1028E800D4017818189EEA18000F9918781CE21C71 +:1028F8000004C08030E8F00B1800E0880013302C8A +:10290800D8023038F00B1800FE9BFFFB7C1AF6C883 +:10291800FFF03019F20809495CD914699D19D802E9 +:102928007C19F6081510300CEA18FFF0E818FFFFBC +:1029380012689D18D802E0692710C0485809C0E0FD +:1029480020197848EDB80009CFA17818EA18000FC7 +:102958009918FC19010099095EFD5EFFEBCD40FC5A +:1029680030321893F73C000CE40C1800E08B000997 +:10297800F735000B3014E8051800E0880005302C06 +:10298800E3CD80FCF73E00083078F00E1800FE9882 +:10299800FFF83108F00E1800FE9BFFF37618F009D7 +:1029A8001601F4090009F2080D06ECCA0001E04A14 +:1029B80000FEFE9BFFE65806CE35FCC90008F80865 +:1029C8001601300AEC1C0001F5D8D001178EF5DC91 +:1029D800D021F7380009F5D5D061F5D9D084F73979 +:1029E800000AF5D6D108F5D8D208F5D9D308E80EEB +:1029F8001800C0F0C0B33028F00E1800C0D0E40EA4 +:102A08001800CBE187FAE3CF80FC87CAE3CF80FCCC +:102A180087DAE3CF80FC87EAE3CF80FC3018990897 +:102A28005EFCE0692710C0485809C0A02019784802 +:102A3800EDB80001CFA1F1DBC01099385EFD5EFF53 +:102A4800E0692710C0485809C0C020197848E21822 +:102A58000201E0480201CF817828300CB6085EFCFC +:102A68005EFFEBCD40E0FAC5FFF018976A166A0ED4 +:102A7800EDD6C003FDDEC001300CF9D6D003F9DE77 +:102A8800D0E1F9D6D103F9DED1E1F9DAD203F9DBE5 +:102A9800D2E1F9D8D303F9D9D3E18F1C6F58EDB837 +:102AA8000005CFD1E3CD80E0EBCD4040300E40268D +:102AB8002F8BFDD8D021FDD9D104FDDAD204FDD663 +:102AC800D306F80B092EE3CD80402F8BF5E91019BA +:102AD800F3E81029F80B0328F1D9D043F80B09289B +:102AE8005EFC2F8BF80B0328A1A8F80B09285EFCC5 +:102AF8007958EDB80000CFD15EFC7808F1DBD00240 +:102B080099085EFCEC5BBB9FE08B0018304B78A803 +:102B1800F1DBD00399A878A9F3DAD10399A9780849 +:102B2800A3A899087958EDB80007CFD178083019CB +:102B3800F1D9D00299085EFCE068C6BFEA18002DFA +:102B4800103BE088000CE0681200EA18007A103B9D +:102B5800F9BB0306F9BB0207CDBB305BCD9BC008B0 +:102B6800EBCD40C048E8E3B8000148E9300C7206F4 +:102B780048DE48E9FE770800720B580BC070721ADD +:102B8800300814AE2FF81638CFD3EE0C09262F894B +:102B98002FFC594CCF21E3CD80C0000080003200CB +:102BA8008000333C80002B6680028F20E068008321 +:102BB800FE790800F00C010CF20C032AF4C8FFC0DF +:102BC800F208032C580C5E0CF80812004859F0085B +:102BD800111FF20A0039721AF408032C5EFC000077 +:102BE80080028F20F8081605F0091508E029F00082 +:102BF800581BC150C0823018F00C094C936C93AC30 +:102C0800932C5EFD582BC110583BC0205EFF301836 +:102C1800F00C094C935C939C932C5EFDF60C094CCC +:102C2800935C93AC932C5EFD3018F00C094C936CBC +:102C3800939C932C5EFDD703D42118961694580BB9 +:102C4800C0F030050A970D9B0D8C2FF72FE6F01F6B +:102C5800000618450E34FE9BFFF80A9CD8221695EC +:102C6800CFDB000080002BEC3018F00C0948A59C45 +:102C7800A96CE02CF000F9480054F9480044991870 +:102C88005EFCFE6914007208F1DCD0C193085EFC9A +:102C9800D401580BC091F8CBFFFEFE7C28005C5B8A +:102CA800F01F0006D802F8CBFFFEFE7C28005C5B14 +:102CB800F01F0003D80200008000293E800028E8A9 +:102CC800EBCD408048E76E0CF1DCC008C0D0300B7B +:102CD800FE7C2800F01F000B6E08F0CCFFFF8F0C65 +:102CE800F1DCC008CF51F9DCC288300BF01F0006B8 +:102CF80030194868B089E3CD80800000000001E009 +:102D080080002A2A80002C98000001E4D401486839 +:102D1800300B700CF9DCC288F01F000430094848F9 +:102D2800B089D802000001E080002C98000001E47E +:102D3800EBCD40C0201D301B49366C0CF9DCC28835 +:102D4800F01F0012E06B00D7FE7C2800F01F001077 +:102D5800FAC7FFFEE06B00FFFE7C2800F01F000CA6 +:102D68000E9BFE7C2800F01F000B9A98EDB8000718 +:102D7800CF216C0C300BF9DCC288F01F00042FFD4A +:102D8800E3CD80C0000001E080002C9880002A2A52 +:102D980080002A48EBCD40C0201D49B6A96C8D0C97 +:102DA80049A730080F89F0091800C030F01F001833 +:102DB80030086C0CAE88F9DCC288301BF01F001597 +:102DC800E06B0082FE7C2800F01F00136C08F7D827 +:102DD800C008F1D8C10CFAC6FFFCF7E8109BFE7CCE +:102DE80028000CDBB18BF01F000C0DABFE7C28001B +:102DF800F01F00090DBBFE7C2800F01F00072FFD07 +:102E0800E3CF90C0000001E0000001E480002D380D +:102E180080002C9880002A2AEBCD40E049151896AE +:102E28000B893008F0091800C16148F70C9BFE7C3B +:102E38002800F01F000E6E08F0CCFFFF8F0CF7DCA7 +:102E4800C008C071F9DCC288F01F00093018AA88D0 +:102E5800E3CF90E048476E0CA98CF01F0006CE7BAC +:102E6800000001E4000001E080002A2A80002C987C +:102E780080002D9CEBCD40C0201D4A76A96C8D0C9E +:102E88004A6730080F89F0091800C030F01F002485 +:102E980030086C0CAE88F9DCC288301BF01F0021AA +:102EA800E06B00D2FE7C2800F01F001F6C08F7D8EA +:102EB800C008F1D8C10CFAC6FFFCF7E8109BFE7CED +:102EC80028000CDBB18BF01F00180DABFE7C28002E +:102ED800F01F00150DBBFE7C2800F01F0013E06BEF +:102EE80000FFFE7C2800F01F0010E06B00FFFE7C56 +:102EF8002800F01F000DE06B00FFFE7C2800F01F8B +:102F0800000AE06B00FFFE7C2800F01F00072FFD81 +:102F1800E3CF90C0000001E0000001E480002D38FC +:102F280080002C9880002A2AEBCD40C0201D4966DD +:102F380030090D88F2081800C1F14947E06B00FF1D +:102F4800FE7C2800F01F0012FACBFFFEFE7C280052 +:102F5800F01F00106E08F0CCFFFF8F0CF7DCC008E4 +:102F6800C071F9DCC288F01F000C3018AC881BBC9B +:102F78002FFDE3CD80C04857AC896E0CA98CF01F9B +:102F88000007CDDB000001E4000001E080002A2AF0 +:102F980080002A4880002C9880002E7CEBCD404091 +:102FA800201D3008FAC6FFFC301B0CE8300CF01F5F +:102FB800000EE06B00D7FE7C2800F01F000CE06BD1 +:102FC80000FFFE7C2800F01F00090C9BFE7C2800F7 +:102FD800F01F0007300B169CF01F00032FFDE3CFF6 +:102FE8009040000080002C9880002A2A80002A48FF +:102FF800EBCD40E03028FAC7FFF01896AE88109560 +:10300800C028AE880C9A0E9BFE7C2800F01F000892 +:10301800C0C10F882FF85C58EA081800FE98FFF323 +:103028004848B08CE3CF90E0E3CF80E0800029648B +:04303800000001E4AF +:10320000C0080000C0080000C0080000C00800009E +:10321000C0080000C0080000C0080000C00800008E +:10322000C0080000C0080000C0080000C00800007E +:10323000C0080000C0080000C0080000C00800006E +:10324000C0080000C00800000000000000000000EE +:10325000C0080000000000000000000000000000A6 +:10326000C008000000000000000000000000000096 +:10327000C008000000000000000000000000000086 +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:10330000C0080000300CF01F0012580CF80F171006 +:10331000D603301CF01F000E580CF80F1710D60300 +:10332000302CF01F000B580CF80F1710D603303C50 +:10333000F01F0007580CF80F1710D6030000010407 +:103340004000011280000120C000012E80002BB43B +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:10340000286E756C6C2900000200000000B71B00DC +:1034100008000001000100000F011101100113015B +:103420001061040000000000300000001061040082 +:103430003861040000000000020000002061040068 +:10344000306104000000000004000000306104004E +:1034500000000000000000000000000010610400F7 +:103460003C0000000000EEEEEEEE18F09FE518F0D4 +:103470009FE518F09FE518F09FE50000A0E118F027 +:103480009FE518F09FE544000000B4080000B40870 +:103490000000B4080000B408000000000000E408C8 +:1034A00000003C003C00000000090000000000009B +:1034B00000000FE11F00C0E3130080E3C00080E3C1 +:1034C00000F02FE11CF09FE53D0200EB5A0200EBFB +:1034D0008D0200EB01008FE210FF2FE141F0DEFBD7 +:1034E00001F0DCFD3C0078000000FEE700005C001D +:1034F00000007847C046010000EA7847C046170040 +:1035000000EA8C119FE5002091E500300FE1841165 +:103510009FE5FD20A1E880019FE580219FE5012036 +:1035200042E00D0040E03C00B4000000020050E129 +:10353000280000AA68019FE50D0050E1020000BAD2 +:10354000042010E4042081E4FAFFFFEA58119FE50B +:1035500058019FE5000081E53C119FE550019FE582 +:10356000000081E51EFF2FE13C00F0000000481143 +:103570009FE5000091E524119FE5000081E52C11F5 +:103580009FE538019FE5000081E51EFF2FE17402F1 +:1035900000EB10019FE528119FE5042091E4042031 +:1035A00000E404219FE5020051E13C002C010000F1 +:1035B000FAFFFF1AF0109FE5FD20B1E803F02FE1BC +:1035C000E0109FE5002081E5E8109FE5F4209FE5ED +:1035D000002081E5021080E2000020E0010040E2CE +:1035E00011FF2FE101008FE210FF2FE13C00680185 +:1035F000000001F09CF87847000001008FE210FF06 +:103600002FE101F094F87847000003002DE9001045 +:103610000FE1001080E5B8109FE5041080E5001070 +:10362000A0E1100080E2FC1FA0E80020A0E13C0027 +:10363000A40100000130A0E10300BDE8080083E51B +:103640000C1083E5D300A0E300F021E10060A2E8C4 +:1036500000104FE1041082E4D200A0E300F021E169 +:103660000060A2E800104FE1041082E4D100A0E362 +:103670003C00E001000000F021E1007FA2E8001022 +:103680004FE1041082E4D700A0E300F021E10060E4 +:10369000A2E800104FE1041082E4DB00A0E300F098 +:1036A00021E10060A2E800104FE1001082E5000077 +:1036B00093E53C001C02000000F02FE11EFF2FE10B +:1036C000200000000403000020EE0100D8030000E9 +:1036D0000000000018F09FE5100100000803000042 +:1036E000EEEEEEEE2403000020020000B0B5041C54 +:1036F000631C0B4D3C005802000001D16C6910E0C6 +:1037000000F06CFB0948FFF70CFFEC60084A5168B9 +:1037100050688842FCD00220287001218A2001F0E4 +:1037200012F8201CB0BD3000070051020000000359 +:103730000700B0B5051C3C0094020000002400F016 +:1037400050FB1448FFF7F0FE13491448C1600121F3 +:10375000134A490391601349CA7808239A43CA70EF +:10376000CA7804231A43CA706B1C0DD00E4B5A68DA +:1037700059689142FCD0BE213C00D0020000197370 +:10378000197A112291431972197AC907FCD40221BE +:103790000170FFF7D0FE201CB0BD91020000FFFFBA +:1037A000FF003000070000100700000007000003C2 +:1037B000070000000000000000003C000C030000B7 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F0000000000000000000000000003C00480342 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:1038300000000000000000000000000000003C004C +:1038400084030000000000000000000000000000F1 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880003C00C00300000000000000000000000039 +:1038900000000000000000000000000000000047E1 +:1038A000084710471847204728473047384710B582 +:1038B000041C101C00F023F903C410BC08BC1847FA +:1038C00000003C00FC03000010B4042A0ED3031CCB +:1038D0000B439B070AD108C810C9A34202D1043A7E +:1038E000042AF8D2A34201D004380439002A02D1B4 +:1038F000002010BC7047D30701D5013205E00378E2 +:103900000C7801313C00380400000130A34207D19B +:1039100003780C7801310130A34201D1023AF1D190 +:10392000181BE9E70000784700000020A0E304002E +:1039300051E30800003A03C010E20D00000A04C081 +:103940006CE202005CE33C00740400000120C0E46F +:103950000120C0A40120C0C40C1041E0060000EA10 +:1039600081CFB0E10120C0240120C0240120C04447 +:103970001EFF2FE1784700000020A0E300402DE962 +:103980000230A0E102C0A0E13C00B004000002E06F +:10399000A0E1201051E20C50A0280C50A0282010CB +:1039A0005122FBFFFF2A011EB0E10C50A0280C00A1 +:1039B000A0480040BDE80111B0E1042080241EFFB2 +:1039C0002F010120C0440120C0443C00EC04000051 +:1039D000400411E30120C0141EFF2FE178470000CE +:1039E000030052E33E00009A03C010E20800000A00 +:1039F0000130D1E402005CE30C2082E001C0D194EC +:103A00000130C0E40130D134042042E23C002805FA +:103A1000000001C0C0940130C034033011E21E0028 +:103A2000000A042052E22F00003A03C031E70200EE +:103A300053E30800000A0F00008A2C34A0E104C000 +:103A4000B1E5042052E20C3C83E1043080E43C0008 +:103A500064050000F9FFFF2A011081E2230000EA5B +:103A60002C38A0E104C0B1E5042052E20C3883E117 +:103A7000043080E4F9FFFF2A021081E21B0000EA13 +:103A80002C3CA0E104C0B1E5042052E20C3483E1F7 +:103A90003C00A0050000043080E4F9FFFF2A031079 +:103AA00081E2130000EA7847000010402DE9202051 +:103AB00052E20500003A1850B1281850A0281850BA +:103AC000B1281850A02820205222F9FFFF2A02CE48 +:103AD000B0E13C00DC0500001850B1281850A028C7 +:103AE0001800B1481800A0481040BDE802CFB0E16E +:103AF00004309124043080241EFF2F01822FB0E176 +:103B00000120D1440130D12401C0D1240120C0447E +:103B10000130C0243C001806000001C0C0241EFF74 +:103B20002FE178470000FF3001E20210A0E10324FA +:103B300083E1022882E188FFFFEA784700008024C1 +:103B400010E200006042413032E000106122A1C169 +:103B500070E02000003A3C005406000021C470E0F0 +:103B60000F00003A0004A0E1FF2482E321C270E0CC +:103B70001700003A21C470E00900003A0004A0E1F7 +:103B8000FF2882E321C470E00004A021FF2C8223DF +:103B900021C270E00E00003A3C009006000000C018 +:103BA00070E28300002A2004A021A1C370E08013EA +:103BB00041200220A2E021C370E000134120022036 +:103BC000A2E0A1C270E0801241200220A2E021C246 +:103BD00070E0001241200220A2E03C00CC06000070 +:103BE000A1C170E0801141200220A2E021C170E05B +:103BF000001141200220A2E0A1C070E0801041200D +:103C00000220A2E001C070E0001041200220B2E0DA +:103C1000E5FFFF2AC30F32E0A30F80E03C00080756 +:103C20000000001061221EFF2FE1784700000020F5 +:103C3000A0E3A1C170E02000003A21C470E00F00B1 +:103C4000003A0004A0E1FF2482E321C270E01700E3 +:103C5000003A21C470E00900003A0004A0E13C00F1 +:103C600044070000FF2882E321C470E00004A02183 +:103C7000FF2C822321C270E00E00003A00C070E2E7 +:103C80005000002A2004A021A1C370E0801341202D +:103C90000220A2E021C370E0001341200220A2E034 +:103CA0003C0080070000A1C270E080124120022089 +:103CB000A2E021C270E0001241200220A2E0A1C1D6 +:103CC00070E0801141200220A2E021C170E00011CB +:103CD00041200220A2E0A1C070E08010412002201B +:103CE000A2E03C00BC07000001C070E000104120D1 +:103CF0000220B2E0E5FFFF2A0200A0E11EFF2FE153 +:103D0000784700000A1040E2200140E0200280E0F5 +:103D1000200480E0200880E0A001A0E1002180E0F4 +:103D2000821051E03C00F8070000010080520A10A8 +:103D300081421EFF2FE130B4441C810708D0017876 +:103D40000130002902D1001B30BC70478107F6D139 +:103D50000B4AD50102C88B1A8B432B40FAD0001BAB +:103D60000A0601D103383C0034080000EFE70A04DA +:103D7000120E01D10238EAE70902090EE7D1013833 +:103D8000E5E7000001010101F0B4031C041C0C4331 +:103D9000A4070CD1104DEF0102E00431043A10C326 +:103DA000042A04D30C68661B3C0070080000A6437C +:103DB0003E40F5D0002A07D00C7801311C70013349 +:103DC000002C03D0013AF7D1F0BC7047012AFBD98F +:103DD000511E00221A7001330139FBD1F4E70101B1 +:103DE0000101784700000200A0E33C00AC0800009D +:103DF0000210A0E32EFEFFEA1F402DE900000FE1B4 +:103E0000C00080E300F02FE18100A0E30210A0E3F6 +:103E100001208FE212FF2FE100F0E6FC784700005E +:103E20001F40BDE8FEFFFFEA1F502DE93C00E808F7 +:103E3000000001008FE210FF2FE100F040FB784707 +:103E400000001F50BDE804F05EE21F502DE90100A4 +:103E50008FE210FF2FE100F018FB784700001F50A1 +:103E6000BDE804F05EE200BD01B500A000473C00E3 +:103E70002409000000300FE1C030C3E303F021E16A +:103E800001008FE210FF2FE101BD01B500A0004746 +:103E900000300FE1C03083E303F021E101008FE245 +:103EA00010FF2FE101BD000018009FE5041090E411 +:103EB0003C0060090000000051E30200000A0420F9 +:103EC00090E4002081E5F9FFFFEA0EF0A0E17C0913 +:103ED0000000000000004400000044000000D8037F +:103EE0000000D8030000D80300000000000000001C +:103EF00000003C009C090000440000004400000059 +:103F0000440000000080010000800100108E0100CC +:103F1000108E010088F8010001000000001004006C +:103F2000C433040000000400000000000E50A0E1B3 +:103F300058409FE53C00D8090000040094E40100CB +:103F400050E305F0A001041094E4042094E403007D +:103F500000EB040094E4041094E4070000EBF5FF88 +:103F6000FFEA010050E10EF0A001020051E104302F +:103F70009014043081143C00140A0000FBFFFF1A67 +:103F80000EF0A0E114209FE5002092E5010050E131 +:103F900004208014FCFFFF1A0EF0A0E1800900004D +:103FA000CC0900000008000020E60100130000001A +:103FB0005356435F000400003C00500A000020EE0E +:103FC0000100120000004952515F0002000020F27F +:103FD0000100110000004649515F8000000020F4FC +:103FE0000100170000004142545F00000000A0F4EF +:103FF00001001B000000554E445F3C008C0A00008D +:1040000000000000A0F401001F0000005553525FA3 +:10401000010000000E50A0E100600FE18C409FE520 +:10402000041094E4010051E30900000A040094E440 +:10403000011080E00310C1E3042094E43C00C80AAE +:104040000000C02082E302F02FE104D041E204200E +:1040500094E4130000EBF2FFFFEA06F02FE105F015 +:10406000A0E10E50A0E100600FE144409FE5041084 +:1040700094E4010051E30800000A040094E43C00C9 +:10408000040B0000011080E00310C1E3042094E45D +:10409000C02082E302F02FE104D041E2042094E446 +:1040A000F3FFFFEA06F02FE105F0A0E1010050E187 +:1040B00004208014FCFFFF1A0EF0A0E13C0A00006F +:1040C0003C00400B00000160C046C046C04670473F +:1040D0000000101E10EE020011E3FCFFFF1A100E8C +:1040E00001EE101E10EE020011E3FCFFFF1A1EFF8E +:1040F0002FE1101E10EE010011E30300000A101E54 +:1041000011EE3C007C0B0000001080E50100A0E3F4 +:104110001EFF2FE1000020E01EFF2FE18D46974695 +:104120007847C04678FDFFEA10B5041C032801D982 +:1041300000F0ACFB0C484068002800D003240B487A +:10414000016809483C00B80B00001230002905D076 +:1041500006216143405CC300181804E00621614356 +:10416000405C142358430A300006000E10BDD47A78 +:104170000100A869010080B5094A0949032000F03F +:10418000F2F9084908203C00F40B00000860486080 +:1041900007491D2001F0B2FC06491E2001F0AEFCCB +:1041A00080BD0000006C01003127000000100700F6 +:1041B0002925000031250000054980B508208860C8 +:1041C0001D2001F0BFFC1E203C00300C000001F05F +:1041D000BCFC80BD000000100700021C081CD12A96 +:1041E00080B501D105F019FC80BD034980B50020E0 +:1041F0000880052005F0D5FB80BDB074010080B5B6 +:10420000542801D106F0CDF880BD3C006C0C0000B4 +:10421000B0B5104D021C0124012A0D48296806D0B2 +:10422000C42A03D16A68002A05D0AC60B0BD0EF084 +:1042300089FB6C6008E00022AA606C600EF082FBD3 +:104240000021042012F0C8FC06F0D8F83C00A80CAD +:104250000000B0BD0000C4600100BC740100054A4C +:104260005169081A116909681031814201D85061F9 +:104270007047002070478C6E010001494968401A60 +:1042800070478C6E010001484069704700003C0097 +:10429000E40C00008C6E0100024A5169081850615C +:1042A000704700008C6E01000E490F4810B51922AE +:1042B000920141608918C1600B4900220C310160F4 +:1042C0000A49826009680123DB03C918084C41616F +:1042D0003C00200D00002168002902D0074901613F +:1042E00001E000F00CF8226010BD44DC01008C6E8F +:1042F0000100C809000034580100C4090000014849 +:10430000024908617047C80900008C6E0100082846 +:1043100005D23C005C0D0000034B8000195002499F +:1043200020310A5070470000646D010070B5061C12 +:104330000D480D1C0068141C002803D1201C00F03F +:1043400009FC70BD280601D500F022FE221C291CA4 +:10435000301C08F03C00980D0000DDFD011C0348F6 +:1043600054304369321CFFF71BFB70BD0000506DD9 +:104370000100F8B5061C0D481F1C0068151C0C1C1C +:10438000002802D1281C00F0E8FB200601D500F02F +:1043900002FE2A1C211C3C00D40D0000301C08F039 +:1043A000BDFD011C0348543043693A1CFFF7FBFA7A +:1043B000F8BD0000506D0100F8B5F1284ED12A4833 +:1043C00069468269FFF7EEFA274900265439C86822 +:1043D0008B68C2000130D5183C00100E0000072881 +:1043E000C86000D1CE6022486C680068002803D005 +:1043F0000021201C08F03BFB6E6025682089A9780D +:104400000239401AE978401A2081A8782818023821 +:1044100020606E782878082817D23C004C0E0000E7 +:10442000300607D5271C201C00F07AFC041C381C21 +:1044300000F09CFB28780F49403980000A58002A78 +:1044400004D0311C201CFFF7B3FA08E0052100E07E +:104450000421062000F010FA201C00F03C00880E19 +:10446000000087FB300601D500F0A1FDF8BD012159 +:10447000062000F004FAF9E70000A46D0100CC5C0E +:104480000100F8B51A4D194F01245435291C032099 +:104490007C60174B184A05F0F4FB002802D03C0062 +:1044A000C40E0000002038601FE03C600721281C7B +:1044B000EA69FFF783FA382000F080FC0024B86036 +:1044C000B868E60035186846022100F075FB2860E0 +:1044D000281C00F0A5FDB868815906485430026ACE +:1044E0003C00000F0000FFF76CFA0134072CEADBF8 +:1044F0000020F8603861F8BD0000506D0100819A1D +:104500000000619A0000054880B50068002805D0C9 +:1045100003485430426A0021FFF753FA80BD506DC2 +:1045200001003C003C0F00007047000070B50A4ECF +:10453000094D084C083EA169002907D03068416048 +:10454000007B81006958FFF73EFAF4E70349022037 +:10455000087070BD00100700E07E01000002070037 +:1045600070B50A4E3C00780F0000094D084C083E1B +:10457000E169002907D070684160007B81006958BB +:10458000FFF724FAF4E703490220087070BD001019 +:104590000700E07E010000020700B0B5094D041CD1 +:1045A000281C202240303C00B40F00000549FFF7D2 +:1045B0009FFAE068E86020692861A06AA8626068E4 +:1045C0006860B0BD7052010000100700F8B500240B +:1045D0000023202801DB012407E0084E8000355825 +:1045E000074FBD4200D02B1C3C00F00F00003150A3 +:1045F0001360002C03D0211C822000F052F9201CF3 +:10460000F8BDE07E010075750000B0B50B4D041CCF +:10461000286800280FD0201C12F0B7FD00280AD00F +:10462000217A287A0A070007000F3C002C100000AE +:10463000120F9042297201D00120B0BD0020B0BD00 +:1046400070780100F0B5424E051C306885B0002836 +:1046500063D000240020002D06D06978182903D1EA +:10466000E979012900D10120002845D03C006810DB +:1046700000000020B07281004A19937A5906890F10 +:10468000DB0604D5B37A01278F403B43B372D27A5D +:1046900013091207120F934205D301228A401443D3 +:1046A00001AA8900505001300428E4DBB07A3C00B4 +:1046B000A4100000204001070DD5410709D5C1070E +:1046C00005D5810701D5002405E0029902E0019992 +:1046D00000E003990491410709D5C10705D5810779 +:1046E00001D5002403E0029900E001990391C1077C +:1046F0003C00E010000005D5810701D5002401E051 +:1047000002990191800701D5002422E00F2C20D1CD +:10471000706800280BD0049A02AB00920ACB019A71 +:10472000281C0BF08AFB0020706010E017E0307A44 +:10473000297A3C001C11000000070907090F000F2F +:10474000884207D0049A02AB00920ACB019A281C37 +:104750000BF076FB287A307201200F2C00D000205D +:1047600005B0F0BD0120FBE7707801000D4A70B57F +:10477000116800203C005811000000290ED0117A69 +:1047800009060BD5537A947A032101252A1C8A4005 +:104790001E1C164003D0224001D1012070BDFF3104 +:1047A00009060916F2D570BD00007078010010B539 +:1047B000084C206800283C009411000004D0606878 +:1047C000002801D10BF0C0FB00200021002207C40B +:1047D0000C3C0120606010BD70780100014901208F +:1047E0000860704770780100F8B50E4D041C002079 +:1047F0006872201C12F0DEFC3C00D0110000002882 +:1048000012D00020032101220F1A161C237ABE4069 +:10481000334004D06B7A161C864033436B720130F0 +:104820000006000E0328EFD9F8BD70780100920051 +:1048300051188A7A1207120F02703C000C12000005 +:10484000CA7A1207120F4270CA7A12098270097B63 +:1048500081807047034A0F21527A0120914300D092 +:10486000002070477078010040070549400F054A55 +:104870000956527A01200A4000D100203C0048121B +:104880000000704700005E46010070780100124A87 +:1048900070B5537A947AFF20032101252A1C8A409F +:1048A0001E1C164014D0224012D10806000E07D05C +:1048B000012807D0022807D0032807D107203C0091 +:1048C0008412000070BD032070BD012070BD052062 +:1048D00070BDFF2070BDFF3109060916E1D570BD1E +:1048E00070780100F8B5041C13480D1C816800297C +:1048F00005D0017B002901D104734573F8BD0F4E2B +:104900003C00C0120000311C20318A7900AB1A70C3 +:10491000C97959704268002A07D020022843011C37 +:104920000020FFF77EF8002804D12A1C211C00205B +:1049300011F00FF800AB1888F084E2E70000885A05 +:1049400001003C00FC1200000010070080B50121AE +:104950008120FFF7CDFF80BD0149012088607047AD +:10496000885A0100054980B500208860087B00282E +:1049700002D0497BFFF7BCFF80BD0000885A0100D0 +:10498000024A011C3C003813000050685160704717 +:104990000000885A010010B50C1C07F064FA04618D +:1049A000002010BD0000FFB50E1C1F1C382081B078 +:1049B00000F03DFA1D49041C4869002801D14C61F2 +:1049C00000E0046030013C0074130000009000041B +:1049D000000C00F015FA051C0099FFF78BF8002079 +:1049E000731E04E001014A1910326A5001309842E6 +:1049F000F8D300012D503821201CFFF77BF8A5606B +:104A00006560E6850C2060863C00B0130000AF2096 +:104A10008001E0610E20E086002020600198E060C7 +:104A2000386860610399044808600448386005B03C +:104A30000020F0BD0000FC5A0100DD150100FD164C +:104A40000100021C081CF02A80B53C00EC13000099 +:104A500004D0F12A07D106F009FB80BD07F00CFA5B +:104A60000DF0A8FA80BD01210220FFF74DFF80BDA7 +:104A70000149002048617047FC5A0100002802D01B +:104A8000002900D0C1607047F8B5171C3C002814FD +:104A900000000E1C051C1C1C1C3007F0C8F8016926 +:104AA000426980688919891A814206D2231C3A1CFE +:104AB000311C281C00F005F8F8BD0020386020608B +:104AC000FAE7FFB585B0059801270E1C1C303C00A5 +:104AD0006414000007F0AEF8041C808804300390D2 +:104AE0002C48049080790290A069B04217D2351A00 +:104AF00011E00398FFF716FC002806D101218E2053 +:104B0000FFF708FF0025002705E02168016020600D +:104B10003C00A0140000A0690130A061013DEBD26F +:104B2000002F35D0A069801BA06120698019206109 +:104B30006169401AE168884203D907218E20FFF796 +:104B4000ECFE25682F1C701E019500E03F680138BF +:104B5000FCD23C00DC140000386820600298049904 +:104B600088712E682C60321D0092291C2031012290 +:104B7000281D059B08F07AFCBD4201D0351CF0E7EA +:104B800000203861019807990430086008980437BC +:104B9000076009B03C0018150000F0BD02980499A8 +:104BA0008871F9E700002010070038B5041C151CB7 +:104BB00000200C6009E0E268201C0092A38A2168B2 +:104BC000A26908F056FC201CE468002CF3D1286090 +:104BD00038BD80B50CE03C0054150000C2688A4224 +:104BE00008D10021C160002803D106218E20FFF7E3 +:104BF0009DFE80BD101C0028F7D0EFE710B5041C07 +:104C00000CD0A069002806D12069002803D006F046 +:104C1000F7FD00202061201C3C009015000006F0EC +:104C2000F2FD10BD000010B5002809D0C46803E0F3 +:104C3000FFF7E7FF201CF9E7002CF9D1FFF7E1FFB0 +:104C400010BD011C002004E00A89C9681018000486 +:104C5000000C0029F8D1704700003C00CC15000082 +:104C600000E0081CC1680029FBD17047F8B5061C9C +:104C70000C1C1C2000F068FA051C002E01D1002C31 +:104C800002D1301C012103E0201C00F05DFA00215C +:104C9000002200920A1C011C231C281C3C00081640 +:104CA000000008F0F2FB281CF8BDB0B503329208F2 +:104CB00092001404240C09191D1CC9180904090CBC +:104CC000FFF7D7FF018902681219091B491B02600F +:104CD0000181B0BD0000F8B50A4CA021201C3C00A9 +:104CE00044160000FEF72AFF0020261CA036074DC0 +:104CF00007E00C21414349190EC9271D0EC7203476 +:104D00000130A642F5D1F8BDD05C0100C83F0100DA +:104D1000F7B5C468061C0025002C82B023D020897A +:104D20003C0080160000904220D3E168871A019170 +:104D30000021E16003990020FFF7A1FF051C2089F5 +:104D4000C01B20812A680399301C00F016F82089C6 +:104D5000C01920810199201CFFF7B1FE211C281CDD +:104D6000FFF73C00BC160000ADFE291C301CFFF70D +:104D7000A9FE0120002D00D1002005B0F0BD0000EB +:104D8000F7B5041C0E1C002001E0201C0C1CE1687F +:104D90000029FAD12789B7420AD3B81B0004000CB6 +:104DA000208121683C00F816000009180298321C86 +:104DB000FEF7FBFEFEBDF11B0D042D0C002819D0E3 +:104DC0000189A94216D3491B0904090C0181006815 +:104DD000411802982A1CFEF7E8FE21680298721B0F +:104DE0004019FEF7E2FE3C00341700002089C01B8A +:104DF00020812068C0192060DFE703218E20FFF7A3 +:104E0000ADFDDAE7F8B5041C002613E02189002087 +:104E1000FFF73EFF051C228921680068FEF7C8FEE7 +:104E2000002E01D12E1C03E03C0070170000291C4D +:104E3000381CFFF750FEE4682F1C002CE9D1301C11 +:104E4000F8BDB0B5041C0089401A050420682D0C7B +:104E50004018291CFFF71FFF2189491B2181E168A8 +:104E6000C160E060B0BD10B503303C00AC1700007D +:104E7000094A810810683D24084B6401890009181B +:104E80001B19994201D8116010BD0F218020FFF736 +:104E90006BFD002010BD0000B4CF010014C801005C +:104EA00010B511F061FF041C03D10D213C00E8177F +:104EB00000008020FFF75BFD201C10BD0000B0B596 +:104EC000011F0B680D480022834204D001321030CC +:104ED000032AF9D301E0032A06D30924211C8020E8 +:104EE000FFF745FD201CB0BD054B00249A793C001E +:104EF0002418000085680D6081609A71F5E7000054 +:104F00002057010020100700B0B50021104A0023EF +:104F1000D468844204D201331032032BF8D301E069 +:104F2000032B01D304210EE00A4CA37990680028DA +:104F30003C006018000002D1A371032106E005685F +:104F40009560A371002901D104C0B0BD8020FFF796 +:104F500014FD0020B0BD2057010020100700A03034 +:104F6000008A4007400F08280FD201A31B5C5B009A +:104F70009F443C009C18000005030305070709092E +:104F800001207047002070470220704703207047BF +:104F900004207047B0B5104D6869002807D00E494D +:104FA00000222C3103C90143032006F0CFFF0B4C34 +:104FB000002203CC3C00D8180000083C0143032029 +:104FC00006F0AFFF03CC084307494A6802434A6032 +:104FD0008A681043886001206861B0BD0000647376 +:104FE0000100B058010010000700B0B50C1C0FF014 +:104FF000A8FA054DE86A3C0014190000002806D103 +:10500000002C04D0201C0FF0B7FD01202870B0BD8B +:10501000F46E0100054980B5886A002804DA002092 +:10502000886201210DF042FD80BD0000AC7E0100D0 +:10503000F8B51E4D041C00203C00501900006862A9 +:10504000A8701C480078C00722D5B82003591A4818 +:1050500000780E2809D10A1C803206D0184E0D2087 +:10506000325C8A4201DD0138FAD1591E0B061B0E53 +:10507000AB70AB620E280BD208E03C008C1900002C +:105080006218B032127B824202D8581AA86202E03B +:1050900001390029F4DA0EF035F9009000AB1878E8 +:1050A0005978814200D95878ED30E8700121201CF0 +:1050B0000DF002FDF8BD0000AC7E01003C00C819F7 +:1050C00000001D75010011670100C75201000E4963 +:1050D00010B508698B68C200D4186268002A0FD125 +:1050E00001300861072801D100200861201C00F070 +:1050F00024F8054821685430026AFEF7ECFC3C00B5 +:10510000041A000010BD06210620FFF74BFC10BD5D +:10511000506D010008490979C907084A08D400E020 +:10512000081CC1680029FBD101890431018100E01C +:105130000020D0627047000060800700046C01000E +:105140003C00401A000010B5041C19218901002000 +:10515000FFF7C5FD011C60602068FFF7E0FC606898 +:1051600021680830086010BD00000A2801DA042018 +:1051700004E0502801DA052000E00720044A1178F5 +:1051800038233C007C1A0000C000184099430843B3 +:105190001070704788000700B0B5051C07484068CC +:1051A00008E00169A94204D1446805F0C7FD201C4C +:1051B00000E040680028F4D1B0BD0000587501003F +:1051C000F8B500253C00B81A000006F084FD114F28 +:1051D000041CBE792068002807D1A0880430FFF79E +:1051E000F2F8002806D101210FE001682160A169D1 +:1051F0000139A16110C0051C20690130206161697D +:10520000401AE16888423C00F41A000003D90721E3 +:105210008E20FFF7D3FBBE71281CF8BD20100700BD +:10522000B0B509F0BBFF2F4C0028207403D001213A +:1052300001200AF071FC2B4D1435286800284DD050 +:1052400001210F2011F082FD3C00301B0000288955 +:1052500008F0FBFF011C01220F2011F040FDE07857 +:105260000125022836D10AF0C6F800280AD00BF032 +:1052700092FB1E490968401811F05FF8002801D11F +:1052800002202FE0E078022824D13C006C1B0000B3 +:1052900060702570606801281CD015481038817B2B +:1052A000002904D185730F20134910F001FC08F088 +:1052B0004FFE002807D00E4801219838006901F000 +:1052C000B7FD002805D001200EF00CFD3C00A81B06 +:1052D000000001200EF01DFCB0BD05F0DCFEB0BDED +:1052E000E078002801D12570F7E7032000E00420D2 +:1052F0000DF08DFAB0BD846601006C570100E90322 +:10530000010070B5041C002100200A4D00E03C00A3 +:10531000E41B00000131CB005A191679012E02D08E +:105320005279A24202D00B29F4D370BD0B29FCD2D2 +:10533000C80001215A192858117170BD3858010050 +:10534000054880B5007F2423044958434018006A6B +:105350003C00201C0000FEF7DAFB80BD0000D47981 +:1053600001009446010080B504F037FF002011F0E1 +:1053700084FC002080BDB0B5054C051C206BE16AA3 +:1053800002F0E3FD291CA06A02F011FBB0BDA46C81 +:1053900001003C005C1C0000B0B5031C081C141C80 +:1053A000002B0C4D09D06969890001310A04120CE7 +:1053B0002280291CFEF73EFC0AE0011C281C2288E2 +:1053C000FEF738FC2088012802D98008013868617E +:1053D0000120B0BD3C00981C0000206E0100F1B51A +:1053E00000980026C168086809891C2934D3C1883F +:1053F000FF23013399422FD10188C91A2CD141884A +:10540000082929D10179062926D14179042923D1F6 +:1054100000250024071C3C00D41C000018370BE0BA +:10542000A000411804310422381CFEF78BFB002831 +:1054300001D1012504E001340A494869A042EFD8AE +:105440000849087800280AD0012801D0022806D18E +:10545000002D04D10098C0683C00101D0000FFF72B +:1054600042FC0126301CF8BD0000206E01000148FE +:10547000406870470000206E01000249486001202A +:10548000486170470000206E010070B5041C0126C1 +:1054900003F0EFFA251C103500283C004C1D0000DD +:1054A00004D00020207703F0F1FB07E003F038FD83 +:1054B000002809D00120207703F0CEFC011C062231 +:1054C000281CFEF7C3FB02E0022020770026301CD8 +:1054D00070BD00000348807AC00703493C00881D66 +:1054E0000000C00F88627047000040900700A46C65 +:1054F00001000149012088627047A46C0100064840 +:10550000807AC107064AC90F91622021800700D422 +:105510000021A032117070470000409007003C004D +:10552000C41D0000A46C0100074A1268074B9B6968 +:105530001A4001D0012200E000220A600121002A65 +:1055400000D000210160704710000700A46C01002A +:10555000012202600A607047B0B50D1C011C583171 +:105560003C00001E0000041C0622281DFEF777FBED +:10557000211C5E310622281C0A30FEF770FB211C1C +:1055800064310622281C1030FEF769FBB0BDFEB561 +:1055900000251D72171C0E1CB26D0021921950328D +:1055A000D27A3C003C1E00001C1C5A720078321C4F +:1055B0008032C007C017013001900898029200287D +:1055C00001D1307F2BE037480068002800DD011C46 +:1055D0000198002802D00898012810D1029A906BF7 +:1055E000002806D03C00781E0000884201D9451AE8 +:1055F000013D7019B03003E0B56D013D70195030B8 +:10560000007B0FE0029A106A002807D0884201D977 +:10561000451A013D7019A030007903E0BD69013DD4 +:105620007819007FA0723C00B41E00000EF00CF848 +:105630000E2811D1A07A08F067FF00280CD07868F6 +:10564000002805D11B480025007808F04BFF02E038 +:10565000451E7819007AA072029A5069002817D066 +:105660000898012814D0A07A3C00F01E000008F031 +:105670004EFF00280FD00198002807D0022020728A +:10568000706C80194030C079607204E07D68013D23 +:105690007819007AA072029AA07A916908F051FFF5 +:1056A0002060029A607A916908F03C002C1F00008B +:1056B0004BFF6060A07AE0722573FEBDD47E0100CE +:1056C000905701000006000E002A8CB501D08A22F6 +:1056D00000E0882200AB1A800CF0C2F80190684606 +:1056E0000BF0BCFA8CBD0000011C08483C00681F90 +:1056F000000080B50068002809D049680220002910 +:1057000000D101200106090E002006F0D8FF80BD5F +:105710000000206701001CB50190041C443001AA60 +:10572000694611F0B8FD00280BD0A06900213C00AB +:10573000A41F0000C207D20F0220FFF7C9FF0021FB +:10574000201C0FF0D9FE1CBD04219820FFF772F930 +:10575000F9E700008CB500AB84211980054B021CD1 +:10576000181C998A0CF08EF8019068460BF07CFAB0 +:105770003C00E01F00008CBD0000707C0100704701 +:105780000000064980B5C96814234031897A044A6B +:105790005943891880000858FEF7E9F980BD707CEC +:1057A00001005447010080B50020FFF7D6FF80BDFF +:1057B00000003C001C20000080B512481149808A7E +:1057C0000A8B00210028C2B00CD1012A05D0022A80 +:1057D00015D000AB5A800E2207E0022200AB5A809F +:1057E000998004E000AB5A800D2200AB9A8000AB98 +:1057F0001880FF203C00582000009871D97168463D +:1058000000F0D1F942B080BD0000707C010010B5FD +:1058100009F05FFC002005F02AF9034CE08A05F04E +:1058200036F9201C0FF0B3FE10BD707C01001CB5D2 +:1058300009F04FFC07203C009420000000AB074C0F +:105840001880E18A201C0CF00BF8019068460BF0E0 +:1058500017FA201C0FF09EFE1CBD0000707C01009A +:1058600080B502219820FFF7F1F880BD10B5154CE6 +:10587000C2B0A08A002803D03C00D020000001283C +:105880001ED1022000E00120E168403188722069C9 +:1058900008F023FD021C0C4818388088E1680FF0DE +:1058A000A4FEA08A00AB18800120588000209880B8 +:1058B000FF219971D871684600F03C000C2100006E +:1058C0007BF942B010BD03219820FFF7C5F8F8E737 +:1058D000707C01007047000080B503480FF060FE47 +:1058E000002005F0CDF880BD707C010080B5024835 +:1058F0000FF056FE80BD0000707C01003C00482186 +:10590000000080B502219820FFF7A9F880BD80B57E +:105910000320FFF734FF80BD0000F0B5214E0027C3 +:10592000B18A301C002504240029008BC3B01ED18D +:10593000012807D0311C498B022812D100293C00D4 +:105940008421000007D1002405E000240125022065 +:1059500000ABD8801F810FF07FFF002C10D1F168C1 +:105960000520403188720EE000291AD100ABD880A2 +:105970000E2002E000ABD8800D2000AB188107E0BC +:105980003C00C0210000301C0FF013FE201CFFF76C +:10599000FCFE002D08D0B08A00AB9880FF209872E2 +:1059A000DF7201A800F011F943B0F0BD0000707C77 +:1059B000010010B5002005F06CF8044CE08A05F0F9 +:1059C00078F83C00FC2100000FF04CFF201C0FF089 +:1059D000F3FD10BD707C010080B50420FFF7D8FEF8 +:1059E00001480FF0E9FD80BD707C010080B5022008 +:1059F000FFF7CEFE012005F05FF802480FF0DCFD56 +:105A000080BD00003C0038220000707C010080B5A1 +:105A10000320FFF7C0FE80BD0000B0B51D4DC2B031 +:105A2000288B00ABFF21588099710021D971AA8A77 +:105A30000024012A18D12A1C528B02280FD1002AD7 +:105A400016D1032058803C007422000099802C1C41 +:105A5000FF22981DE969FEF73BF9E1680420403117 +:105A6000887210E0002A06D101240E2001E00124F2 +:105A70000D2000AB9880281C0FF0A4FD0420FFF738 +:105A80008DFE002C05D0A88A3C00B022000000AB9F +:105A90001880684600F0A5F842B0B0BD0000707CE8 +:105AA000010010B5002005F000F8034CE08A05F075 +:105AB0000CF8201C0FF089FD10BD707C010080B532 +:105AC0000420FFF76EFE01480FF03C00EC220000BE +:105AD0007FFD80BD707C010080B50220FFF764FE71 +:105AE000012004F0F5FF02480FF072FD80BD0000B8 +:105AF000707C010080B50320FFF756FE80BD0000DA +:105B0000B0B5194D0424A98A281C028B3C00282317 +:105B10000000C2B0012914D1408B042A0BD1002807 +:105B200000D100240FF0ADFE002C19D1E96805204A +:105B30004031887217E0002810D100AB5A800E2047 +:105B400002E000AB5A800D2000AB988019803C0029 +:105B500064230000FF2098710020D871684600F08F +:105B600049F842B0B0BD281C0FF038FD201CFFF7EB +:105B700021FEF6E7707C010010B5002004F09EFFC6 +:105B8000034CE08A04F0AAFF201C0FF027FD10BD93 +:105B90003C00A0230000707C010080B50420FFF7CA +:105BA0000CFE01480FF01DFD80BD707C010080B52A +:105BB0000220FFF702FE012004F093FF02480FF0DD +:105BC00010FD80BD0000707C0100B0B50A4D011CC5 +:105BD00044313C00DC230000041C0622281CFEF794 +:105BE00089F8EC60206903F097F8011C0622A818D8 +:105BF000FEF780F80420FFF7F7FDB0BD707C0100D0 +:105C000090B5041C808893B0002806D01549062260 +:105C1000488018313C0018240000881FFEF76DF8FA +:105C200068460CF014F82088012808D16088032801 +:105C300005D1A088002802D106200CA90870A079FF +:105C40000621FF2804D0E079002801D0011C08318A +:105C50000B2008AA50723C0054240000201C08F0BD +:105C60003BFF039068460BF031F813B090BD000085 +:105C7000587C0100074B1A78824201D0002907D0D6 +:105C8000FF201870044801880122520391430180CB +:105C9000704700004C7B01003C00902400003280E3 +:105CA000070010B5041C0C2307495843401800791D +:105CB0000AF04FF901200349A04008390A7810433F +:105CC000087010BD0000747A0100034A00211154CD +:105CD000800030321058017070473C00CC24000026 +:105CE000E07A010010B5041C052801D3FEF712FF6D +:105CF000201CFFF7EDFF0021201C0EF089FB10BDDA +:105D0000054980B58860087F242304495843085812 +:105D1000FDF76CFF80BD0000D47901003C00082530 +:105D200000009446010080B501219120FEF7C7FED6 +:105D300080BD024A11688143116070470000786E8F +:105D4000010080B5FEF7E9FE80BD80B5FEF7E5FEF7 +:105D500080BD80B500F031FA80BD034980B53C00BC +:105D6000442500000420886000F0D0F980BD0000C8 +:105D70000030070080B500F099FA80BD80B500F0D2 +:105D800099FB80BD38B5202815D20D4C221C20323D +:105D9000957900AB1D70D2795A700A4B82009950E8 +:105DA0003C008025000001218140084801604268D4 +:105DB0001143416000AB1888E08438BD0121FF2009 +:105DC000FEF783FEF9E70010070030740100004081 +:105DD0000700202809D20549064B82009950054A40 +:105DE00051683C00BC250000012383409943516069 +:105DF00070470000A97500003074010000400700E2 +:105E0000024A11680843106070470000786E010074 +:105E10000B48016803221204114301600168072244 +:105E2000120691433C00F825000001225206891811 +:105E300001600168120C11430160016852081143AE +:105E400001607047000080000700FEB51C4E051C75 +:105E5000B08AF26812D00124002909D1116D02AA7A +:105E600001ABFEF7F8FE3C00342600000298002843 +:105E700001D000240BE001AA02A9281CFEF770FF44 +:105E800005E0116D02AA002401ABFEF701FF0E49E7 +:105E9000081C2030827900AB1A70C07958703068C5 +:105EA000002802D1029830603C007026000002E019 +:105EB00002987268D060019800AB70601888C8843E +:105EC000F068C06CF060201CFEBD247E0100001054 +:105ED0000700F8B5041C54271D4E00203060706088 +:105EE00067433804151C000CB1823C00AC2600004E +:105EF000FFF796F8082130610026174A14E0031CCA +:105F0000243342610361C661018308330360B12316 +:105F10004360031C6433C3600C230381031C5433AC +:105F20004C3028C0013C181C002CE8D13C00E8266D +:105F30000000094E07223069D243C1195050021C9B +:105F4000103280398A63F060B06000210020FFF7D2 +:105F500088FF3069F060B060F8BD247E01009100D8 +:105F600005000148406A70470000E87D01003C00E0 +:105F7000242700000148008870470000FC6B0100E6 +:105F8000064980B508880130088005490820086066 +:105F900004498869886100F021F880BDFC6B01002C +:105FA0000010070000300700034A0120121D06CA36 +:105FB0003C0060270000914200D100207047E87D3E +:105FC0000100064800B5C07C002803D1FFF7EFFFB1 +:105FD000002801D0012000BD002000BD0000A080ED +:105FE000070010B5041C800702D506F03EFD03E053 +:105FF000E0073C009C27000001D506F0E3FD6007A8 +:1060000001D5FEF7ABFD10BD024A011C10681160FE +:1060100070470000E87D010038B5204D2C1C20346D +:10602000A07900AB1870E0795870FEF727FA00AB42 +:106030001888E8843C00D82700001A488178082294 +:1060400091438170817811438170174841688022A3 +:1060500091434160016811430160002001306428D0 +:10606000FCD3A0790F4D00AB1870E079104C58703C +:10607000201C103000F03C0014280000DFFB002042 +:10608000C043A061FFF79CFF002809D00A490869B6 +:106090000130086100203C318968486306F0EEFC5D +:1060A00000AB1888E88438BD001007000000070026 +:1060B000F4000700003007003C0050280000E87D95 +:1060C00001000A4880B5006A002801D0FEF7C1F936 +:1060D000074807493C30806810304861012008615A +:1060E0000549086880229043086080BD0000E87D73 +:1060F000010000300700F40007003C008C2800007D +:1061000080B50CF0CBFE06F0BFFC80BD0149C86233 +:1061100070470000E87D0100024A916A08439062DE +:1061200070470000E87D01001823064958434018D5 +:106130000021027903681A70013108303C00C82838 +:1061400000000329F8D370470000285201000349DA +:10615000002800D0011C024881627047000085754C +:106160000000046C0100F8B5FFF733FF284F00284A +:1061700004D0FFF7C8FF386A01303862F86A3C0083 +:1061800004290000002802D0018904390181386BFC +:106190000025002808D00B203D6310F0E5FA1E49C9 +:1061A000086821229043086038783C211B4A41430B +:1061B0008C18FF22796A3A7000290CD0B969013134 +:1061C0003C0040290000B9617D62BD68002D04D00B +:1061D000636B7A6B0021FDF747FDF8BD042803D3FC +:1061E00001218420FEF7A1FC3869261C01303861AA +:1061F00020363078022803D00C218420FEF795FC4D +:1062000035703C007C290000A1690029E8D0636B4F +:10621000303420780C1C00217A6BFDF727FDDFE776 +:10622000046C0100F400070018DB010010B50B4CF2 +:10623000606A00280ED00A4800F012FB002060625D +:10624000A468002C3C00B829000005D07E23DB4365 +:1062500000220121FDF70DFD10BDE0690130E06174 +:1062600010BD046C010000300700094841683F225E +:10627000120491430D2212048918416041680122E1 +:106280005202914341603C00F429000003488178A8 +:1062900081708178817070478000070000000700DE +:1062A000F0B50125082400200E4A0F4900263C23A2 +:1062B0004343D1529B185D719B605E611C82C02775 +:1062C000DF602027FE549E613C00302A000030270A +:1062D000FE54074F3F182037013005289F63E9D34C +:1062E0000548FF3201329062F0BD18DB0100BEBAF2 +:1062F000000030800700066C0100014948607047CB +:106300000000046C01000549085C3C006C2A000098 +:10631000054949684018C006C00E0449203048723B +:1063200070470000A0570100046C010000800700C6 +:1063300080B515218420FEF707FC80BDF8B54348E1 +:1063400084680334424D04E0201C10F03C00A82A6D +:106350000000B9F8002871D12869C007F7D53E4878 +:1063600028603E4A141C2034207900903C233C498C +:10637000584345182879FFF7CCFF281C3A490830C4 +:1063800048600126081C0660686A00280DD03C00A1 +:10639000E42A0000A96A926A354B9F68D71B1A68E5 +:1063A000511879188A425A6800D800E0013206C0B4 +:1063B000E86AFEF787FF2D49E86A4860301C0E60E6 +:1063C00066791FE02B484661047F2949201C50391B +:1063D0003C00202B0000896AFDF75AFC009884429B +:1063E00010D03C202249604340188769002F09D013 +:1063F0000021203001707E23DB4302210022201C7B +:10640000FDF74CFC0120A0408643002EDDD1E96958 +:1064100000293C005C2B000003D03020405DFDF7DC +:106420003AFC164C503C606A002803D00A218420B4 +:10643000FEF796FB20352878012803D00B21842015 +:10644000FEF78EFB02202870E068013000E007E0D4 +:10645000E06000983C00982B00002070009860706D +:106460000A4800686063F8BD0000000107000040B2 +:106470000700010000013080070018DB0100003038 +:106480000700546C010000A00700786E01003C2258 +:106490003C234A4309493C00D42B0000B0B55418B2 +:1064A00058434518211C3822281CFDF7E5FCA06B39 +:1064B0000078A96B0870002020342070B0BD000067 +:1064C00018DB01003C230749584310B54418203419 +:1064D0002078022803D10D213C00102C00008420DC +:1064E000FEF747FB0020207010BD18DB0100FFB550 +:1064F0003C2048431A4981B04418261C2036307885 +:10650000151C0F9F022803D104218420FEF731FBC4 +:106510000120307025710B9930223C004C2C00007A +:1065200061800A99E1620D99A1610C99E1610E996E +:106530006162A762019911557E21C9436163049983 +:10654000002900D10020061C281C08F08BF8002828 +:1065500001D0022000E00020A16B30433C00882CD9 +:106560000000087005B0F0BD000018DB010080B528 +:1065700014218420FEF703FB80BD0148407870475A +:106580000000046C010002480069C007C00F70479A +:10659000000000400700011C3C23044A59433C0012 +:1065A000C42C00008918203109780120002900D06E +:1065B0000020704718DB01000848406A00280AD113 +:1065C000074A002120239B5C022B04D001313C327E +:1065D0000529F7D37047012070470000046C0100C3 +:1065E0003C00002D000018DB0100F8B50E1C041C57 +:1065F000171CFEF782FE201C114C606001202060F9 +:10660000104D686901306861686A002803D007216D +:106610008420FEF7BAFAA068400703D5062184203B +:10662000FEF73C003C2D0000B3FA08480069002842 +:1066300003DAAA218420FEF7ABFA02206862AE607A +:106640002F70F8BD00300700046C01000040070007 +:10665000044A518010710348034908304860012002 +:10666000086070473C00782D00003C6C0100003051 +:1066700007000021002305E002894360C06851182B +:106680000904090C0028F7D104310804000C7047F4 +:106690000000024A516B0843506370470000046CCD +:1066A000010038B50A4C3C00B42D0000221C2032F9 +:1066B000957900AB1D70D2795A7003684068064A1C +:1066C0005065054813655030816000AB1888E08440 +:1066D00038BD000000100700046C010098B50D4C97 +:1066E000201C2030817900AB3C00F02D0000197097 +:1066F000C07958700A4800F0ECF809490020486257 +:10670000FFF769FF002803D012218420FEF749FA21 +:1067100000AB1888E08498BD00000010070000302E +:106720000700046C01000348017A3C002C2E000095 +:10673000FE2291430A310172704700000080070079 +:1067400090B50E4C85B0A078022814D10320A0701B +:106750000B4900200022049202900391E18801225B +:1067600001920091617820782269E3683C00682EEC +:10677000000008F094FD044809F07FF905B090BDD1 +:106780000000B4790100ADB6000071B60000B0B5EC +:106790000C4DAC790C490978002903D001290ED0A1 +:1067A000022908D1C288002A09D0012381683C004F +:1067B000A42E000002200FF0C1F803E00221862081 +:1067C000FEF7F8F9AC71B0BD20100700A079010008 +:1067D00080B5026807494A600379CA78CB700079AE +:1067E000904206D003481430008907F027FE06F0D7 +:1067F0003C00E02E0000ABFA80BD8466010070B55D +:10680000164C154DA0780026983D012803D1286923 +:1068100008F0FBFCA6706068012803D000212869FD +:1068200000F0FFFB0E4829690CF031FA01200CF052 +:10683000E4F83C001C2F0000E078012802D0012081 +:10684000607000E06670064814304168012906D186 +:106850000660416F002902D00020FDF74CFA70BDA0 +:10686000846601003463010030B500220023012555 +:106870002C1C94403C00582F0000044001D0CA5406 +:10688000013301320E2AF6DB181C30BD0000FFB5C3 +:1068900001270026051C022081B00090002D18D091 +:1068A0002878FF2815D0002410E0281980780A994C +:1068B000002901D001063C00942F000008D507F004 +:1068C000E9FE0E2803D0012181400E4300E000279D +:1068D00001346878A042EBDC0098029D01380090FA +:1068E000DFD10398311C814302D003980640002772 +:1068F0000498066005B0381C3C00D02F0000F0BDA5 +:10690000000002210160642101E0013902D0026827 +:106910009207FAD40120002900D10020704710B559 +:106920000020C443054B022201015A50C9188C6053 +:1069300001300828F8DB10BD00003C000C300000DE +:1069400000300700F0B5051C6035C76A041C287BC1 +:10695000002F8BB015D0082815D202A31B5C5B005A +:106960009F4400000704040709090C0C01260021BC +:1069700009E0002606E00226022104E03C0048303F +:1069800000000326032101E0042601218C22125974 +:1069900007912649069004910020039005970892DC +:1069A000E0692269211C7031019121490090700039 +:1069B0004018603002920388591C01801E483C0038 +:1069C000843000000288A1680AA809F0E1FF606035 +:1069D000E87AA16AC9070007000EC90D0843616A79 +:1069E0002269C907890D01430120002A00D1002036 +:1069F00080030843216AC9030843082108430A9910 +:106A00003C00C03000000880201CFEF798FE206982 +:106A1000002804D1201C0AF082F90BB0F0BD807967 +:106A2000062801D9FEF70FF9206906498079800010 +:106A30000958201CFDF774F9EFE7792F0100C469AC +:106A400001003C00FC3000000861010074570100A7 +:106A500010B5041C58308AB00EF07CFE221C803227 +:106A60005168002901D0117A07E0002804D080691C +:106A7000800701D5032100E00121D2680791224956 +:106A8000002008923C003831000004910022059259 +:106A900006900390E06922690090211C70311C4827 +:106AA000019102920389591C01811A480288A16848 +:106AB00009A809F076FF60606B20005DA16A226979 +:106AC000C9070007000E3C0074310000C90D0143E6 +:106AD0000120002A00D10020800308430999088082 +:106AE000201CFEF735FE2069002804D1201C0AF086 +:106AF0001FF90AB010BD8079062801D9FEF7ACF85D +:106B000020690749807980003C00B03100000958B5 +:106B1000201CFDF711F9EFE70000BD2F0100246AEA +:106B2000010008610100745701003EB5051C0069B1 +:106B3000042107F0D2FA002809D042780232011C61 +:106B40006846FDF788F9E86A6C463C00EC310000C5 +:106B5000029000E00024281C143002F003FB0028FF +:106B600004D0211C281C05F0A5FE3EBD002CFCD045 +:106B70000249201C4969FDF7E2F8F6E7447D01006F +:106B800070B51E1C18235843064B049D3C00283248 +:106B900000001950C418002060616260A660E560C2 +:106BA0000FF0B9FD206170BD0000B87D0100024A00 +:106BB000011C9069916170470000447D010001480B +:106BC000406B70470000447D01000449044B3C00C9 +:106BD00064320000CA6809695C3B5B68C91A4143BA +:106BE00050187047A07D01000148007870470000F0 +:106BF0007869010080B506220149FDF735F980BDAD +:106C0000FE670100F0B589B00093164F131C0E1CEF +:106C10003C00A0320000041C3A1C01F062FF01A9F4 +:106C200006A8A26802F00BF901AA06A9381C636A3B +:106C300002F081FC051C012814D10C48FC21C8512C +:106C4000381C02F00CF80321301C07F052FA00281F +:106C500007D03C00DC320000807800F033FC201CC0 +:106C600010300EF047FD00E00025281C09B0F0BDF3 +:106C7000F4670100C138000010B5074C0648062231 +:106C8000211D0838FDF7F6F801F0FCFF00F042FC8A +:106C9000201C02F03C001833000027FC10BDF467F4 +:106CA00001000849C96800290AD0064A0132517812 +:106CB00012784843002A01D108187047101870470D +:106CC000013070470000447D0100044B0549002855 +:106CD0005A6900D0011C3C0054330000101C59615B +:106CE00070470000447D0100B9750000074900208D +:106CF0000A78022A09D10A7C002A05D1CA68002A2A +:106D000003D04969002900D001207047786901004B +:106D10000C4A80B5012151603C009033000009F01D +:106D20006AF809481C308169002907D00023836173 +:106D300000220021002000F0D2F880BD00220021B6 +:106D4000034800F05CF980BD00005C69010051352A +:106D50000000B0B50C1C012816D13C00CC3300005B +:106D60000E4D022C09D100F02BFA00280ED06869D4 +:106D700000280BD1211C13200CE0032CFAD100F0C9 +:106D8000F9F9002802D0287C0028F3D0B0BD211CDE +:106D90000006000E04F062FCB0BD00003C000834A8 +:106DA000000078690100B0B50C4C002525746561C0 +:106DB000E56000F03CFA00F034FA07481C38056141 +:106DC00009F033FF2078002802D104F06EFAB0BD3C +:106DD0000228FCD104F0A5FBB0BD786901003C009D +:106DE000443400000C4880B50178002912D0C068F6 +:106DF00000280FD108481C38406900280AD10748EC +:106E00000068002806D000220721102010F0A0F909 +:106E100002F02CFC80BD000078690100D4670100FD +:106E20003C0080340000F8B51D4E1C4D041CF06879 +:106E300002271C3D002807D0E868002804D0FDF791 +:106E4000C2FE002800D0BC43002C14D03770F0687C +:106E5000144F002810D0E00717D4FDF7B4FE002827 +:106E600013D03C00BC3400007069002806D1E868EB +:106E7000002801D0FDF71AFF0DF00AFAF8BD686985 +:106E8000002805D109480068002801D0012C04D150 +:106E9000391C201C0EF052FDF0E704F01DFB02F03F +:106EA000EBFBEBE73C00F83400007869010050C3CD +:106EB0000000D467010005484169002904D0406AF8 +:106EC000002801D001207047002070470000786939 +:106ED000010010B5041C0649002048600860886065 +:106EE00008F09BFF07213C00343500001220227976 +:106EF00010F03AF910BD00005C6901000149012061 +:106F000008607047E8670100F8B5071C0E1C08F020 +:106F1000A3FA134D041C6868002817D0002F02D074 +:106F2000A868032813D300203C0070350000A86037 +:106F30006860211C0F200EF0F0FE2868002803D0A6 +:106F4000002C06D1012002E0012C02D10020FFF725 +:106F5000FAFEF8BD721C0021044800F068F8A86829 +:106F60000130A860F5E75C6901003C00AC35000029 +:106F7000513500000A4980B5CA68002A0BD0426822 +:106F8000002A09D000224A6202680A6202680721C8 +:106F9000172010F0EFF880BD0120486280BD00008E +:106FA0007869010070B5144D846CE9683C00E835DF +:106FB0000000002917D04030EC614078002801D152 +:106FC00001206862286A0E4E001BB0420CD208F005 +:106FD0003AFE296A401AB04203D202220721132046 +:106FE00009E004F0B6FA70BD0748A9680BF03C0050 +:106FF00024360000BDFE221C0721162010F0C0F828 +:1070000070BD000078690100A086010034630100B2 +:107010000A4980B500208861086900280CD007481B +:107020001C300078002807D001F0D2FF022803D1DD +:107030003C006036000000F012F900F0BCF880BDA2 +:1070400000005C690100F0B5061C0C1C151C91B019 +:1070500001A84021FCF70DFF00216846FDF7A7FFBE +:10706000049001A806220849FCF731FF062202A875 +:1070700002303C009C3600000649FCF72BFF00ABB9 +:10708000DC760C95311C01A807F04EF811B0F0BD6C +:1070900012610100F8670100031C081C191C114B48 +:1070A00080B506D0042111800422191CFCF712FFC0 +:1070B00016E004223C00D8360000011C181CFCF726 +:1070C0000CFF09481038006900280CD007480C3024 +:1070D0000078002807D001F084FF022803D100F0D7 +:1070E000C4F800F06EF8012080BD6C690100F8B5AD +:1070F000041C0F1C00253C0014370000002601F082 +:1071000073FF02282FD11949012F086807D1021CEB +:1071100022400AD120430860A04206D104E00028A2 +:1071200003D0A043086000D10125486800281AD187 +:10713000002D17D0012048603C0050370000381C5B +:1071400008F089FE0B481C308169002907D0002314 +:107150008361002200210020FFF7F1FE06E00022FB +:1071600000210448FFF77BFF00E00126301CF8BD3A +:1071700000005C690100513500003C008C370000C4 +:10718000031C081C191C124B80B506D00421118069 +:107190000422191CFCF7AAFE18E00422011C181C8A +:1071A000FCF7A4FE0A481030C16800290ED0007810 +:1071B00000280BD001F01EFF022807D13C00C83781 +:1071C000000000F064F800F02EF8002801D109F06A +:1071D0007AFD012080BD6869010010B50A4C206964 +:1071E000002809D0A169002906D17D21C9004143A9 +:1071F000032207200FF0E1FE2169012000293C0055 +:107200000438000000D1002010BD00005C690100BE +:1072100010B5054C002803D0FDF79AFCE06010BDC6 +:1072200001200021E16010BD786901000A480A4987 +:1072300010B5C0681C39C968002803D0002901D0E6 +:107240003C0040380000012400E00024002C03D062 +:10725000022207200FF0B7FE201C10BD0000786945 +:10726000010010B5094C0020216900290CD0064905 +:107270001C310978002907D000F009F80120A0612D +:1072800020693C007C3800007D23DB00584310BDA2 +:107290005C69010080B5032107200FF0D1FE80BD9D +:1072A00080B5022107200FF0CBFE80BD064880B5D7 +:1072B0000078002801D0FDF729FD002207211120C8 +:1072C0000FF07CFF3C00B838000080BD00007869FA +:1072D000010010B5041C101C064A516100F0A3F80F +:1072E0001020002C00D11120002207210FF069FF8F +:1072F00010BD5C6901000149486270470000447D8F +:10730000010010B5094C3C00F4380000E069002889 +:107310000CD1E0620120E0610BF008FD0BF074FE7F +:10732000012000F0B5F80FF04DFA606310BD0000C9 +:10733000447D0100054980B50020C861886300F0E4 +:1073400089F800F001F902F03C003039000091FBAF +:1073500080BD447D010010B5012838D10806000E1B +:10736000052832D11D4C2078012809D002281BD0D5 +:1073700003282AD102F07DFB00F06FF8012010E015 +:107380001748216B0BF01BFD0BF03C006C39000023 +:1073900041FE15480069032801D3C00703D5012128 +:1073A000206B07F019FF022000F078F810BD0F489D +:1073B000006820640A485C30C16802698918C160AD +:1073C00003F0CCFC032000F069F801203C00A83950 +:1073D0000000E06210BD092100E008210920FDF74E +:1073E00076FC10BD0000447D010034630100F468A8 +:1073F0000100786E0100B0B50F4C2078651E0128A1 +:107400000FD10020FFF7A1FC0C49098849083C0076 +:10741000E4390000401A0FF019F9002804D0287848 +:10742000012807D0022805D02078002804D1287828 +:10743000032801D10120B0BD0020B0BD457D010071 +:10744000F46701000149C86470470000447D0100F1 +:107450003C00203A00000449054A8968126D012069 +:10746000914200D3002070470000F4680100447D81 +:10747000010010B5064C206B07F0F9FEA06B002848 +:1074800003D10348216B0BF092FC10BD0000447D3A +:1074900001003C005C3A00003463010004480078BD +:1074A000022801D0032801D1012070470020704735 +:1074B000447D0100F8B5071CFFF7D0FF061C012F23 +:1074C000264D1FD0022F45D0032F12D12448254B23 +:1074D00000696A693C00983A000041085A43234B0E +:1074E000D4188C4200D90C1C002E05D01E495B39E3 +:1074F0000978002900D1041C0522211C09200FF065 +:1075000080FD184A5C3A1770F8BDFFF7D6FB0028DB +:1075100002D0286900283C00D43A00000ED004F0C4 +:10752000CFFB134B6969114A59435C3AD26B8918F6 +:10753000884201D9441A04E0002402E004F0AEFDC0 +:10754000041C002EDBD009485B3800780128D6D116 +:10755000084B9C4202D958423C00103B00002418C2 +:10756000D0E70024CEE704F0AEFBCAE70000F468E1 +:107570000100A07D0100983A00008813000080B54A +:10758000052109200FF07DFD02490020087080BD13 +:107590000000447D010070B5061C3C004C3B00001F +:1075A0000DF0BCFAFFF7CEFE094C0A48216B0BF038 +:1075B00021FC012501213006000EA56307F03AFEEB +:1075C000054829020958002900D1056170BD000055 +:1075D000447D010034630100F46701003C00883BF6 +:1075E0000000024A116C0843106470470000447D9B +:1075F000010080B5FFF7BFFE0BF0A1FB80BD024A82 +:10760000011C1069116170470000447D0100F3B551 +:10761000061C002089B0F84C0890E26908253C005F +:10762000C43B0000002A03D006A907A8FCF706FC0B +:10763000301CF34E0027203682286FD015DC01283D +:1076400018D080286BD1EE4D803DA868012867D105 +:1076500068680FF01BF8002863D1012101200DF0AC +:107660003C00003C00009DF808F0DBFD0BB0F0BDD5 +:1076700083286DD0842855D1E7E00A980A2804D2DF +:1076800003A31B181B5A5B009F44F6E00000EE00AA +:107690000B00F700F700F700F7002F0088008B00C1 +:1076A000AD003C003C3C000000F056FE002817D026 +:1076B000D64A803AD16A0698814216D0062100281F +:1076C00000D107210D062D0E00280ED0CF4A012033 +:1076D000803A50650FF0A0F8CC4A803A506604E03A +:1076E000002116203C00783C00000FF0DCFC012556 +:1076F000022005902EE2C6488038406D00282ED02A +:10770000C6492069C44D40180EF0C1FF002812D0B0 +:107710000FF085F8C14949424018BD4920618039C0 +:10772000486E40190EF03C00B43C0000BBFF00283E +:1077300011D00AE0F7E017E2B2E0B0E0B649206904 +:107740008039496E401AA84205DBB349B54D8039EE +:107750004F6503F027FB0622291C16200FF072FC50 +:1077600047E095E000F0FEFD3C00F03C0000002802 +:1077700042D1AA4DC43DEF6008F019FD03F015FB9E +:10778000A86A002802D0FFF74CFFAF62A4488038F7 +:1077900000680021FFF7F9FC08F03FF909211620E5 +:1077A0000FF087FC0022162183203C002C3D0000B6 +:1077B0000FF040FDFFF786FC21E000F01BFE1EE00D +:1077C00006F054FA974D803DA96F401A0490069830 +:1077D000002801D0AF6502E0A86D002808D19148CB +:1077E000C4380078800703D5924847603C00683D64 +:1077F000000000F002FE0498FF382338142802D25B +:107800000120E86353E0EF6351E0874AB57A803A9C +:10781000002D4CD00DF071FF00F0ADFD071C82482B +:107820008038406FFF305F300EF03DFF021C3C009F +:10783000A43D00007E488038406D00281AD100F039 +:10784000F1FD002816D1042D02D1002F12D11BE02A +:10785000002F06D0022D14D079484068002809D0A6 +:1078600012E0002A10D14B21C90001230922162061 +:107870003C00E03D00000FF0D6FC6E4A7348803AB1 +:1078800011680BF0D8FA18E00121002001E0012175 +:10789000012000F02AFE10E0674A6C49803A906EA1 +:1078A00040189066012508958BE104216CE1614A3E +:1078B00066483C001C3E0000803A11680BF0AAFAB2 +:1078C00088E1AF60A86FE8676348016DA967079A10 +:1078D0001420002A00D1002008181230A866707801 +:1078E000B0703078707002203070A069FCF7C2FA76 +:1078F000EF64A86F3C00583E0000E96F594B401AF6 +:10790000984212D2686D069988420ED030780228CB +:107910000BD80EF09CFFA96F0822401A5249091A91 +:107920003B1C16200FF085FC00E0AF6501200590A0 +:107930000890434802253C00943E0000C438C168CA +:10794000002972D10121C1604948006B00286CD028 +:1079500008F066FC69E03C480022019280388068AB +:10796000012804D1384880388760012048E13A482E +:10797000012343603448C4383C00D03E0000007806 +:1079800000280AD100F025FE002806D0FF21913101 +:107990000123092216200FF052FC2C498039486F30 +:1079A000896F421A039206F076F928498039896F67 +:1079B000039A401A0290372000013C000C3F00005F +:1079C000101A50280DD223488038406D002804D169 +:1079D0000298FF385538142801D2012200E0002215 +:1079E0000192039A0120FF3A0B3A502A00D300205B +:1079F000049000280AD017488038C06F3C00483FE8 +:107A00000000081A9B21C900401A142801D2012243 +:107A100000E000220092002A11D00F4D0120803D8D +:107A200068650EF020FF68660125012116200FF021 +:107A30005EFB002116200FF05AFB00E0BAE03C008C +:107A4000843F0000F07902283CD8054A803A516C06 +:107A5000002937D1136C111C002B33D116E0000024 +:107A6000246D010050C30000C05C15007099140023 +:107A7000B057010034630100E204000000900700E9 +:107A80003C00C03F0000530700001E020000C85722 +:107A900001004A6D002A02D0B27A022A15D1009A5A +:107AA000002A03D0CA6D0132CA6500E0CF65019A91 +:107AB000002A0BD08A6FCB6FD21A5A4B9A4202D24D +:107AC0008A6D3C00FC3F0000013200E001228A6523 +:107AD00000E08F650499002901D102280BD9544A8E +:107AE00002281ED9D06F616888421AD1916F081A96 +:107AF0005049884215DD4E4B986FE168401A7D2150 +:107B0000C90088423C00384000000BDD6169401A22 +:107B1000002804DD021140111018401801E0801007 +:107B200008186061586FE0600398FF382338142804 +:107B300009D20298FF382338142804D23E4A906FA5 +:107B40005064906A90643C00744000000EF09AFE0D +:107B50003A49496C401A3B49884201D937494F6438 +:107B6000394903984018142807D23449C86B0028B3 +:107B700003D0886F0864886A88640EF083FE2F49FA +:107B8000096C401A314988423C00B040000001D9DC +:107B90002C48076404200590082116200FF0B9FA3C +:107BA0002848406D002802D00499002908D02949AE +:107BB000002800D129493B1C062216200FF057FB54 +:107BC000022D09D0062D0AD0072D3C00EC40000004 +:107BD00013D107E001211620FDF7D6F81EE01A4A5E +:107BE00057639763184A0698D06207991163536BDD +:107BF00018435063906B084390630598002805D0A4 +:107C000005980CF05FFA05980CF0D2F93C00284179 +:107C10000000082D05D00D4844388570281C03F05D +:107C2000DCFD1149E069884200D161E5089800282F +:107C3000FBD0B07A0228F8D1012116200FF06FFA9C +:107C400002200DF0E8FE53E50000530700003C0061 +:107C500064410000A46C010020A10700204E000038 +:107C60003FFBFFFFA086010050C30000C05C150071 +:107C7000F11D00007047000070470000F8B5214872 +:107C80000068214D6969084001D1012700E0002703 +:107C90003C00A04100001D4D0126696A002900D06A +:107CA00000261B4D1A482C1CA030027A281C40309C +:107CB00080341023B74210D10125C580002900D09F +:107CC00000231A43111C017301200EF088FE0820C6 +:107CD00020703C00DC41000000221621802013E0CF +:107CE0001127C7802E1C0B4D002900D100231A43F9 +:107CF000111C017301200EF075FE08202070306DFC +:107D000000221621686782200FF0D0FAF8BD00002B +:107D1000100007003C0018420000A46C0100009015 +:107D20000700B0B50F4D041CAA7A0121081C002AD7 +:107D300000D00020002C00D0002188420AD0002C66 +:107D400004D100F042FB00F0D6FA03E000F0D9FACB +:107D500000F009F8A87A3C00544200000249E439D6 +:107D60004871AC72B0BD0000446D010080B53EF0BA +:107D700055F802490120087080BD0000687E0100AE +:107D8000F3B501208DB00F1C012408900EF092FD78 +:107D9000061C00F0B5FA09903C009042000000F08B +:107DA00080FB0790FEF73FFA051C00210C9108F0BC +:107DB000F0FB002801D1012000E000200A90FEF72E +:107DC00012FD05F0E0FE0B90002D23D0288841071E +:107DD00020D4291D04910A3500063C00CC42000045 +:107DE000800E01212028039500D000210D1C04984D +:107DF00006F038FD0C90049806F010FD002808D01D +:107E0000039801F087FA002803D0002D01D101204A +:107E100000E000200C9901430C91FCF73C00084362 +:107E2000000023FF00282FD007F099FF051C07F062 +:107E3000B2FF0490FFF7F3F80C990143002D06D030 +:107E40000498F04A301A904201D2012000E000204C +:107E500008430C900B980A9B1843011C0B913C00A3 +:107E60004443000005F0CEFE00281AD1002D06D0B4 +:107E70000498E749301A884201D2012000E000202E +:107E80000C990843051C00F01FFB284303E000F099 +:107E90001BFB0C9908430C9000F0D4FB0B99014399 +:107EA0003C00804300000B91DC49C868002801D0E9 +:107EB0000138C86008F0E7FB069008F090FD311A21 +:107EC00005910699D648814208D8002F08D1059916 +:107ED0004008814204D90699814201D900248BE0EF +:107EE000D0483C00BC4300000599D04D814226D2C9 +:107EF000E879102806D2002F21D1CC48A038806A1A +:107F000000281CD109F062FF0490002802D1002053 +:107F1000C34913E009F010FE002803D0C448C0692B +:107F20000028F4D03C00F84300000498052803D052 +:107F3000C148006A002865D1BB49486A002823D09F +:107F40000138486200F087FF002811D0BB4805992E +:107F500081420DD201F09BF804300DF0EEFC403070 +:107F6000C17A01294ED03C0034440000807A0028B8 +:107F700001D0052849D301F0DFF8022810D0002FE6 +:107F800002D10698002840D10020089082E1AA483A +:107F9000A038C068002838D0A8488069486234E01A +:107FA0000AA903C9084345D03C0070440000A34817 +:107FB0002978A038022940D8406D00280AD09F486F +:107FC000A2492038C06840180EF0C7FB002801D035 +:107FD000012100E00021964A906A002802DA640834 +:107FE00064002AE0002909D1954B3C00AC44000014 +:107FF000A03B5B6D002B02D005280DDB01E00728BC +:108000000ADB0120C043906264088E4964000020AE +:10801000A039886514E0D1E0394311D18949A039EC +:10802000CB6D002B02D1896D012909D93C00E844B0 +:108030000000079B002B01D1072801DB64086400C6 +:1080400001309062BDE07D4988690490002088611C +:108050000C9800282CD007F066FC002802D00220E3 +:10806000044325E07A48C06A002804D177483C00E0 +:1080700024450000A038C06800281CD104980028BE +:108080000DD12878102802D3E878022802D928795F +:10809000102804D304246B4901228A6194E06C48BF +:1080A000A038406D002871D005F0A2FD00286DD0E9 +:1080B0003C00604500006408640088E0FFF75BFA5C +:1080C00000281AD068480078022801D1002F14D166 +:1080D0000020FEF770FE301A0490FFF76CFA0028BB +:1080E00007D0FFF71EFA002803D05D4904988842A4 +:1080F0004FD33C009C45000005F06CFD00284BD19F +:1081000053490878032808D188680122D207301A19 +:10811000904241D201220A7057E054480078022868 +:1081200001D1002F51D14A4988685149801B8842AA +:1081300007D901203C00D8450000FEF742FE7D2112 +:1081400009014018444988604A480078022804D14F +:10815000079B002B01D1012000E00020474B47493D +:10816000584340183C498968891B884230D9079B8D +:108170000020039300F03C001446000079FF0290B9 +:10818000FFF7D8F9049001F057F80499029A514387 +:108190004843019000F0DCFF411C01980122484354 +:1081A000111C00E01BE0314B5B6A834200D30021CD +:1081B000039B0122002B00D03C005046000000220F +:1081C0002C4B51439B6A0122834200D30022500072 +:1081D000081803D023490320087003E00998C068F9 +:1081E000062808D90224089800286ED01D490020CE +:1081F000C8614861A5E01A4948693C008C46000006 +:1082000000280AD1002F05D001224A61C8698018D0 +:10821000C8610AE00020C86103E0002F05D10020FA +:1082200048610D98002800D1C8680020089008789F +:1082300001282FD002284BD1002F08D13C00C8467E +:108240000000E878002802D12878102843D2287945 +:10825000102840D248680A69301A904267D3012238 +:108260000A7038E00000E204000010270000687E79 +:108270000100A086010088130000446D01003C004D +:1082800004470000C857010050C30000983A00009E +:10829000C0570100400D0300C4090000B20C0000EB +:1082A00000200B9A0A9BC0431A4337D0002F35D1C8 +:1082B000079B002B08D06A78022A2FD92A78102A27 +:1082C0003C00404700002CD22A79102A29D2254BA5 +:1082D0001A6C002A06D09A6A9F6CBA4202D11F20FB +:1082E0001FE02EE0204B5A6C002A03D01F4FB31A18 +:1082F000BB4216D31C4B002A05D09A6A9F6CBA4227 +:1083000001D13C007C4700000F200DE0079A002AB5 +:1083100004D0EA79202A01D1002005E0EA79102A68 +:1083200001D3032000E09A6A124A126802400BD17E +:1083300001200890022008700F4808614E6064E731 +:10834000FFE701203C00B8470000089060E70C49B7 +:10835000886A002801DA013002E0002801DD0020EF +:108360008862002008620899200408430FB0F0BD1D +:108370000000A46C010071020000082007005307F0 +:108380000000687E01003C00F447000070470000D8 +:1083900000487047507E010080B53DF07FFD0249E6 +:1083A0000120087080BD00003C7E0100F8B50D1C66 +:1083B0000EF0C8FA2649041C886A264E002801D00F +:1083C000042003E0706A00283C003048000001D01F +:1083D000013870620027002D02D0B761F7610AE012 +:1083E000B0691C490130B061496D002903D00328F0 +:1083F00001D90120F061B460F168009108F0F7FC48 +:10840000F0600099884202D030623C006C48000065 +:1084100034610BE000F090F8002801D0114800E032 +:1084200011483169611A814200D937620B4A0C4800 +:10843000D16C2030002901D00A2103E0017A002903 +:1084400001D0FF310172002D03D1017A3C00A84810 +:108450000000002900D0916A007A002800D1176539 +:10846000F8BDA46C01003C7E0100A60E0000A861CE +:10847000000070470000064980B58968002907D0D0 +:108480000521002800D104210806000E03F03C005D +:10849000E448000005FA80BD606C010007480068F0 +:1084A00007494A69104001D0012000E00020496AD4 +:1084B000884201D10120704700207047100007005A +:1084C000A46C010070B50EF049FA021C00F03AF8F5 +:1084D0003C0020490000104900280ED0081CA031A3 +:1084E0000E780E4B102E01D3806F03E049781029CF +:1084F0000ED3C06FC018841A0AE0081C803045698A +:1085000008498D4201D90C1C05E0C068101A2C1ACC +:10851000002C3C005C49000000DA6419201C70BD8E +:10852000A46C0100A60E000050C3000080B505F049 +:10853000B7FB002802D007F01FFF80BD034800787A +:108540000028FAD007F070FB80BD0000606C0100CD +:10855000034901203C00984900004969032900D8DB +:10856000002070470000606C0100B0B50A4D002487 +:108570002878012803D005F06AFB0406240EFEF7D4 +:10858000D2FC0002204302D1686A002801D10120F8 +:10859000B0BD0020B0BD3C00D4490000606C0100BB +:1085A0000121012800D000210148416270470000EC +:1085B000606C0100154810B504681548006A002871 +:1085C00014D0FFF7CBFF00280ED111481149C43059 +:1085D0004069884208D2CC083C00104A0000A04202 +:1085E00005D3FFF77EFFA04201DA0C4C01E0FF2427 +:1085F00091347D200001844204D900221621832079 +:108600000EF0BDFE01230922211C16200EF0A7FE4C +:1086100010BDB0570100606C01003C004C4A0000E6 +:10862000C05D00001027000070B5051C0E1C00F096 +:1086300043F800280FD0084C2078C00703D405F079 +:10864000ABF909F031FE002D05D02078800702D467 +:10865000301C02F0FDFE70BD606C01003C00884AD9 +:108660000000B0B5002818D01148814215D210483A +:108670000C1C0D1807F0DFFA81000918A14201D285 +:10868000400003E041000918A14201D2241A06E08B +:108690004100A14203D24008F8E7064D074C3C00D8 +:1086A000C44A00000EF072F90019291C07F0DCFA28 +:1086B000B0BD000080B92A00530700004C1D000027 +:1086C00088130000B0B505F0FDFA002813D1FEF7BD +:1086D000B5FE0A4C0A4D0028606300D028600EF0F9 +:1086E0003C00004B000055F9216A002904D1E169E2 +:1086F000401A2968884201D90120B0BD0020B0BDD0 +:108700000000606C0100B057010080B5FFF7DDFF8D +:10871000002805D005F0B7FA002801D1012080BD5E +:1087200000203C003C4B000080BD000010B50A4C0E +:108730000021A268002A03D0A16002F083F910BDD5 +:108740006160011C002204200EF036FD0348216800 +:108750000AF008FC10BD0000BC740100C4600100F8 +:1087600070B5051C3C00784B000001D1FCF7C1FB43 +:10877000204CE06A002815D01F4BA0695843C60B57 +:1087800020884643F0008019E660FBF71CFEA842F3 +:1087900005D8301CFBF717FE8019A84202D2002032 +:1087A000E06020E0E5603C00B44B0000002D1DD0EF +:1087B0002688A0697043C103281CFBF7A5FD6061F2 +:1087C0000D48321C291C3030FBF70AFC0C4B606949 +:1087D0005843C00B606201F0B7FDA062E06800285A +:1087E00004D02069A168FBF73C00F04B0000F4FBCB +:1087F00070BD0548A168FBF7EFFB70BD0000C874B1 +:10880000010040420F00C0C62D0088130000F1B5E2 +:108810003E4800AB8178C0783E4F0A07040758787D +:108820003B49120F085C1439240F3C002C4C00000B +:10883000801878600130B8601878354D085C0019F0 +:10884000B8610130F861EB7833481E09334B1838B2 +:1088500081785E43AB781D09C8236B43002908D19A +:108860002B4D2D783D60C5607D25ED003C00684CAA +:1088700000005D1B2C4B07E0274D6D783D60C56007 +:108880004B252D015D1B284BF618022000F057F8F0 +:10889000281AF8602248221C18388178032000F03A +:1088A0004EF8301A3862396800AB79615A783C006A +:1088B000A44C00005623F9685A43891AF960C8315C +:1088C00039611849183989780029B96911D100AB83 +:1088D0001A78134B143B9A5C531C59430A2359438F +:1088E000144B591A51430A235943401A386212490A +:1088F0003C00E04C000010E000AB1A780A4B143B3F +:108900009A5C531C59430A2359430D4B591A51433E +:108910000A235943401A0B49386240187862F8BD5F +:1089200000000C5A0100665A010094780100A086EC +:1089300001003C001C4D000000487100B0D68C00C6 +:1089400088100000803801005812000070110100EA +:1089500030B5194B0228DD6806D1002904D12B1C43 +:108960000C339C1A64235C43022809D1012907D1E6 +:1089700064237D243C00584D0000E4006B431C1927 +:10898000A0235343E41A0A235A43032809D1002998 +:1089900007D11323FF24E4006B431B199B1A1C1CF3 +:1089A0005C43032808D1012906D10E2005496843FC +:1089B0004018801A041C3C00944D00004443201CC5 +:1089C00030BD00007C7801008408000010B5074C21 +:1089D0000C2360780549143158434018406801F071 +:1089E0004FFC0021607802F04BFF10BD4C7B010072 +:1089F0000C48F8B540780C233C00D04D00000A49E3 +:108A0000584314314418261D60CE301C0BF00BFD6A +:108A10000027412047550548291C02F0F0FE281C7C +:108A200001F031FC0434C0C4F8BD4C7B010055801A +:108A30000000B0B50A4D4C2128783C000C4E0000D7 +:108A4000094A41438C1822680121FBF7E1FA287892 +:108A500001F0FAFB3C23E056411E012007F034FBF5 +:108A6000B0BD00003C7C010058E301000C23074925 +:108A70005843401880B54068416B00293C00484E7F +:108A8000000002D00BF0FBFD80BD0BF02CFD80BD83 +:108A90000000607B010038220A4B4243D2180029B3 +:108AA00080B504D0022907D10BF0FBFC80BDD26A4F +:108AB0000121FBF7B0FA80BD03218620FCF73C00C2 +:108AC000844E00000FFA80BDD4E40100B0B5040666 +:108AD000240E0C200E49604340184568A86B0028FE +:108AE00003D10021201CFDF7E1FA201C07F0F2FF62 +:108AF000002808D0281C6030C179012903D9FF3132 +:108B00003C00C04E0000C171FF3181710121201C69 +:108B100002F0C5FEB0BD607B010070B50006000E1E +:108B2000051C4C230A49584344183C20005DFF3083 +:108B300006063616281C01F090FB0021281C22682E +:108B4000FBF73C00FC4E00006FFA311C002007F0E0 +:108B5000C7FA70BD58E301000C220F4B4243D218F4 +:108B600010B5546800290DD002290FD12C20005DCA +:108B7000002803D007210C20FCF7BAF9201C0BF0C9 +:108B8000BBFC10BD3C00384F0000002102F08DFE00 +:108B900010BD04210C20FCF7AEF910BD0000607B75 +:108BA000010080B5002907D00C230549584340181F +:108BB00040680BF04AFC80BD012102F076FE80BDCA +:108BC0000000607B01003C00744F000010B5041CE5 +:108BD000002905D002291AD1201C0BF0EBFC10BD96 +:108BE0000D4804700D4807F007F90D48018801226F +:108BF0001203114301804C200A4960434018403061 +:108C00000078FDF75DFD201C3C00B04F00000AF02D +:108C1000D4F810BD03218620FCF773F910BD3C7C0D +:108C20000100054E00003280070058E30100FFB547 +:108C3000051C012083B001900C205D4A6843861812 +:108C40000127002974680ED002293C00EC4F000077 +:108C50006AD12C20005D002803D006210C20FCF7EF +:108C600053F9201C0BF020FD07B0F0BD524814381A +:108C70004570A06B002807D0504807F07FF801210D +:108C8000281CFDF725FA1CE04D4807F03C00285051 +:108C9000000077F84A48143805704B4801880122D3 +:108CA0005203114301804020005DFDF712FDB068C2 +:108CB000002809D1281C07F064FFB060002803D108 +:108CC00009210C20FCF723F90598002803D03C006B +:108CD00064500000E06C0130E0640EE06720005D4D +:108CE000002807D1E06C002804D139480238C06A56 +:108CF000A06409E0206D002801D0002704E0281CB2 +:108D000007F000FF0028E5D105982065201C2030E1 +:108D10003C00A0500000626A0290817B281C07F092 +:108D200078FF002F19D0201C6030C1794A1CC27115 +:108D30008079814202D2012001E040E000200190D0 +:108D400000280AD025480078800706D500F00DFBE2 +:108D5000011C3C00DC500000201C0BF015FD0190B4 +:108D6000019800280FD00298007B022803D1201C14 +:108D700004F0D0FE84E7012800D07EE7211C301CDF +:108D800004F0E2FE7CE7251C6035E879FF30A8712D +:108D9000687A06F03C00185100009DFC0DF047FE7B +:108DA000071C05F012FF3F180298817B20690430F0 +:108DB00000F035FA616A05F0EAFE39186B7A3088FE +:108DC0008031094A0DF091FE5DE703210C20FCF78C +:108DD000AAF858E700003C0054510000607B0100F5 +:108DE000A54D0000C94D0000328007001D7501002F +:108DF0008D4E0000FFB581B01F1C051C141C101CFB +:108E00000A9E00F0F5FC291C1031201D0622FBF7FC +:108E1000B7F9A88E2080E88E3C0090510000608059 +:108E20000299201C00F007F9FF34013466602760C6 +:108E300005B0F0BD0000F8B50F1C1E1C051C141C6D +:108E4000101C00F0D8FCA888391C2080288960807C +:108E5000201C00F0F0F8FF3401343C00CC5100003D +:108E60006660F8BD70B5041CC0680568201C14302D +:108E7000061C00F00FFB002816D0012202212069F9 +:108E800005F0F8FA002801D0FBF724FF00220221A8 +:108E9000206905F0EFFA002806D0FBF73C000852E5 +:108EA000000001FF002802D0301C0BF07CFB688919 +:108EB0008007C00F03F0A7F818230449584340184F +:108EC000C168002902D0201CFBF7D4F870BD94675C +:108ED0000100F8B5041C101C0D1C191CFF223C00DD +:108EE000445200000027FF2D25D0002905D04B88D3 +:108EF000002B02D000F050FC15E00021104E4B007A +:108F00009E190223F65E864201DD0A1C04E001314F +:108F10000906090E2629F1D3094E500080194E2367 +:108F20003C0080520000C05E272A07D20649203943 +:108F300049574731401A2060012702E07E20C04394 +:108F40002060381CF8BDFA470100B0B50C1C7E212A +:108F5000051C0020C943002C0FD0101C05F06BFD30 +:108F600000283C00BC52000002D0211CC93901E09D +:108F7000211C86390220C043FBF7B4F9011C0120F3 +:108F80002960B0BD98B5141C00220092221CFDF788 +:108F900043FE98BD054980B5086005490120C861B8 +:108FA000012100203C00F852000003F01CFE80BDAF +:108FB000000020670100AC7C010080B5002100208A +:108FC00003F011FE06F00DFB02490020086080BD91 +:108FD000000020670100034901200969002900D130 +:108FE0000020704700003C0034530000106701006F +:108FF00003480069002801D040697047002070478D +:109000001067010070B5161C0D1C041C002801D04F +:10901000012C07D100F036FA002805D013F0CAF968 +:10902000002801D1012070BD3C00705300000120D8 +:10903000002C00D000200A4C043461C4103C00F025 +:1090400024FA002802D000F0C6F901E000F0E5F8AB +:10905000C030C36B221D07CAFBF720F8002070BD8B +:109060000000D4670100F8B50D1C3C00AC530000B3 +:109070000021041C281C05F0E3F9231CFF332133D5 +:10908000FF27002805D02222011C181CFBF796F8A8 +:1090900000E01F700321281C05F0D2F9261CFF36C2 +:1090A0004136002805D00322011CB01C3C00E853C7 +:1090B0000000FBF786F800E0B7700121281C05F0DE +:1090C000C2F9002807D0011C201CFF300A224630BC +:1090D000FBF777F800E077713221281C05F0B3F92F +:1090E000002807D0011C201CFF30122250303C0009 +:1090F00024540000FBF768F800E0F7730621281CF1 +:1091000005F0A4F9002807D0011C201CFF30042220 +:109110006330FBF759F8F8BDFF346134A770FAE704 +:10912000084980B50968002801D107480168081C72 +:109130003C006054000005D103219020FBF71DFF87 +:10914000002080BD01F0D7FB80BD1C6701002067B7 +:10915000010080B5FFF7E7FF80BDF0B5002484462D +:1091600000200BE08740174007D014230B4D4343EA +:109170005B193C009C5400001B7C65462B55013458 +:10918000013001273B1C0E2800D300230E883D1C14 +:10919000A64200DC00252B40E7D10C80F0BD00008A +:1091A0007440010078B5041C01202070082000AB39 +:1091B0000D1C18803C00D8540000161CA01C6946E9 +:1091C000FFF7D1FF00AB0022D243198882406170C3 +:1091D00032202870102018803240A81C6946FFF702 +:1091E000C2FF00AB1888687078BD80B502F035FF0B +:1091F0000021002800D03C00145500000169081C23 +:1092000080BD00000549002801D0C86800E0086959 +:10921000002801D00430704700207047106701001B +:1092200003480069002801D00430704700207047CF +:1092300010670100024800693C00505500000028FA +:10924000FFD1704700001067010010B5054C206980 +:10925000002803D104219020FBF79BFE206910BD5C +:1092600000001067010010B5041C00F040F9002850 +:1092700001D0002010BD201C00F03C008C550000E7 +:1092800057F9002801D0012010BD022010BD0000B8 +:1092900070B50F4E041C30680D1C002807D0211C2F +:1092A000043005F0C1FB002801D030680BE0094A0A +:1092B0001068002809D0211C141C04303C00C8553B +:1092C000000005F0B4FB002802D020689C3000E0CC +:1092D0000348405D70BD206701001C670100CC475A +:1092E0000100044900200969002902D0FF31013141 +:1092F000886970470000106701000148007A3C004F +:109300000456000070470000AC7C0100FEB5061C4E +:1093100000201F1C141C0029029019D0012926D0FE +:10932000022947D12648007805F0A0FBA0720AF078 +:109330004FFC0E2809D1A07A05F0AAFB002804D022 +:109340003C00405600002048007805F092FBA072D7 +:10935000002020722FE01D4D2868002801D1FBF766 +:1093600052FE00972A68231C1832111C301CFCF78F +:10937000DEFB26E0301C0CF0CAFB051C02D0A868FE +:1093800000283C007C56000008D1134800680028E3 +:1093900001D1FBF73BFE104800681830021C0E4854 +:1093A00000970168231C1831301CFCF7C3FB002D0B +:1093B0000AD040352888800606D40020206003E0CB +:1093C000012190203C00B8560000FBF7F4FD029804 +:1093D000FEBDB069010090570100206701001C67C5 +:1093E000010080B5002002F04AFE1823054A5843C8 +:1093F000801840690121002800D04178081C80BDF8 +:109400000000946701003C00F4560000024908691E +:10941000002800D1C8687047106701000348C06881 +:10942000002801D004307047002070471067010009 +:1094300010B5054CE068002803D105219020FBF70A +:10944000BDFDE06810BD00003C0030570000106713 +:109450000100F8B50D1C002A03D01149124F0E78F7 +:1094600001E0114F0C26082E01D2341C00E0082424 +:10947000012101704470391C221C0230FAF7CBFE26 +:10948000321B002A07DD322028703C006C57000098 +:109490003919A81C6A70FAF7C1FEF8BDFF202870C0 +:1094A00000206870F9E70000A4690100B0690100BC +:1094B000905701000149486270470000946701001D +:1094C000034980B508600121012003F03C00A85742 +:1094D0000000C5FB80BD1C67010080B50021012094 +:1094E00003F0BDFB06F0B9F802490020086080BD1A +:1094F00000001C67010003490120C968002900D150 +:10950000002070470000106701000348C0683C005D +:10951000E4570000002801D04069704700207047E0 +:109520001067010080B50221012003F09BFB80BD84 +:10953000054A80B512690021002A03D0111D05F0EB +:1095400091FA011C081C80BD10670100064A80B515 +:109550003C002058000012690021002A05D0111C8F +:10956000FF31213105F08BFA011C081C80BD10670A +:109570000100054A80B5D2680021002A03D0111DE0 +:1095800005F073FA011C081C80BD10670100064A33 +:1095900080B53C005C580000D2680021002A05D04C +:1095A000111CFF31213105F06DFA011C081C80BD32 +:1095B00010670100FFB50D1C1F1C87B0109E002412 +:1095C00002F072FD1823134958430858002819D097 +:1095D000041C331C3C00985800003A1C281C0999B4 +:1095E000FAF79FFD041C14D0182000AB1880AA685D +:1095F00001A86946FFF7E7FD6A4601A9002007F0C8 +:1096000044FE002805D10A2100E00F219020FBF73D +:10961000EAFC201C0BB03C00D4580000F0BD000058 +:109620009467010010B5002402F044FD1823054999 +:10963000584340188068002802D0FAF771FD0124D1 +:10964000201C10BD9467010080B5024B00F04EF85D +:1096500080BD0000106701003C001059000080B57B +:10966000024B00F046F880BD000011670100F8B51C +:109670000E1C151C00281C4910D048681C4A288064 +:10968000002007E00B181C7A142363439B181B7CF3 +:10969000335401302B888342F4DC3C004C590000E9 +:1096A00024E000200F1C002408600FE0305D05F06E +:1096B00007FA0E2801D10020F8BD391908720122DD +:1096C000396882401143081C386001342888A04260 +:1096D000ECDC28887860FFF7B7FE00283C0088594A +:1096E000000006D00169002903D07F21C9430BF097 +:1096F00052FB0120E3E72C7D01007440010010B50E +:109700001C1C00280BD020780E2805D214230C4AEC +:1097100058438018007C00E0002008700EE03C00F8 +:10972000C4590000087805F0D1F92070FFF792FEC7 +:10973000002806D00169002903D07F21C9430BF01E +:109740002DFB012010BD00007440010080B52720D2 +:10975000C04309F031FC80BD80B52720C04309F02B +:109760003C00005A000039FC80BD80B5282009F07B +:1097700042FC80BD000080B5282009F04AFC80BD75 +:109780000000B0B5012828D1012901D0FBF76BFCFE +:10979000FFF7E9FD02281AD107F013FC124C2169EA +:1097A00088423C003C5A000015D007F00DFC2061B7 +:1097B00020687D24E40044430DF0AEF9051C07F059 +:1097C0000BFC281A844200D9241A0122211C0A20E9 +:1097D0000DF0B2FDB0BD002109200CF075FCB0BD4C +:1097E00007210A203C00785A0000FBF714FCB0BDAA +:1097F0000000D46701007D20024900010860704725 +:109800000000D467010010B5816D041CFF304630A4 +:109810000CF0D1FC201CFF305030A16D0CF0CBFCC3 +:1098200010BDB0B5041C3C00B45A00000D1C02F081 +:1098300059FC201C02F056FC1823044958434018D8 +:109840001822291CFAF770FDB0BD000094670100D2 +:1098500010B5041C09F0BCFB201C09F0C7FB10BDAF +:1098600010B5041C09F0D0FB3C00F05A0000201C8D +:1098700009F0DBFB10BD70B50C78061C48884D78EC +:10988000E200801AE900401A011C414312312420F1 +:10989000FAF791FD211C6143C9004018291C694356 +:1098A000C90042180C4988790C4B3C002C5B000025 +:1098B00053430C4A1360537B34021460527B88710B +:1098C00001335810084B801A0121490258430028DF +:1098D00000DA494208188012213870BD20100700B4 +:1098E000EC04000000A00700030300003C00685BDC +:1098F000000010B5041C06210430FAF770FCFF20AC +:109900002130FF210155201CFF3041308170417111 +:10991000C173FF2063300155002020616061FF3476 +:109920000134A060E06010BD000070B5061C3C0072 +:10993000A45B0000081C58609A601C1C1E60151C6B +:109940009B8AE28A311C02F0A1FC281AE06070BDFB +:1099500070B5041C081C111C1E1C0025EB43221CA6 +:1099600018320BF0F7FB221CFF325032111C0A395F +:109970003C00E05B00000123201C00F0C6F80C282E +:1099800010D00125201C0BF0ACFA201C00F019F8B7 +:10999000201C00F00AF8201C00F029F8311C201CC3 +:1099A0000BF017FA281C70BD0000FF211D3109586B +:1099B00080303C001C5C00008907002901DA01218D +:1099C00000E00021C1627047011C803100220A635F +:1099D000074A1268002A09D04288920606D5FF304D +:1099E0000130C069400701D40120086370470000BE +:1099F000AC6901003C00585C000080B5011C4A883D +:109A00000020520505D5FF310131C969490700D44D +:109A1000012006F0ECFB80BD0000F8B5051C98683D +:109A2000171C0E1C1C1C002802D1201C0CF031F845 +:109A3000AB69391C301C3C00945C0000A2680BF040 +:109A400095FBF8BDF8B5161C0D1C1F1C002402F078 +:109A500061FB18230649584340184368002B05D082 +:109A60003A1C311C281CFAF78EFB0124201CF8BD7F +:109A70009467010080B507F03C00D05C0000C5FA97 +:109A8000094908610868002802D17D2000010860AA +:109A900008687D21C9004143002301220A200DF0FE +:109AA0004EFD80BD0000D467010080B501210A2071 +:109AB0000DF097FC80BDF8B50E1C3C000C5D00005D +:109AC0005168141C1268A5680B1C751B5719974226 +:109AD00000D20131426800258A4202DD0125626020 +:109AE00005E09A4203D10168B94200D90125002D51 +:109AF00009D001682160A660A38AE28A3C00485D23 +:109B00000000606802F0D7FB301AE060281CF8BD46 +:109B1000000080B502F007FB1823034958434018A2 +:109B20001821FAF798FB80BD000094670100FEB58C +:109B3000041C081C111C1E1C0C25012200923C0058 +:109B4000845D0000A26902ABFDF7F0F8002845D063 +:109B500002982721021C0A4001D1084302902149A2 +:109B6000A069084006D00298014003D14921C900EC +:109B700008430290A06D0299884230D0002E2DD06B +:109B80003C00C05D00004021201C5830FAF769FB02 +:109B9000029800250026371CA06519E0C00711D5E2 +:109BA000F019001970300571281C04F0D4FF00284A +:109BB00004D0A01980300572013603E0E01960304E +:109BC00005703C00FC5D0000013701352D06029850 +:109BD0002D0E4008029002980028E2D18420065100 +:109BE000F0192067E765002500E00B25281CFEBD65 +:109BF000D83A000038B5051C081C111C0024E243AB +:109C00006B46FFF73C00385E00004FFA002805D095 +:109C1000A86900990140814200D10124201C38BD6F +:109C200000007CB5056A8669041CC068FBF7B7FBB9 +:109C3000E169FBF7DAFA201CE2694030C18B128936 +:109C40008918C18306493C00745E000001940091AC +:109C50002869331C82880168E068C06800F0F2F966 +:109C60007CBD0000915E0000B0B5D1685569C86840 +:109C7000141C144B0CE002689A4207D1C268CA60F7 +:109C80000021C1600160FBF73C00B05E000073FB87 +:109C900003E0011CC0680028F0D1E068C068E860FB +:109CA000E068C560201C4030C18B2A898918C183B7 +:109CB0002068002802D0FFF7BAFFB0BD044804F0C6 +:109CC0004EF9006A07F077FAB0BD3C00EC5E000088 +:109CD000A07E0100A06A0100F1B582B00298066979 +:109CE000011C083660314568019182E01021002096 +:109CF0002F69FBF763FB6861018908390904090CC6 +:109D000001816869006840180821FBF73C00285F62 +:109D1000000057FBE86168697188006820220180B3 +:109D2000716841600199497B89011143C17000212B +:109D300081702820FBF775FC3988041CC181A86B51 +:109D4000002803D1012080020843E08106223C0064 +:109D5000645F0000391D201C1030FAF7C5FA391C69 +:109D60000A310622201C16300090FAF7BDFA391C81 +:109D700010310622201C1C30FAF7B6FAE189254A78 +:109D80005C201140012292031143405BE1810F21CD +:109D90003C00A05F000008406084201C2030162199 +:109DA000817100212170E96B002907D02969098B95 +:109DB0000907090F2170A184182181710622601CF6 +:109DC0000099FAF794FA7068000EE071706800026A +:109DD000000E3C00DC5F0000207270680004000E82 +:109DE00060727068A0727088000AE07270882073D8 +:109DF000708801300004000C708002D1706801305E +:109E00007060AC61029828622D68002D00D079E75F +:109E1000029804493C00186000004268044804F0BD +:109E200074F8FEBD00008FC7FFFF3DDA0000A06A96 +:109E30000100B0B5074D2878032808D000242C7005 +:109E40006968002903D00120FAF7C8F96C60B0BD39 +:109E500000009C7301003C0054600000F8B52B4BDF +:109E6000D86A002850D02A48011CFF310131CA6845 +:109E70000132CA601A6C002A02D14A6901324A6171 +:109E80000A6901320A61DA68002A04D01F4A0132E5 +:109E90001278002A02D18A693C00906000000132E9 +:109EA0008A610025071D18261A4A6E43743290599C +:109EB000002829D0B4186069002825D160680028DE +:109EC00002D00168002905D1A16800291CD00968C9 +:109ED000002919D0002805D0E1683C00CC600000C2 +:109EE0000131E1600068814211D3A068002806D0EA +:109EF0002169006808180CF0A3FD002807D0064A65 +:109F00000120606174329159381CFAF770F90135FB +:109F1000022DCBDBF8BD0000447D01003C00086150 +:109F20000000F4670100F8B50F1C0025041C002890 +:109F300025D0201C04F003FE002806D0FFF7FFF810 +:109F4000041CFFF750FB061C07E0201CFFF791FBE9 +:109F5000061C201CFFF76FFB041C002E06D03C00E3 +:109F600044610000FFF74CFB002802D001250120CE +:109F700007E0002C06D0FFF7EFF8002802D00125FB +:109F800000203860281CF8BDB0B5C568041C0DF071 +:109F90008FFC207EC10708D5E168A94205D9226956 +:109FA0003C0080610000914202D3E18A0131E182EC +:109FB000810708D5E168A94205D22269914202D8F9 +:109FC000E18A0131E182400706D5E06821698842D3 +:109FD00002D1E08A0130E082E08AA18A88420DD372 +:109FE000607E3C00BC61000002280BD02068E16864 +:109FF000042207F065FB607E002803D1206808F08A +:10A00000ABFFB0BD0020E082B0BD000070B5061C03 +:10A010000C232049584345180020A860301C06F046 +:10A0200091FE041C3C00F8610000686033D0012000 +:10A03000A8702C20005D022803D1201C03F045FEEF +:10A0400010E0616B00290AD0012804D1211C281CD2 +:10A0500003F055FE06E0201C0AF00DFC02E0201C77 +:10A060000AF03DFB0D483C003462000014384168A2 +:10A07000002910D0201C4030028B1207920F012AB9 +:10A0800009D0808B32020009000410438122024370 +:10A090000C200DF0B7F90CF0A5FD606470BD000058 +:10A0A000607B0100FFB5081C3C0070620000111CC1 +:10A0B0000C32202414430C4A83B00CAE526860CE9C +:10A0C00094700024D47093630D234027BB52946195 +:10A0D000148401220292321C00900191231C291C3D +:10A0E000039800F066F907B0F0BD3C00AC620000D8 +:10A0F000A07E0100F8B5041C0027114E1DE0E068A9 +:10A10000002870680CD1808800070DD101210C480F +:10A11000FBF784F9C460E86070688188013102E06F +:10A120008188228989188180E068391C3C00E862B6 +:10A130000000002801D17168C96D251C6160041CF4 +:10A14000002CDFD1F8BDA07E0100064910B549689A +:10A15000002305E08A88048912198A804360C06858 +:10A160000028F7D110BDA07E010010B509493C00C0 +:10A1700024630000002449680AE08A880389D21811 +:10A180008A80C368221C002B00D1CA6D4260181C53 +:10A190000028F2D110BD0000A07E0100011C134870 +:10A1A00010B54068002309E082880C89121982806A +:10A1B0003C00606300004B60CA68002A00D1416621 +:10A1C000C9680029F3D1011C68318164C364436507 +:10A1D00082880823111C08318907890F591A5023D6 +:10A1E000195251188180011C406E4831C16010BD68 +:10A1F00000003C009C630000A07E010010B50749F0 +:10A2000000244B6806E0C268211C002A00D1D96DE9 +:10A210004160101C0028F6D110BD0000A07E010096 +:10A2200070470000FEB5061C0C480C1C40688021DD +:10A23000817000213C00D8630000C170151C4022D1 +:10A2400081631152816101840020042202920090F6 +:10A250000191291C201C1A1C331C00F0BCF8FEBD07 +:10A260000000A07E010070B5061C1748807802210E +:10A27000164A884390703C0014640000101C8078DB +:10A280000843111C887013480024C4707020FBF729 +:10A29000D9F9114D70216860FAF734F83007000FD2 +:10A2A00069689030C8650D4868220880081C28300D +:10A2B00089604861082008823C0050640000081C46 +:10A2C00038304863203848645A20505406480831D2 +:10A2D0004164446570BD0000070058000700A07E7F +:10A2E0000100DEC00000003007000A4B10B5586DB9 +:10A2F0000A490022496800244A623C008C6400003C +:10A300005C654B6E002B01D0DA604A668B6D002BCA +:10A3100003D00A6E0021F9F79CFF10BD0030070042 +:10A32000A07E0100094910B508880130088001208D +:10A33000074980020860074CA26D002A3C00C864EF +:10A34000000005D00521D1200DF06FF90120A06596 +:10A3500010BDB07401000010070000300700FFB509 +:10A3600083B00CAE86468C460E4A43CE0FAD0F1C12 +:10A3700052680C3730CD9770D37096630D263C0031 +:10A38000046500004027BE52059E9661138400229A +:10A3900002922A1C00900191211C6046734600F035 +:10A3A00029F807B0F0BD0000A07E0100FFB5101C29 +:10A3B0001A1C0C1C191C6023FF3213430C4A83B077 +:10A3C0003C00406500000CAE526860CE93700023E4 +:10A3D000D37093634027BB5293611384032202928C +:10A3E0000191291C321C0090201C039B00F005F8F1 +:10A3F00007B0F0BD0000A07E0100F8B5051C1148B3 +:10A400001C1C3C007C650000089B079F4068DE0028 +:10A4100081650266002181800D488159201CF9F771 +:10A4200022FF0B4830184168281CF9F71CFF074928 +:10A4300006984968002C88620F8600D12C1C0548BC +:10A440004C6245653C00B86500000121016501646E +:10A45000F8BDA07E01009052010000300700FFB55A +:10A4600083B00DAE60CE0C9F081C111CD219FF32B8 +:10A47000402414430B4A526894700024D4709363B0 +:10A4800040239F5294613C00F46500001484022232 +:10A490000292321C00900191231C291C0398FFF7A3 +:10A4A000B5FF07B0F0BD0000A07E01004C210D4AB1 +:10A4B000414310B58C180C490978884207D105F042 +:10A4C000C7FD0A48018801223C00306600001203E3 +:10A4D00091430180201C30300C23C156407B8142C7 +:10A4E00002DD208D0CF0E5FB10BD58E301003C7C43 +:10A4F000010032800700011C603180B5CA798B7978 +:10A500009A4207D9487A0C2307493C006C66000040 +:10A510005843085A0CF0D0FB80BD2030007B012846 +:10A52000FAD1487A05F040FD80BD0000607B010053 +:10A5300010B5041C1C21F9F703FF0348A080E0803C +:10A5400020816081A08110BDFFFF00003C00A86653 +:10A550000000FFB5041C002083B00D1C062C0290E7 +:10A5600038D21F4AFF26C10089188978A14203D139 +:10A57000C0008018467804E0013000060016062866 +:10A58000F1DBFF2E24D00193201C0DF0E8F93C00F4 +:10A59000E4660000002805D02421281C01AB02AA93 +:10A5A000FAF730FE1049F00030390F58310609161D +:10A5B000281C059A019BF9F76EFE061C10D1201C81 +:10A5C0000DF0D0F900280BD0281C6969FAF712FEAB +:10A5D0003C00206700000298686104E0062C01D36B +:10A5E000072600E00826301C07B0F0BD0000CC5A5A +:10A5F000010010B50C1C09F086F8002802D0201CC0 +:10A6000009F0B5F810BDFEB5134D041CAE69002E5F +:10A610001CD03C005C670000104F30377868604306 +:10A62000011C2888F9F7D2FF39686143411801A855 +:10A63000321CF9F737FE0298296A401828620BD4B9 +:10A64000E969884208D9A969401A2862019801304D +:10A6500001E000203C009867000002900190019802 +:10A66000FEBDC8740100F8B5002828D00024144DA0 +:10A6700000E0013461000919491949780029F8D12D +:10A6800063001B1903330722694603F0D4FB002C37 +:10A690000FD0002000993C00D46700000AE042007F +:10A6A0001218AE5C531852195E71567801309E71C3 +:10A6B0009278DA71A042F2DB00980322023003495B +:10A6C000F9F77EFEF8BD0000EB620100E8620100D0 +:10A6D000B0B5051C081CFAF73C00106800009DFF8F +:10A6E000041C281CFAF7D9FE211CFAF7FCFD201CDB +:10A6F000B0BDF3B544480C1C007881B0012872D17C +:10A70000FAF782F8414DE86A41490860E86B486011 +:10A710004048FAF7A6F9E86A00283C004C680000B7 +:10A72000FCDA221C0F2001990AF0A4F8384D022708 +:10A730002F63384A64260020AA21083213180130FA +:10A740000004000C64281974F8D3168100205060AE +:10A75000101C103010600025171CD2603C00886867 +:10A76000000008E0281CF9F7A2FF413178190135F3 +:10A770002D042D0C0174B542F4D3264D6F630120D6 +:10A780002863244DE86A0028FBDA0B223B1C244E88 +:10A7900003E00132642A00D10022101C0C213C008D +:10A7A000C46800000139755C1F183F7CBD42F3D1BD +:10A7B000013800D563200029F4D1184E501CF16BEC +:10A7C0001A4A101C0138FDD1F06B884201D0011CDF +:10A7D000F7E702273763164D9021281CF9F7CEFDC5 +:10A7E0003C0000690000281C28302860281C10301C +:10A7F0002F81E860281C20302861042100E00CE053 +:10A800002983E861ED62756301203063221C892091 +:10A8100001990AF038F800202863FEBD00000857AF +:10A8200001003C003C69000000300700108E010070 +:10A8300074FF010009570100204E0000E4FE0100F2 +:10A8400080B513281ED0F02816D109F0B5F90028DC +:10A8500013D10DF0BFFA11F00DFC00220421C42029 +:10A860000CF01CFF3C0078690000094800210078CA +:10A8700005F03FFD05F093F807490120086080BD11 +:10A88000011C0120FAF787FC80BD00F032F880BD82 +:10A8900000006A5701003CD90100B0B50CF0FFF987 +:10A8A0000B49022448603C00B46900000A48046176 +:10A8B0000120772109030861084D6868800702D4E8 +:10A8C00068682043686009F0C7F96868A043686059 +:10A8D0000020B0BDE060010000300700000107006B +:10A8E00080B50123032200213C00F0690000022012 +:10A8F0003CF0F1FA002801D0FAF781FC80BD1CB5CC +:10A90000FCF7F5FAFAF719FE01F003F90024211C0F +:10A91000684601F0E2FB00AB1878012803D002285A +:10A9200001D0032801D10CF0B2FC3C002C6A0000DD +:10A93000013424062416062CECDBFAF709F9FAF7A1 +:10A94000E7FCFAF733FAFAF76DFAFBF7DFFF05F0E9 +:10A950004DFB06F081FC0BF07DF907F029FC114856 +:10A960001021016009010160C90201603C00686AB0 +:10A97000000089000160202101600421016008219C +:10A98000016040210160802101608900016049006F +:10A9900001604900016049000160C9030160890B41 +:10A9A0000160F9F741FF1CBD0000001007003C00EA +:10A9B000A46A000080B53BF04FF83BF07DF9FAF750 +:10A9C0004BF980BDF8B5002500240022002871D085 +:10A9D000434FB9680B1ABB60F868391C0130F86046 +:10A9E000896A002B1EDC0224002906DAFB699842E2 +:10A9F0003C00E06A000006DD3B69984209DD07E0A3 +:10AA0000BB69984201DC012403E07B69984200DDC8 +:10AA10000324786A002808D000207862032C01D132 +:10AA2000022402E0022C00D101242E48012C0079DE +:10AA300018D13C001C6B0000BB78994215DA3B78BA +:10AA40007B7039700131B96201D50131B962B96ADF +:10AA50000125994203D1042804D2013000E00020EE +:10AA600038710122002933DA27E0032C35D1002682 +:10AA7000002807D03C00586B00001E498140386A0E +:10AA800008180CF05CF800282CD01B480078400710 +:10AA900005D5F8683969884201DB0323FE56B86A98 +:10AAA000B04212DD01217962397801257970387060 +:10AAB0000138B86288423C00946B000001D000214C +:10AAC000397100280CDA0720387100E012E007E045 +:10AAD0003879002809D0FF30387106E0002A02D00A +:10AAE0000CF0F8F83862002C04D0FEF797FD291C12 +:10AAF00008F0FCFBF8BD00003C00D06B0000AC7E11 +:10AB0000010050C300001D75010080B510680028C9 +:10AB100002D000F00AF880BD0348C069806808F0E0 +:10AB2000B2F980BD0000846A010010B5041CC06841 +:10AB3000C068002801D1FAF77AFB3C000C6C0000D9 +:10AB4000E068E169C068231C014AFFF7D7FB10BD2C +:10AB5000DD6B0000B0B5051C0C210020FAF7D6FC17 +:10AB6000041C006800214160016029880181698816 +:10AB70004181291CFF312131201C03F03C00486C2D +:10AB8000000077F9291CFF314631201C03F071F9D0 +:10AB9000291CFF315031201C03F06BF9291CFF31B7 +:10ABA0004331201C03F065F9291CFF316331201C5F +:10ABB00003F05FF904480068002802D0201C3C0024 +:10ABC000846C0000FFF78EFD201CB0BDE462010024 +:10ABD000F8B5051C0C1C04D105211820FAF702FB5E +:10ABE0004DE0291C12310622601CF9F725FC221CBD +:10ABF00030320026002100201670344B1B5C2F8A57 +:10AC00003C00C06C0000DF40FF0707D51778013318 +:10AC100001371770671830377B70013101300E280B +:10AC2000EEDBA87B6072107800282BD02A481E210A +:10AC3000095C271C1037217201686181C189217765 +:10AC400081893C00FC6C00007973C18AA181018B71 +:10AC5000E181428A211C60314A80828A8A801F49B0 +:10AC60002C31097A002909D002290AD10122626215 +:10AC70006272428BA281808BE08103E001216662D7 +:10AC800000E000213C00386D0000E87B084001D165 +:10AC90000020F8BDA868431C09D0221C1232009283 +:10ACA000931D0232211C01F09CFAA06200E0A66212 +:10ACB000687B291C1D3120740B4820222062201C37 +:10ACC0004230BE73F9F73C00746D0000C1FB4034A4 +:10ACD0002670687E0449607068682C3148600120E5 +:10ACE000DAE7000090580100C86E010091020100EF +:10ACF00070B5161C0D1C041C002806D00C20FAF799 +:10AD000047FD30C0083806723C00B06D000070BDD1 +:10AD1000002070BD0000011C054880B5006801D00E +:10AD2000012100E00021FCF7A0FC80BD00000C79AF +:10AD3000010070B50E1C041C002801D1FAF78FFA2F +:10AD4000064D2868002801D0FAF73C00EC6D0000A1 +:10AD500089FA04482E60C4600121017070BD0000B2 +:10AD6000A87E01003000070010B5074C20680028BD +:10AD700001D1FAF777FA054800692168F9F7DFFA97 +:10AD80000020206010BD0000A87E01003C00286E5D +:10AD900000003000070001200549C00680B50860AA +:10ADA0000022032154200CF0B8FC80BD00000010EC +:10ADB000070080B500220421C4200CF0AEFC80BD49 +:10ADC0000000044880B500880249FFF7B8FF3C0046 +:10ADD000646E000080BD0000754B0000C874010067 +:10ADE000F8B5061C31480025C0680C1C002830D07E +:10ADF0002E482F4F0430007838762C4804304078A5 +:10AE00003881002A0BD0F9F7A5FA1F20B876201C4C +:10AE10003C00A06E0000F9F7F6F925480430807870 +:10AE2000B87643E02548224984424D6902D26C43FA +:10AE3000E40B0FE01F48211C806A0090F9F723FC07 +:10AE40000099021C4A43A11A1A4A6943526AC90B63 +:10AE500050433C00DC6E00004418022C01D8002056 +:10AE6000F8BDF9F77DFA1F20B876201CF9F7AEF986 +:10AE7000041C114804308078B8760F4F7D6AAC42CC +:10AE800004D2201CFFF722FC051C12E0211C281C08 +:10AE9000F9F7FCFB3C00186F0000061C6843201A01 +:10AEA000FFF717FC051C002404E0786AFFF711FC8B +:10AEB00045190134B442F8D3281CD4E70000C87403 +:10AEC000010030000700C0C62D00011C7D2080B5A8 +:10AED000C000F9F772FB3C00546F00000249886122 +:10AEE0004008C86180BD0000C874010010B5064C60 +:10AEF000211C00200BF042FA211C00200BF00AFA62 +:10AF000000F068FE10BD0000856F000030B50F4DE9 +:10AF10002A78042A19D8002A3C00906F000017D024 +:10AF2000002107E04B005B185C190123E4568442C2 +:10AF300002DA01318A42F5DC8A4200D10139480047 +:10AF4000401840198178024A343A1170C078507024 +:10AF500030BD0075010030B5111C3C00CC6F000005 +:10AF6000383185B09162082111860023141C011C20 +:10AF70005363C068154D0BE00268AA4206D1C2684F +:10AF8000CA60C3600360FAF7D1FA03E0011CC0682D +:10AF90000028F1D1221C4032082120683C000870B2 +:10AFA0000000FAF764FB0B49201C4830029004941F +:10AFB0000391E069828801686E2001920091221C51 +:10AFC0005632035D211C28312068FFF758FA05B07E +:10AFD00030BDA07E0100D57000001CB507493C00C3 +:10AFE00044700000021C01900091C069131C848809 +:10AFF000016810684833221CFFF708F91CBD0000E7 +:10B00000C96F000010B5141C184803F089F8A0425D +:10B0100001D0FAF745F90422201C4030A16AF9F763 +:10B020003C0080700000BDF9002802D101202062A0 +:10B0300005E0002020628420005D002803D1201C50 +:10B0400009F023FB05E02068FAF779FA201CFAF7EB +:10B05000A4FBE0698079062806D1206A0649002809 +:10B0600003D03C00BC70000008690130086110BDCD +:10B0700048690130486110BDA06A010028610100E3 +:10B080001CB5141C154803F051F8A04201D0FAF782 +:10B090000DF9201C4F300279417900AB12021143A7 +:10B0A000C27812043C00F870000011438278120646 +:10B0B0001143009101784078090208439880201CD0 +:10B0C000694606F03CF9002803D1201C09F0E3FA98 +:10B0D0001CBD2068FAF739FA201CFAF764FBF7E781 +:10B0E0000000A06A01003C0034710000BCB51F4D97 +:10B0F000141C281CDC3003F01FF8A04201D0FAF722 +:10B10000DBF8A06C00AB027881781202114302795F +:10B110001204114342791206114300918179C079DA +:10B12000000208439880201C3C00707100006946B2 +:10B1300006F00BF9002817D001280ED1ED6C002D78 +:10B140000BD08020025DE06C0121002800D100219D +:10B1500060686B460A30F9F723F92068FAF7FBF9C3 +:10B16000201CFAF726FBBCBD201C3C00AC71000083 +:10B1700000F08EFEFAE70000C4690100BCB5041CB3 +:10B18000406A0025002803D06068008B05072D0F5A +:10B19000221C403208212068FAF77EFAA168019546 +:10B1A0000091211C221C6032206850313C00E87163 +:10B1B00000000D1CE36809F0E2FFE069806B0028E5 +:10B1C00003D1FEF7E8FA002801D0182000E0102093 +:10B1D000064901940091E169082309680A18211CB5 +:10B1E0002831281CFFF787F9BCBD357100003C00F1 +:10B1F0002472000010B5101C3830906204201086B4 +:10B20000002050631068141C40320421FAF74AFAF7 +:10B21000231C211C2831024A2068FFF7BDF810BD0D +:10B22000657000000EB5C369021C9888054902923A +:10B230003C0060720000019100901B6810689169E9 +:10B240000322FFF7AEF90EBD0000257200000EB517 +:10B25000021C0649102000900292131C01911068F4 +:10B26000002270330021FFF79CF90EBD000025720B +:10B2700000003C009C72000010B5031C002100205F +:10B28000084C00E00131CA00A2589A4202D00B29B2 +:10B29000F8D310BD0B29FCD2C90009190020087190 +:10B2A000012010BD385801008CB500AB86211980F3 +:10B2B000011C04483C00D872000006F0EEFE01902C +:10B2C000684606F0FAF88CBD0000707C010010B5ED +:10B2D000041C0D480D4994B00480062218310C302E +:10B2E000F9F7FBF801A807F0A2F80C2009A94872A9 +:10B2F00000AB1C8002213C0014730000684603F080 +:10B30000DBFF049001A806F0D1F814B010BD0000D6 +:10B31000587C010080B504F045FE05F053FA80BD6D +:10B3200010B5194CE068002806D0611C0878002888 +:10B3300003D14878FF3008703C005073000010BD06 +:10B34000FF300006000E0870A1680029F7D0002821 +:10B35000F5D10E4854308178002903D1C178FF31EE +:10B36000817010BDFF310906090E8170F9D1A16904 +:10B370000029F6D0808803F0D0FB3C008C730000DD +:10B38000044A011C5C320C3205CA801AA269F9F722 +:10B390001FF810BD447D0100F0B5041C4068002575 +:10B3A0000179002285B0C907CB1769490133896A41 +:10B3B000102905D36649C039086B01303C00C873B9 +:10B3C000000008638EE021680E68F678B706FF0F6C +:10B3D000B609002B049706D063691F1C1B6A5037FF +:10B3E0009F4200D10125002D02D063691B6A04E051 +:10B3F0003C23594F7343DB190433E3619F883C00BE +:10B4000004740000002F70D09B79022B6ED0042BA7 +:10B4100017D0062B69D10868A06108890438088113 +:10B4200020680168043101604E4900295DD0049F05 +:10B43000BA425AD14948221C1C3002F065FE05B0C0 +:10B440003C0040740000F0BD0968251CCA794035F5 +:10B45000261CEA738B79221C503213704B796036AC +:10B4600053700B7993704B78D37009781171002168 +:10B4700029721621B173616A002906D0018B090770 +:10B48000090F3C007C7400002972B1811821B1734E +:10B49000011C0A31201C06224930F9F733F8606894 +:10B4A00014220188E982011D201C5830F9F72AF87E +:10B4B000E88A30490840012189030843E8827089FD +:10B4C0000F2108403C00B874000070812068018999 +:10B4D00008390181206801680831016008210020D5 +:10B4E000FAF783F8051C026820680821FAF7FBF8D0 +:10B4F0002068FAF774F82149C5602FE030E0FFE7D3 +:10B50000216860680A683C00F47400008023A2642B +:10B510001E55E564557913792D025B1995792D0433 +:10B520005B19D5792D065B19957812781202AA1845 +:10B5300015040A892D0C083A0A8121680A68083224 +:10B540000A60E169021C0A323C003075000001A863 +:10B5500009680BF03EF9E0692B1C0168201C703073 +:10B5600001AA0BF086F9094901226DE72068FAF774 +:10B5700022F8201CFAF74DF970E7846A010068612F +:10B580000100557200008FC7FFFF3C006C75000082 +:10B59000417000007972000080B502218220F9F725 +:10B5A00093FE80BD704700007047000070470000A8 +:10B5B00070470000704700007047000070470000AF +:10B5C00080B5C068F9F7FAFF012080BD3C00A8757E +:10B5D000000080B50021FF20F9F779FE80BD70479B +:10B5E000000070470000012070477047000070475E +:10B5F0000000704700007047000080B506219920C8 +:10B60000F9F765FE80BDB0B500250129124C3C005C +:10B61000E47500000FD10AF00FFC00281DD06178FE +:10B620003C235943091904310162611C416284625F +:10B63000041C503406E000290FD13C2050432570F3 +:10B6400004190434002C08D02068002802D02021DE +:10B650003C0020760000F8F718FFA5800720A071B5 +:10B66000B0BD6861010070B5041C002101F041FC0F +:10B670006068002801D0216801602068002801D09E +:10B6800061684160124E7068A04201D160687060CC +:10B69000E0683C005C76000000280BD0002506E046 +:10B6A000E068E900411814200BF0E2FF0135308812 +:10B6B0008542F5DB0621201C4430F8F7E9FE206BBB +:10B6C000002801D0F9F786FFE069002801D0FAF7D9 +:10B6D000AFF870BD3C009876000058750100F0B5D9 +:10B6E0001D4F059D3F6801261C1C331C002F00D0F8 +:10B6F0002B1C1D062D0E002906D011780E23164F87 +:10B700000918097A6B4310E02178002913D0FF3122 +:10B710000DE0012901D93C00D476000001311170FF +:10B7200011780E230F4F490811700918097A6B43DD +:10B73000DB19595C21702178002902D11178002988 +:10B74000EAD10948C068002805D02178301C0029BA +:10B7500000D10020F0BD01203C0010770000F0BDBA +:10B76000000018670100246701005C670100AC7CE1 +:10B77000010084460020F0B5002909D011781A4E46 +:10B78000B170194EB178717031700121316127E0CB +:10B79000164E0123F15663465F683C004C7700006B +:10B7A0000023F6560125CC0FB74200D90025002C06 +:10B7B00001D0002DE8D10E4F3B69002B03D0002DA6 +:10B7C00001D1167002E01C4301D111700120012447 +:10B7D000002B00D000243C61002C02D03C00887774 +:10B7E0000000711C397001E0FF3179700028D5D05C +:10B7F0000120F0BD0000AC7C010090B50A4C002097 +:10B8000093B0206103906846002108F084FD207AFF +:10B81000022801D1E06B00E0206CE06101203C00D7 +:10B82000C477000008F08AFD13B090BDF46E0100EB +:10B83000F7B5051C88880C1C82B01F4F002800D16A +:10B8400000270498002801D1F9F78AFD1B483B1C0A +:10B850000068211C0268281C0092049AFEF73CF83C +:10B860003C0000780000061C22D00321049802F05E +:10B87000B8FF00281BD08078012103F0E4FFA088E6 +:10B88000A18E484300040F49000C088003F081F9A1 +:10B890000122002D00D10022011C0E200BF0C9FE58 +:10B8A000002F3C003C78000008D10021281C02F049 +:10B8B000BDFC03E00026281C00F00AF8301C05B08F +:10B8C000F0BD0000C1A10000E4650100A87C0100FA +:10B8D00010B5041CFEF738F80121002C00D100211E +:10B8E0000E200BF03C0078780000DDFE10BDF8B5AE +:10B8F000071C0BF094FAFDF7BCFE002602281E4D33 +:10B9000001D02E70F8BDFDF73EF8041CF9F759FC84 +:10B91000002814D0FDF777F8002810D002F0F9FBCA +:10B92000002801D000243C00B478000000E0154C51 +:10B93000331C211C072216200BF066FF687880213B +:10B940000843687002F00AFC0028DED128788007DE +:10B95000DBD4FDF723F9002805D12878C00702D5EC +:10B96000FDF742F8D1E702F03C00F0780000CDFB93 +:10B970000028CDD02878022108432870211C381CCB +:10B98000FDF7C1F8C4E7606C01007102000010B55A +:10B99000124C01202070FEF7F0F90121A068FBF79E +:10B9A000F4FEA06803F087FF0D483C002C790000EE +:10B9B000A16807F023FDFBF755FFE06800280DD0D4 +:10B9C000094906200AF024FD084905200AF020FD57 +:10B9D000FBF76EFF002801D005F0F8FC10BD000059 +:10B9E0007869010034630100E13500003C006879AA +:10B9F0000000B1350000F0B5244D234C687C203C9C +:10BA00009BB0002808D0022803D820890138208163 +:10BA100037E000276F7434E01C4E68221436311C66 +:10BA20000C3101A8F8F709FE1848338901213C00C0 +:10BA3000A479000044300A1C002B007B00D1021CBA +:10BA40001206120E0DAF3A709446AA7B931930334A +:10BA50005B7B7B70EA7301321206120E0027824272 +:10BA6000AA7301D3AF7304E06246012A01D1776063 +:10BA70003C00E079000000E071600648074A803829 +:10BA800081674267682201A9F8F7DDFD278108F088 +:10BA900012FD1BB0F0BD84660100E92E0000F1B577 +:10BAA00086B006990020886106988468808D656854 +:10BAB00001283C001C7A00004CD9354949680591A1 +:10BAC000002947D00022002100230390281C96461D +:10BAD000944606680496F2788026B2433F2A2ED810 +:10BAE000D706FF0E0126BE40371C049E5209B678C9 +:10BAF0007600B2183C00587A0000264E92001C36A0 +:10BB0000B2583A401ED003E002900289C068511832 +:10BB10000028F9D10598814214D870460130864634 +:10BB2000002B04D06046D86001986246D06003982C +:10BB30000138039006D03C00947A0000231C24684E +:10BB40006068029A01909446C9E77046012807D9B7 +:10BB50002A1C00213F2001F051FF051C0698856139 +:10BB6000281C01F0B3FF0E480068002807D02868A1 +:10BB7000018840790231091A3C00D07A0000281C63 +:10BB800001F0E5FCA2680698C06806990B69291CBB +:10BB9000F8F77CFC034908690130086107B0F0BD83 +:10BBA0000000FC5A0100CC5C010010B5094A80007D +:10BBB0001258D006C00E0130074B3C000C7B000031 +:10BBC0001C68002CFCDB5A602022121A914019607C +:10BBD00019680029FCDB10BDE86001003020070077 +:10BBE000B0B5124C00252570A168114807F032FC51 +:10BBF0006561FBF7A3FEE06800280DD03C00487BA0 +:10BC00000000FBF7A4FE012107200BF070FD0A499C +:10BC100006200AF04CFC094905200AF048FCA068FF +:10BC200003F067FE0021A068FBF7CDFD05F0ABFB3C +:10BC3000B0BD7869010034630100E13500003C00CB +:10BC4000847B0000B135000010B50F4C207C00282B +:10BC500019D16069002816D1E068002806D00A488A +:10BC60001C38C068002801D005F0CEFB0121072058 +:10BC70000BF040FDA06803F03FFE0448A16807F008 +:10BC80003C00C07B0000DBFB0120207010BD786908 +:10BC900001003463010070B50E4C0122A368E56811 +:10BCA000268A5D1BB54201D1002206E025680133DA +:10BCB0002E68A3602660043503C5002A04D1012143 +:10BCC0009D203C00FC7B0000F9F752FB70BD03494E +:10BCD0000220086070BD000044E30100402007001E +:10BCE00080B502F0B9F880BD80B502212D20F9F7AA +:10BCF0003FFB002080BD000080B502212A20F9F71B +:10BD000037FB00203C00387C000080BD000080B57F +:10BD100001212B20F9F72FFB022080BD00000149F3 +:10BD20000120086170477C780100F8B5061C0C23DF +:10BD30000F1C1749584345186C68301C0BF03FFE28 +:10BD4000002F09D1301C3C00747C000003F0EEFE93 +:10BD5000412007551148211CFFF7A6FFF8BD4120DF +:10BD60000755A06B002803D0201C00F0DFF9F5E791 +:10BD7000201C00F0DBF9AC68002C02D00020A86089 +:10BD8000EDE7301C05F034F93C00B07C0000041CE9 +:10BD9000E8D108210C20F9F7F4FAE3E70000607B12 +:10BDA000010055800000074A80B55070516012783C +:10BDB000064B80005201D218101840380268081C47 +:10BDC000F8F77BFB80BD786901003C00EC7C00004B +:10BDD000FC420100B0B50A49041CC870084DE435A6 +:10BDE000A87A0871082C01D3F9F7FCFAA87A05495A +:10BDF00040014018A1004058F8F760FBB0BD0000BA +:10BE0000606C01008043010080B500283C00287D63 +:10BE1000000001D009F01DF980BDB0B5051C0C1C57 +:10BE200000200860686809F036FB6C60B0BD10B592 +:10BE3000041C09F034FB2168002900D1646010BDA6 +:10BE400000000021016040607047F8B546683C0082 +:10BE5000647D0000041C406A351C0A35002804D0AB +:10BE6000201CF9F789FD071C00E00427291C6069E4 +:10BE700000F0F6FC79000F18BA88F18A051C8A4296 +:10BE800005D13088000502D504F0BEFB3CE02868EF +:10BE90003C00A07D000000280FD001328A4204D16E +:10BEA000F9F70FFC2168C1600BE0F9F7F0FBF08AAD +:10BEB000000704D00021296029E0080727D1206865 +:10BEC0002860F08AB8801348016801310160318828 +:10BED00049053C00DC7D000018D429682160002160 +:10BEE0002960E16900290DD0897902290AD1082148 +:10BEF0002186211C3831A162221CDC30084902F065 +:10BF000081F9F8BD201C00F05FF8FAE7201CF9F772 +:10BF1000EFFCF6E73C00187E00002068F9F7BDFB57 +:10BF2000F7E7C4690100B9710000F8B50F1C097882 +:10BF30000124C90721D502F08CFF002801D000247C +:10BF40001BE00E4E756E002D17D0346E0622311C8C +:10BF5000381CF8F7D4FA3C00547E0000002805D1C4 +:10BF60000120002C00D00020041C03E0013D063617 +:10BF7000002DEED1002C03D1024EB06E0130B06620 +:10BF8000201CF8BD1079010030B5051C00200649C1 +:10BF900000221C23CC56AC423C00907E000001D114 +:10BFA000081C30BD01324831012AF5D330BDCC6DBB +:10BFB000010010B5084C00221C235343E358834270 +:10BFC00004D11C20504300190A6010BD01320E2A12 +:10BFD000F2D3002010BDDC7101003C00CC7E0000DB +:10BFE000F0B5416895B0071C90371391041CF878A0 +:10BFF000251C8035C6072879F60F4A4902284DD1FD +:10C000000A6D002A4AD04868013048600AF058FF9B +:10C0100044490861486113990979C9073C00087FC0 +:10C02000000001D441498861206806220690A16879 +:10C0300003A8F8F7EEFA062204A80230E168F8F740 +:10C04000E8FA07A806222169F8F7E3FAB87808ABFE +:10C05000002198700C96636A201CA0300A1C3C00DA +:10C06000447F0000002B02D0028A5207520F08AB17 +:10C07000DA7000AB998413990988C90BD984696B6C +:10C0800010AB1091A96B1191808B29491881096D12 +:10C0900003A8F8F732FA2979686B0BF04DFD29797E +:10C0A0003C00807F0000A86B0BF067FD3DE000289E +:10C0B00038D1486D1490002834D0206806220390AF +:10C0C000A1686846F8F7ABFA062268468018E1686E +:10C0D000F8F7A5FA05A806222169F8F7A0FA0021C9 +:10C0E00004913C00BC7F0000B97808A810AB017235 +:10C0F0000896E9680B9169794172686B0E90A86B9C +:10C100001090288DD880688D1881E1690CA80029CD +:10C1100004D089790170206A0D9001E00721017037 +:10C12000684614993C00F87F0000F8F7EFF902E048 +:10C130002068F9F7CAFA201CF9F7F5FB15B0F0BD35 +:10C140000000C4690100B0B5041CC0680622018962 +:10C150000C3101810568211C0C3D0560A818F8F719 +:10C1600064FA0622A1183C0034800000281CF8F76D +:10C170005FFAA08F0009E062206303480169201C78 +:10C18000F8F7C7F9B0BD00007C790100F8B5061CCE +:10C190006036051C707A0C23254958434418A86B57 +:10C1A0000027002806D0A0783C00708000000128FD +:10C1B00003D1A770707A0AF0B6FD2A1C0C218020EA +:10C1C0000BF095FBA86B002833D0A07802280BD089 +:10C1D000042822D1A7702F1C4037787802280CD170 +:10C1E000707A0AF0A0FD18E003203C00AC8000004B +:10C1F000A0701249002014390969F8F790F90FE08E +:10C200002C1C07E078784121221C08550C21802045 +:10C210000BF070FB6034607A04F020FF041CF1D155 +:10C22000707A4035A98B0002090909043C00E880B6 +:10C2300000000843812101430C200BF0A0FAF8BD57 +:10C240000000607B0100F8B51C49051C886A0130BC +:10C250008862281C0BF07DFD041C11D02B1C2033A0 +:10C260001E1C5A79201CB4301979144FFDF73C007C +:10C270002481000089F8AA7A201CB830B179FDF732 +:10C28000B9F8002F04D101212868FAF76DFAF8BD3A +:10C290006068BC21C08A085328680021FAF764FA54 +:10C2A000002809D00649C86A0130C862002CEED0C7 +:10C2B0003C0060810000201CF9F747FBEAE7201CE6 +:10C2C000F8F73CF9E6E7C4690100A1FF0000F8B502 +:10C2D000164C051F0022211CA03103E02868A04253 +:10C2E00009D02034A142F9D1002A04D102218E20A4 +:10C2F000F9F73C009C81000083F8F8BD0D4FBE7932 +:10C30000606901306061F8F797FDA84207D1A08805 +:10C310000430F8F797FDE0690130E06105E020683E +:10C3200028602560A0690130A061BE71E5E70000CA +:10C33000D05C01003C00D8810000201007000029DB +:10C3400001DB062901DB02207047064BC9005A5C5D +:10C35000C91802704A7842708A78827049684160D0 +:10C36000002070470000CC5A0100B0B50D1C041C21 +:10C37000052801D3F9F73C001482000075F8104835 +:10C380004068002800D00324102D00D30F2506207C +:10C390000B496043123140184178807849190906E9 +:10C3A000090E884200D2011C01208840054901384D +:10C3B000096808400004000C3C005082000002F0B4 +:10C3C00044FEB0BD0000D47A010008200700B0B5DB +:10C3D000041C0D1C09F0CFFD002803D1201C09F01E +:10C3E00082FD0561B0BD80B50AF097FD034A0C32AD +:10C3F00006CA8918081A80BD00003C008C82000023 +:10C40000A07D010070B50B4C049E64680DE065686A +:10C41000854209D1207A0870E068106020691860B0 +:10C42000207D3080012070BD2468002CEFD10020D9 +:10C4300070BD0000A46E010010B5041C3C00C88251 +:10C4400000002030817B20690430FDF764F9011C75 +:10C450006220025B636A4034207802F0CEFD10BD9A +:10C4600000000B4910B508888A690A2350435843D5 +:10C470000ED0084A53899488D2881B1952043C0074 +:10C4800004830000520C9A18C96806324A430A21F4 +:10C490005143F8F7FDF910BDC874010030000700E2 +:10C4A00010B5431C01D1104810BD0F4A0E4B943AF1 +:10C4B0001268443B1B7A10E0546884420CD1002976 +:10C4C0003C00408300000FD1022B03D1D47B022C0F +:10C4D0000AD204E0002B05D1D47BE40704D412680F +:10C4E000002AECD1002010BD101C10BD0000386FD8 +:10C4F0000100011C0120012900D00020704700B577 +:10C50000021C3C007C830000FDF7CEF8002808D018 +:10C51000101CFFF7F1FF1823034958434018006926 +:10C5200000BD002000BD00009467010080B5002818 +:10C5300000D10848074900685031097A002902D023 +:10C54000022904D13C00B883000000E0012100F082 +:10C5500006F880BD002080BD0000A46E0100124AD4 +:10C56000124B127A2C3B002A03D15A68002A18D1A8 +:10C5700004E0022A02D19A68002A12D100207047F2 +:10C58000C27B8A4201D03C00F4830000032A0AD116 +:10C59000827E012A07D1027F01321206120E027733 +:10C5A000C37E9A42EED200680028ECD170470000AA +:10C5B000F46E0100F7B58446002001270024002511 +:10C5C00088B007E06246525D3C0030840000002ADB +:10C5D00005D0AB006E46F25001358D42F5D3002DEB +:10C5E00000D00120002828D00027164C6E4622E0FB +:10C5F000201C00F030F8012801D0072806D10021C6 +:10C60000201C00F034F8316888423C006C84000043 +:10C6100001D2022714E02068C9000C18083C201C35 +:10C6200000F01CF8072807D10120012D00D00020C0 +:10C630002468002800D10834013D0436002DDAD1E9 +:10C640000A9804600BB0381CF0BD00003C00A884C0 +:10C650000000205201000068002901D08002800AF9 +:10C66000704710B540688000440F082C03D30221A6 +:10C670008720F8F7ECFE201C10BD002902D00068CE +:10C68000800D704740688005800D704700003C00B9 +:10C69000E484000010B540684001440F052C03D32A +:10C6A00005218720F8F7D6FE201C10BDF8B5051C23 +:10C6B000880A00901C488E05C069B60D171C1C1C0A +:10C6C000002805D1184881698D421DD0856111E08F +:10C6D0003C0020850000FDF7E8F8154909780E298F +:10C6E00007D1002805D0114950310623C956F9F762 +:10C6F00006FA0E490020C8618D61291C201CF8F73C +:10C70000E2F87943201CF8F7DEF808484161201C64 +:10C7100000993C005C850000F8F7D8F805484069AE +:10C720000A18A24201D2401801E04018001B800202 +:10C730008019F8BDAC7C010011670100F8B50F1C31 +:10C74000061C141C1D1C07F0A1FC0E2809D1201C7E +:10C7500002F0FCFB3C0098850000002804D008484B +:10C76000007802F0E4FB041C0121002EAC7200D022 +:10C77000391C201C02F007FC2860002028726C7213 +:10C78000F8BD90570100031C0A4810B50024021C94 +:10C79000A03203E081883C00D4850000994209D290 +:10C7A00020308242F9D1002C04D102218E20F8F7EA +:10C7B0005DFE002010BD0000D05C0100FFB5061C2E +:10C7C000002081B010601F1C0125141C301CFFF7D5 +:10C7D0006DFF052812D202A33C00108600001B5CEE +:10C7E0005B009F440000030303030800391C301C56 +:10C7F000FFF755FF03E00298F8F7EBF801302060EF +:10C8000004E005218720F8F734FE00252068802801 +:10C8100004D906218720F8F72CFE3C004C86000046 +:10C820000025281C05B0F0BD70B5174C606C0028C1 +:10C8300001D001201DE0164E144D3188A06C002857 +:10C8400008D02878814205D9F8F74CF80138FAF772 +:10C8500051FE0EE0E06C00280AD000203C008886E3 +:10C860000000FAF74AFE29783288914204D99042B2 +:10C8700002D9101C00E0081CFAF7DFFDE16B441A36 +:10C880000AF081FB201A00D5002070BD0000447D15 +:10C890000100F8600100FC600100FFB5274E3C007C +:10C8A000C4860000041CB0790F1C151C81B00090D8 +:10C8B0000AF06CFBC11923480768002F05D10A2133 +:10C8C0008020F8F7DFFD05B0F0BD1E4840688446C3 +:10C8D000002801D100220EE082680368AB4207D134 +:10C8E0003C00008700000379A34204D10B21802083 +:10C8F000F8F7CBFD23E0C0680028F1D1134BF868AE +:10C9000018603D603C71B96004988D1A38616046CA +:10C91000002305E08468A41AAC4203DA031CC06853 +:10C9200000283C003C870000F7D1F860002B08D1BC +:10C9300007483B1C47600848064A00880AF08AFB03 +:10C9400000E0DF600098B071C3E70000201007002E +:10C950007C5D0100213801002C740100F3B583B027 +:10C96000041C09D03C0078870000201C049909F0C1 +:10C970008EFB002803D0201C303005B0F0BD0AF03B +:10C980000EFB1E4A0026049F019600900292029C14 +:10C990000025391C201C143002F0C5FA002801D0F3 +:10C9A000261C03E001353C00B48700001C34042D34 +:10C9B000F2D3002E22D10198134F013001900228AA +:10C9C000E8D30121C906029A00201369009CE31AEA +:10C9D0008B4201DD191C161C01301C320428F4D3D3 +:10C9E0003068002801D0F8F73C00F0870000D3FE43 +:10C9F000301CFDF74AFF301C143006220499F7F76B +:10CA00007AFE009C301C3461BDE7306A010034427C +:10CA10000100094910B54C6903E0E168814203D087 +:10CA20002468002CF9D101E0002C3C002C88000087 +:10CA300003D102210220F8F737FD201C10BD0000B1 +:10CA4000FC5A010010B5C30706D5084B5C690C43BE +:10CA50005C611C7E14431C76800706D5044843693C +:10CA600019434161017E1143017610BD3C00688885 +:10CA70000000FC5701001858010070B50D1C041C83 +:10CA8000161C00F008F8A007C0170130321C291C42 +:10CA900000F021F870BD10B5C30706D5084B5C69DE +:10CAA0008C435C611C7E94431C76800706D53C0059 +:10CAB000A4880000044843698B434361017E91438D +:10CAC000017610BDFC570100185801000322111F08 +:10CAD00080B5012000F002F880BD000030B5151CC3 +:10CAE0000C1C002887B002D01C22224901E02249F8 +:10CAF0003C00E08800001C226846F7F764FE0599B8 +:10CB000000AB1A7E8C43201C9543029A291C0240DC +:10CB10000292019A02400192009A02400092039A06 +:10CB200002400392987C08409874587C08405874DE +:10CB3000187C3C001C89000008401874D87C084010 +:10CB4000D87402991048416101AA06CA91438161D3 +:10CB50008168019A114381608168009A91438160E4 +:10CB600000AA06CA11434268114341604168039A12 +:10CB7000914341603C005889000004A80BF001F883 +:10CB800007B030BD0000FC5701001858010010002C +:10CB9000070010B5041C011C012008F0E0F9002C6E +:10CBA00002D003F01CFF10BDFEF7D1FC10BDF0B5A4 +:10CBB0000C1C010E01233C00948900001B06090691 +:10CBC00099429FB028D11749084000211A2800D364 +:10CBD0000221002919D1C500134F10A8EE19B288FF +:10CBE0002168F7F79DFD201CF8F7EAFD7A5901A9A5 +:10CBF00010A8F7F707FD00283C00D089000005D0F9 +:10CC0000109801A90190B07900F09DF81FB0F0BD17 +:10CC10002A20F8F75EFC201CF8F7D5FDF6E7032183 +:10CC20002A20F8F756FCF1E700007FFFFF002445BB +:10CC3000010010B50C1C802802D03C000C8A0000BA +:10CC4000812808D103E0201C00F006F910BD201C4B +:10CC5000F8F7BCFD10BD03212C20F8F73DFCF6E7EA +:10CC6000F0B50C1C00218BB00A91010E01231B06AC +:10CC7000090699422AD118490840061C3C00488AF6 +:10CC80000000062E01D3072124E02089F8F7F1FEE9 +:10CC900022892168051CF7F74CFD201CF8F799FD47 +:10CCA000F4000F4E281C0AAA69463359F7F7B4FC62 +:10CCB000002801D0012807D12868694600903C006F +:10CCC000848A0000A01900790A9A00F009F9281C4A +:10CCD000F8F7B0FE0BB0F0BD01212B20F8F702FCF5 +:10CCE000F8E700007FFFFF00284601000A1C010E44 +:10CCF00001231B060906994280B508D05B009942C2 +:10CD00003C00C08A00000BD10006000E111C00F090 +:10CD10000EF980BD05490140101C05F0A2F980BD47 +:10CD200001212D20F8F7E1FB80BD7FFFFF0080B5DA +:10CD3000011C0F2000F013F880BD80B5011C0420F9 +:10CD400000F03C00FC8A00000DF880BD80B5011C9D +:10CD5000172000F007F880BD80B5011C012000F00D +:10CD600001F880BDF8B5041C061C802084430F1C0C +:10CD7000192C01D3F8F7EAFB0848045D211C0020B8 +:10CD8000F8F750FD3C00388B0000051C221C391CB4 +:10CD90000068F7F7DAFC2A1C311C0720F8F711F9B4 +:10CDA000F8BDF4450100F8B50D1C161C041C1F1C31 +:10CDB00008210020F8F739FD142201680E4B724358 +:10CDC000D2180C71127C3C00748B00004A710D600B +:10CDD0000B4A8F7112687F2A03D95205520E8023A5 +:10CDE0001A43CA71074A0023516801315160021C7D +:10CDF00081210020F8F708F9F8BD00007440010017 +:10CE0000FC5A0100806E01003C00B08B0000B0B500 +:10CE1000041C08210020F8F70EFD218BE27D051C83 +:10CE200009055207520F490C006811438180A17D0A +:10CE300014230E4A59438918097CC171E16A0160C3 +:10CE4000E168281CF8F717FC0A483C00EC8B00004E +:10CE50000068002801D0F7F7F1FB07490431886822 +:10CE60000130886000212A1C0020236BF8F7D2F8DB +:10CE70000120B0BD744001007C6E01000148806853 +:10CE800070470000806E010010B5041C3C00288C27 +:10CE9000000092B0016868460822F7F762FC00AB18 +:10CEA00098884007400FD87798884004000D188470 +:10CEB000D888588400980D900594208908382081DE +:10CEC000059801680831016000200A900C903C0030 +:10CED000648C00000021112009F078FB0549064A06 +:10CEE000086801300860022102A801F0CDFC12B0F0 +:10CEF00010BD0000806E0100558B0000021C012057 +:10CF00000006084380B52B210AF08AFD80BD000091 +:10CF10003C00A08C0000F7B5041C061C8020844354 +:10CF2000171C062C01D3F8F726FB0B48055D291CBE +:10CF30000020F8F78CFC041C006801992A1CF7F704 +:10CF400016FC391C201CF8F7A2FB221C311C002304 +:10CF500002203C00DC8C0000F8F768F8FEBD000001 +:10CF6000204601000A1C011C80B500230120F8F7AF +:10CF70005DF880BDFFB59FB01F1C051C0A301E90D8 +:10CF80001CAA1DA90AF000FF002871D0002F09D0AB +:10CF90000A2100203C00188D0000F8F75EFC0668AE +:10CFA000041C301DFAF7AFFA05E004210020F8F761 +:10CFB00054FC0668041C28893649012208807080C8 +:10CFC000E88814A9308019A8FCF7F5FCFCF7FFFBF2 +:10CFD000011CFF3121313C00548D0000201C01F068 +:10CFE000EFF819A9201C01F0EBF814A9201C01F09E +:10CFF000E7F8201C2099FDF74BFD0022022101F0EB +:10D0000033FD061C1C9900208861301CF8F71CFABF +:10D01000002E0BD0307A00283C00908D000002D00A +:10D020004021084330721C980222816911438161BA +:10D0300004E01C9902228869904388611DAA06CAEF +:10D0400001A805F058FB09A8002F02D00222427265 +:10D0500001E000214172049401A83C00CC8D000045 +:10D0600004F07AFB01211C9808F0C8FF002F04D0BF +:10D070001C980122816911438161A8881C9C01F0E0 +:10D080009FFE021C211C00E004E00748408809F0D4 +:10D090001FF804E03A1C00210520F9F73C00088E37 +:10D0A00000009BF8002023B0F0BDFC600100987CDC +:10D0B0000100F8B5041CC0680568A01D01F095FFCB +:10D0C000002845D0211C1431201C6A460AF055FE68 +:10D0D00000283DD0FCF77DFA002839D100983C00AB +:10D0E000448E00004B21095C012934D1042609F04B +:10D0F00019F9688800281BD1A8880321890388436F +:10D1000015490026088001220221206901F0B8FC9F +:10D11000041C14D000988069800710D5F8F79AF99C +:10D120003C00808E0000201CF8F7DDF8002809D1B3 +:10D13000F8F77FF901260098022281699143816105 +:10D14000002101E00098022108F061FF0098806949 +:10D15000A988C207D20F301CF9F745F8F8BDFA606C +:10D1600001003C00BC8E00001CB5046900230022B5 +:10D17000002C13D14B24245C022C03D1022905D0AE +:10D18000012203E0022901D101220123002A05D056 +:10D19000009004200193694609F036FA1CBD000096 +:10D1A000B0B5041C3C00F88E0000F2210F200C4D9D +:10D1B0000AF099FB287808280BD201A31B5C5B00BE +:10D1C0009F440703030808080808002C01D105F054 +:10D1D000BCFBB0BD012CFCD1FF2007F038FAB0BD7C +:10D1E0000000746601003C00348F00008CB5054AD5 +:10D1F00000AB1172009019716946082009F00AFA13 +:10D200008CBD0000AC7C0100F3B5041CC06806278F +:10D2100085B0066809F026FF984948632069032114 +:10D2200001F008FC964D00283C00708F00004DD0A6 +:10D230009549403109798078814247D1012120699F +:10D2400001F0FBFB02902069322101F0F6FB019016 +:10D25000021C8D480299FCF746FF002836D00023B7 +:10D260008A480299019AFCF7E4FE3C00AC8F00006A +:10D270000B282ED1864A51887089414003910B1C9E +:10D2800084490B4025D150800399171C00290BD0ED +:10D290000399480502D5381CFCF740FE039988061F +:10D2A00002D5381CFCF724FE2A2120693C00E88FB7 +:10D2B000000001F0C8FB00280DD08078E9698142A8 +:10D2C00009D0E861381CFCF716FE381CFCF707FE95 +:10D2D000381CFCF726FE0027201C20300490407AE2 +:10D2E000082871D10AF0D1FC0020686100233C00BD +:10D2F000249000002B61A86866490130A86030893D +:10D300005C31888201F07AFD62495C310861226AF1 +:10D3100004981821007A01F033FEE16A4018039066 +:10D320005C48006A00280DD0002F0BD1594801231A +:10D330003C00609000005C3001681B0700223068F0 +:10D3400009F049FF002800D105270021A06B0AF051 +:10D35000CEFC0021206C0AF0E8FC4F4B03CE039A70 +:10D360005C33FCF788FD00204C4E0521B06320693A +:10D3700001F03C009C9000006FFB011C01D1F060AB +:10D380001CE00120F0608878454A01321070C878AE +:10D390005070474A1070306900280AD04A780879DE +:10D3A000053109F0DDFA3169F7F785F9F0680028F1 +:10D3B00004D03B4A3C00D89000000132107800288D +:10D3C00008D10020A861716A002903D0201C143004 +:10D3D000F7F774F9344A5C321069316A411800E099 +:10D3E00020E00A23D0680A2209F0FBFE002807D0BB +:10D3F0002D4A316A5C323C0014910000D068401A1A +:10D400001169401A7060294A5C32D0683062F06954 +:10D41000002804D0FAF700FD0120FAF7A1FCFAF782 +:10D4200081FC2748006803F007F90698002803D11B +:10D430001E4E0023B36016E03C00509100001C4ECD +:10D440000120B060069801684068B06519487165B0 +:10D450005430C088002809D0B169002906D001F0F5 +:10D46000DCFC011CE06AB269F7F72FF9002F15D137 +:10D4700012480169002908D101213C008C9100006B +:10D4800001612A68002A03D000210020F7F720F963 +:10D4900009490023CB622B616B6106F0B5F807B038 +:10D4A000F0BD6B680648002BF9D0021D111C381C1A +:10D4B000F7F70FF9F3E70000447D01003C00C89145 +:10D4C0000000F4680100F467010003080000F86040 +:10D4D0000100C467010008B5F8F72FFD009000AB0C +:10D4E000188800280CD005F050FF00AB5988188828 +:10D4F00005F06DF9FEF797F80320FBF70EF83C00F6 +:10D500000492000008BD0120FFF7B2FB002008F0E4 +:10D510008DFEF7E7F8B54F498C68206A00680578FA +:10D52000FCF768FA002812D02A07920F0121012A7D +:10D5300000D00021002903D02906090F0B2906D1AC +:10D540003C00409200002A21095D08189030007BC1 +:10D55000F9F70DFC414F3C3FB86B796BF7F7C0F81A +:10D56000A06C0026C660606B800804D0B8690130EA +:10D57000B86106F0DCF9394D28698005800F08D1C3 +:10D5800078693C007C920000042101307861606B76 +:10D590004008400008436063B86A002803D0606B0D +:10D5A000082108436063201C203000903968F7F799 +:10D5B0009AF80320000228602B498868A063C86895 +:10D5C000E06308793C00B8920000C006C00E251C3C +:10D5D000403528714879687123483C384662009884 +:10D5E000807A01F05EFD00210028214A01D01178E7 +:10D5F00003E09378DB0700D55178A971002804D0A7 +:10D600001B49143108683C00F4920000206400E0DB +:10D610006E80B86AC00702D5FF202871AE71E6613E +:10D62000B8680130B8607968884203D00B21852042 +:10D63000F7F7C4FF0D498868C06C8860FB6A002B4F +:10D640000CD00E4AD47B002B3C003093000002DD4E +:10D650007F2C05D201E0002C02D0D47BE318D373D9 +:10D66000FE62C968884203D105218520F7F7A9FF2A +:10D67000F8BD247E010000400700A0800700E8807C +:10D68000070040000700FEB5304C3C006C930000E2 +:10D69000A06B216BF7F733F82D493C318E68708B06 +:10D6A000062804D2E0690130E0610E203085284967 +:10D6B0003C310D68002D03D103218520F7F784FF4D +:10D6C000244845613562318DEF6804393C00A893E8 +:10D6D00000000C0401210291240C002101911D483D +:10D6E0003C30808AA04203D32C81EE6000240BE002 +:10D6F000002F04D103218520F7F769FF04E03D1CCA +:10D70000201A0404FF68240C0298002804D03C006E +:10D71000E493000012490120086100200290019862 +:10D7200001300190002CDDD10C480C4C3C300760DE +:10D7300001983065B564306A0068606260680130E5 +:10D740006060A1680131884203D00A218520F7F783 +:10D750003C002094000041FF04480068A062FEBD28 +:10D760000000E87D010000300700786E0100B0B5D0 +:10D77000051C01210F200AF0F8F8F2210F200AF011 +:10D78000F4F80C480C4C0068143C00280CD0E078ED +:10D7900001283C005C94000009D00122291C0F20C4 +:10D7A0000AF0ACF86078022806D0012003E0607827 +:10D7B000022801D000206070B0BD00009866010012 +:10D7C0000222002880B500D1032203490E200AF06E +:10D7D0009BF800203C009894000080BD000050C3DE +:10D7E0000000F8B50023002200282ED00689046826 +:10D7F000751E2D04B61AF6072D0CF60FB4460EE072 +:10D80000A75CA618023300977778A7540232120457 +:10D81000009F120C00293C00D4940000777001DDB9 +:10D820008B4215DAAA42EED3C068002810D00289D4 +:10D83000002AF9D06246002A0BD00268665D17788C +:10D8400002336755167001220029D2DD8B42D0DBEE +:10D85000F8BD0022CDE700003C0010950000B0B5F7 +:10D86000041C0D1C0120F8F75EFB0D490028C8615F +:10D8700014D062684260A27C0272A268C260E26850 +:10D880000261228A02750A1D0A621268002AFFD10B +:10D89000026048600020A86001203C004C95000018 +:10D8A000B0BD0120FAE70000A46E0100B0B5041C71 +:10D8B00040680D1C431C02D1211C094808E00020CF +:10D8C000F8F734FB064994390861002803D0211C7D +:10D8D00000F048FE00E00120A86001203C0088958F +:10D8E0000000B0BD0000386F010080B50121972015 +:10D8F000F7F785FE002080BD000038B50A1C143201 +:10D900000092131F051C083A0C1C16314068FEF7E4 +:10D910006CFE002801D0002000E0012069683C0076 +:10D92000C4950000A0606160012038BD10B50C1CDA +:10D93000017A00290FD0012909D0022903D1002141 +:10D9400000200AF073FC00202071012010BD416806 +:10D9500001200AF06BFC00F00DF9F4E780B50449F2 +:10D960003C000096000048680138486001D107F08B +:10D970006EFB002080BDAC790100B0B5051C0C1C0D +:10D9800000F04FFEA060686860600120B0BDB0B5D7 +:10D99000051C0C1C00F06FFEA06068686060012030 +:10D9A000B0BD3C003C960000081C00210022002372 +:10D9B0000EC008C001207047F8B50F1C041C207968 +:10D9C000202801D2202020716679002E02D12579ED +:10D9D00000220DE02579291C301CF7F74FF80029AB +:10D9E00001D1321C3C007896000004E0704380199D +:10D9F00005062D0E321CE079291C00F0F2F9207A80 +:10DA00002F49C007C00F08602E480078C00743D5D3 +:10DA1000A1792C4AC80748D42C4E16608B072B4896 +:10DA200008D5CC0801233C00B4960000A340036055 +:10DA3000490704D52849116001E0402101601368BD +:10DA4000264AB34210D1546801680C4354601468EC +:10DA50000C4001D0516100E0916154680C43546066 +:10DA600094682143916013E03C00F0960000547CE0 +:10DA700001680C435474147C0C4003D0147C0C4398 +:10DA8000147402E0147C8C431474547C0C4354745E +:10DA9000947C21439174B34205D100220168032094 +:10DAA000FFF78DF809E0006800213C002C9700008A +:10DAB0000206120E0320FFF785F801E00B48106004 +:10DAC000002038717D71F7F7E9FD0120F8BD0000F5 +:10DAD000CC5C0100040007005C5B0100B99B000006 +:10DAE000585B0100959B0000100007003C00689700 +:10DAF0000000559B0000B0B50D1C04300024FEF75B +:10DB0000D6FA01206C60B0BD0000F0B5077A43681A +:10DB1000041C0E480E1C00680125011C9BB006E089 +:10DB20004A689A4202D18F76002502E009683C00DB +:10DB3000A49700000029F6D1002D05D1217A0129F2 +:10DB400002D101A9F8F7A8F86068043621C61BB015 +:10DB50000120F0BDA46E010010B50C1C08F0AEFC55 +:10DB60006060012010BD000010B50C1C07F084FAA5 +:10DB70003C00E097000004F054FF002060600120AA +:10DB800010BD0020C043486001207047000010B560 +:10DB90000C1C0079FAF707F8002801D0002000E0FB +:10DBA00002206060012010BD00001CB5064C2068FA +:10DBB00000283C001C98000007D009F0C5FA01902D +:10DBC000206841686846F6F7D6FD1CBDAC790100B7 +:10DBD0000149086070470000AC7901000EB5064BA2 +:10DBE0001B68002B06D00290009101926846D9680C +:10DBF000F6F7C1FD3C00589800000EBD0000AC795E +:10DC000001001CB5041C07F04CFA064841680131BC +:10DC10004160009400210191006801686846F6F7B0 +:10DC2000ADFD1CBD0000AC79010080B5F8F7A3F88C +:10DC300080BD80B5021C3C00949800008021032028 +:10DC400000F05CF8011C034800224369F6F79BFDD5 +:10DC500080BD0000A46D0100F8B50C1C1349051C23 +:10DC60000868161C0130086000202061221C103258 +:10DC7000281D0021071C00923C00D098000003F0F2 +:10DC8000DEFE20712069002810D00104090C00205C +:10DC9000F7F779FE3060291D03C9A060E1603068A4 +:10DCA0000168009A381C03F0CAFE20710120F8BDFB +:10DCB00000001075010080B5021C3C000C990000AA +:10DCC0000821042009F04EFF032080BD10B5074A4B +:10DCD0000C1C516801315160011C1031C2680430C4 +:10DCE00003F0F0FE2071002010BD0000107501004F +:10DCF000044980B581610821021C03203C00489939 +:10DD0000000009F032FF032080BD95D80000F7B570 +:10DD1000071C161C0621002082B0F7F73AFE051CEE +:10DD200020480078062800D928812C680020A77098 +:10DD30000399E170311C03E00A8910180F1C3C00A4 +:10DD400084990000C9680029F9D16B4601AA211DF8 +:10DD500000F034F800AB187860711878002817D0FC +:10DD600011484068002808D019780020F7F714FE01 +:10DD7000011C381CF7F730FD0AE03868002802D192 +:10DD80003C00C09900003F600120B86100AB1978E9 +:10DD900038894018388100AB9888311C02382080BF +:10DDA000281CF7F71CFD281C05B0F0BD0000C85C5E +:10DDB000010001794279008889180239401A7047B8 +:10DDC00000003C00FC99000070B5084D2C78AD783F +:10DDD0002018061C002D03D070190138013DA843FE +:10DDE0001080801B18700C7070BD0000C85C0100B2 +:10DDF000B0B504680C4A218852780231914211D2A0 +:10DE0000551AF7F73C00389A0000C9FD016800294F +:10DE100002D10060012181610189491901812088B5 +:10DE200040192080607940196071B0BD0000C85C65 +:10DE3000010080B500220621F12009F0A2FE80BD7C +:10DE40000000031C02483C00749A000003704170FB +:10DE500082707047C85C0100B0B5081C0968151CC9 +:10DE60008C78F7F785FD0449A0000958002902D0F5 +:10DE7000281CF6F79EFCB0BD846D0100FEB5041CA5 +:10DE8000C07AA17AC607F60F3C00B09A0000321C97 +:10DE9000201D01F03CF86069254FC10737D5B869EE +:10DEA000002801D0F6F787FC2068056828888007DD +:10DEB00034D101AA02A9281C01F00BFC281C01F096 +:10DEC00012FC0078C0070AD460693C00EC9A00009C +:10DED000800726D4331C291CA27A20697D69F6F7B5 +:10DEE00072FC1EE000AB187A002803D0012806D08F +:10DEF000022816D1281C796AF6F761FC11E000AB04 +:10DF000018790E2801D00F280BD1281C3C00289B23 +:10DF10000000396AF6F756FC06E00007800F03D1CF +:10DF20002069F969F6F74EFC786B2121013078639E +:10DF3000221C802009F031FEFEBD287A01000B4929 +:10DF400018B50878C00711D50A4A101C20303C00CB +:10DF5000649B0000847900AB1C70C079587008780D +:10DF600040231843087005480078087000AB1888F3 +:10DF7000D08418BD0400070000100700E060010015 +:10DF800070470000054910B58879054B1A7C054C8F +:10DF90003C00A09B0000246862401A74887110BD88 +:10DFA00000002010070010000700585B0100044922 +:10DFB0000A6804480068024001D0886170474861DF +:10DFC000704710000700585B0100021C012000068A +:10DFD00008433C00DC9B000080B52A2109F0E6FDE7 +:10DFE00080BD000010B5041C002903D0812907D191 +:10DFF000812000E08020221C2C2109F0D7FD10BDDB +:10E0000002212C20F7F74CFB201CF7F7C3FC10BDB6 +:10E0100080B5B4B03C00189C0000012806D08228CE +:10E020001CD11AA807F035FC34B080BD812913D16A +:10E030000D480C4A816900685032814202D0D16A91 +:10E04000012902D01178022902D107F00AF9EBE781 +:10E050006946F7F75AFE3C00549C0000E7E70121AF +:10E0600000E002211820F7F721FBE0E7A46E010091 +:10E07000B0B5041C0068174D9AB0686308F03EFA0A +:10E0800020791449134A50392C3A02280AD1906851 +:10E090008002A861C868E8613C00909C00000220F2 +:10E0A000287207F0E4F81AB0B0BD031C0020002B62 +:10E0B0000BD152689202AA610A1C8968E961287230 +:10E0C00010686946F7F727FEEDE7A861012028727E +:10E0D0002870002006F07DFAE5E73C00CC9C0000AB +:10E0E000F46E0100704700007047000080B5012108 +:10E0F0000720F7F7E1FA80BD70470000F8B500246B +:10E10000194A0026D56811680435081C916002E0A0 +:10E11000011C4019086053688342F9D83C00089DEF +:10E12000000001341032032C0E60EED3F6F7F1FF3D +:10E1300010481049124C0860104900200122192390 +:10E140005B010C2543431B1945434A511F1C6D18A5 +:10E15000AB606B6000251E1C14369E60331C3C00B7 +:10E16000449D00000135272DF8DB013003289F6016 +:10E17000E8DBF8BD2057010014C80100B4CF01004E +:10E1800018D90100B8CF0100B0B5074C251CC03527 +:10E19000286B1E2100F0F2F9A26B201CDC30296BE9 +:10E1A0003C00809D000000F0B6F9B0BD0000C469DD +:10E1B00001000020102210B50A4905E00C2343435A +:10E1C0005C180C34CC5001300F28F7D30C23584383 +:10E1D0000950044841600160028200218160C160F1 +:10E1E00010BD3C00BC9D000084E2010044E301003E +:10E1F00010B5084CA06A002803D10748F9F7E8FEDB +:10E20000A0620448443000680121F9F795FC60627F +:10E2100010BD0000606C0100CD260100FFB50D1C93 +:10E22000041C1E1C3C00F89D000081B00A9F1C21AC +:10E23000F6F74DFB0398A061256025612681A68233 +:10E24000E76005B0F0BD70B50D1CA421041C0830BA +:10E25000F6F73DFB201C44300622291CF6F765FB2F +:10E2600018483C23411C3C00349E00006162417808 +:10E2700059430918897A062901D1A06202E0211CBC +:10E280004D31A16241783C235943081804300F49AD +:10E2900020620B88002B15D0AC20005D0B4A183291 +:10E2A00000028018B030E0603C00709E00008D6875 +:10E2B000002008E0E268C1005450E668820052196C +:10E2C00071184A6001309842F4DB70BD000068614B +:10E2D0000100587501001FB5041C6034617A031CED +:10E2E000806A084A0291019003923C00AC9E0000B3 +:10E2F000E279181C20300092447B827B5E20C15A58 +:10E3000018690430231C02F07FFE1FBD394E000047 +:10E31000B0B50B1C01886920C05C86B00E4A049120 +:10E32000039005920D4D596A9A6A2D683C00E89E4B +:10E3300000000124002D00D0041C0A48005D01915A +:10E3400002920090181C2030447B827B5E20C15AD0 +:10E3500018690430231C02F0A4FE06B0B0BD514F72 +:10E360000000186701000A61010001898A1C3C0055 +:10E37000249F000002810268023A0260080A090232 +:10E38000084310807047000070B5051C08780E1C0B +:10E39000FF2814D0717802310020F7F745FB041CE8 +:10E3A00002890068311CF6F7CFFA002D06D0281C30 +:10E3B0003C00609F0000F7F734FB211CF7F757FA89 +:10E3C00000E0251C281C70BD0000FFB50F1C1E1CA2 +:10E3D000041C981C0104090C002081B0F7F727FBEE +:10E3E000051C0068002C386003990170386846707D +:10E3F00006D03C009C9F0000201CF7F715FB291C51 +:10E40000F7F738FA00E02C1C201C05B0F0BD000026 +:10E4100070B51048046804600F4920200860A0050A +:10E420000E4E02D5706AF6F705FAE00102D5306E9D +:10E43000F6F700FA3C00D89F00000A480440002587 +:10E4400007E0E00703D5A8003058F6F7F6F90135E4 +:10E450006408002CF5D170BD0000004007000010DA +:10E46000070030740100FFFDFFFE80B5072180200A +:10E47000F7F749F980BD3C0014A00000F8B5144B33 +:10E4800082009C58CA060127391CD20E9140114ABD +:10E490001160114E4000851915E06060207BC100BD +:10E4A000891910310A780D239A430A70391C81406A +:10E4B00031730749000108313C0050A000004018AA +:10E4C000084A416842608068F6F7BEF9287B002858 +:10E4D000E6D1F8BD0000A473010000100700006041 +:10E4E0000700D175000003490120097A002900D1F5 +:10E4F000002070470000047A01003C008CA000005E +:10E5000003490120897A002900D1002070470000CA +:10E51000147A0100B0B50024FAF776FC002814D074 +:10E52000012408F07DFE0A4D0A4B00215A18A03242 +:10E530001278102A06D38A00D218926F3C00C8A025 +:10E540000000821AAA4200D2002401310329F0D32C +:10E55000201CB0BD00008B080000A46C0100014825 +:10E56000C068704700007869010070B50D1C041C7C +:10E57000161CFDF72EFE0020E0602661A5603C0021 +:10E5800004A1000070BD0000F8B5171C0E1C041C8F +:10E59000002801D0002E01D1F7F7F2F8A06807F0AB +:10E5A00049F9051C01D1F7F7EBF8291C6E60AF6043 +:10E5B000201CFDF7FDFDE068411CE160002803D14F +:10E5C0003C0040A100000548216905F02CF92068B5 +:10E5D000A84202D1381CF6F748F9F8BD0000C46023 +:10E5E00001000022013910B505E00C2353431C182B +:10E5F0000C34C45001328A42F7D300210C235A4311 +:10E6000081503C007CA1000010BD0000B0B5041C8E +:10E6100001D1F7F7BBF8201CFDF7DAFD011C856876 +:10E62000A06807F009F9E0680138E06003D1064806 +:10E63000216905F0E7F82168002903D08868496856 +:10E64000F6F711F93C00B8A10000281CB0BDC46069 +:10E650000100012100288CB500D100210E2009F015 +:10E6600032FA832000AB1880002004F00CF80190EF +:10E67000684603F07AF98CBD000080B508F0DFFD34 +:10E6800006490A8906493C00F4A10000096E411AB6 +:10E690000B0C5918891A0904090C401A80BD000096 +:10E6A00000900700A46C010070B5041C887E0D1C4E +:10E6B000202803D903211820F7F740F800262676F2 +:10E6C000A87E291C1B3160763C0030A20000201C73 +:10E6D0001D30AA7EF6F75FF96868291C6060A8689B +:10E6E0001331A060A87B06222073E87B6073287C2E +:10E6F000A073687CE073A8892082A87CE0762677E6 +:10E70000201C1230A676F6F746F93C006CA20000F9 +:10E710006068431C1DD0114D6D61286800281AD017 +:10E72000227B011C0B7B9A4201D3206014E00B1C5E +:10E73000096800290BD00E7BB24208D20B68002B6F +:10E74000F0D01E7BB242EDD323600C603C00A8A247 +:10E75000000001E021601C60002070BD26602C607C +:10E76000FAE7A46E0100134AB0B5516801240029EC +:10E770001ED0131DD1611362436804E0106200686B +:10E78000D061002814D0D06945689D42F6D13C0084 +:10E79000E4A20000106A814204D15160D06900688F +:10E7A000086002E0D16909680160D069FCF7CEFF1A +:10E7B000002800D00024201CB0BD0000A46E010081 +:10E7C000B0B5174D01242968002927D06D61296152 +:10E7D0003C0020A30000436804E0686100682861F1 +:10E7E00000281DD0286942689A42F6D1AA692B698F +:10E7F0009A4200D1A9616A69914203D129600068F7 +:10E80000086006E0006810602868002801D107F061 +:10E81000CCFE3C005CA300002869FCF79DFF0028AB +:10E8200002D0002400E00124201CB0BDA46E010031 +:10E83000B0B5051C0748446807E0211C4431281C7A +:10E8400000F0D6FC002802D16468002CF5D1201C11 +:10E85000B0BD00003C0098A300005875010070B5E1 +:10E860000D1C141C00280B4E08D0706E0623584354 +:10E870000204120C311C281C228007E0218806208B +:10E88000F6F7A7F970662288291C301CF6F795F870 +:10E89000012070BD00003C00D4A3000010790100ED +:10E8A00080B5032803D8044AC000115080BD01215F +:10E8B0002620F6F75BFF80BD7C790100B0B5051C12 +:10E8C000C0680189392939D30468A079882835D1ED +:10E8D000E0798E2832D1207A3C0010A40000012873 +:10E8E0002FD1607A03282CD1207B022801D0FE286A +:10E8F00027D1607B1D210840012822D1A07BC8219F +:10E90000084008281DD1A81DFBF7E1F9002818D000 +:10E910001920215C002914D101303C004CA40000D6 +:10E920003928F9DB688B04210843688303F0D6FE9D +:10E93000002809D1002300222620044909F092F979 +:10E940000348006801F084F9B0BD000050C3000026 +:10E950000C790100B0B5084CA36801333C0088A4D1 +:10E960000000A3600C1C09D02568002D03D0237A79 +:10E970006168F5F7A3FF201CF7F7A9F9B0BD9479FA +:10E98000010070B5041CC06801890568082953D3CB +:10E990000622281C5549F5F79EFF002837D13C0078 +:10E9A000C4A40000E988524E043E812924D1E568C0 +:10E9B0002968087A4A7A000280180004000C420B89 +:10E9C0000005000DE27520834B8900204200B25AF9 +:10E9D0009A4206D128890C38020A00021043488165 +:10E9E0003C0000A5000002E001300228F1D3E068FD +:10E9F00001890A390181E06801680A311CE00022BE +:10EA000000204300F35A8B4201D1012202E0013081 +:10EA10000228F6D3002A11D107E036490622063132 +:10EA2000281C3C003CA50000F5F75EFF002808D13B +:10EA3000E068018906390181E068016806310160FA +:10EA400010E0E068FFF7E2FC0CE002310181E068D1 +:10EA5000016802390160E06800890238020A000298 +:10EA6000104308803C0078A50000E0680325028977 +:10EA70000168244E022A10D90988082905D0C1232B +:10EA8000DB00994203D1012502E0002500E00225C8 +:10EA9000E9007158002900D10225F7F704F8E900D0 +:10EAA0008919898888423C00B4A5000000D9032553 +:10EAB000A11D201CFDF734FC002800D10325022DE8 +:10EAC00005D0032D07D1E068F6F7E2FF70BD201CEA +:10EAD000FDF71CFD70BDE068018902390181E06825 +:10EAE000016802310160E8003C00F0A500003158E7 +:10EAF000201CF5F7F1FE0028EFD1E0680189023112 +:10EB00000181E068016802390160E3E700006A46BC +:10EB100001007C79010070B50E1C041C151CF7F770 +:10EB20008CFB00282AD01B4908683C002CA600005A +:10EB300001300860002E0AD0012E0BD0022E0FD11A +:10EB4000201C04F0CDF8201CFFF7D6FE0CE00821B5 +:10EB5000E06802E0C121E068C90004F035F903E093 +:10EB600002212620F6F720FEE27DE16A3C0068A63D +:10EB70000000281CFCF795FB206300202062A062A7 +:10EB8000201C00F06CFE70BDE068F6F78AFF002DD7 +:10EB9000F9D0E37D00220120E16AF5F7A7FE70BD00 +:10EBA00000009479010080B5012804D105483C009B +:10EBB000A4A60000006801F009F980BD0321262009 +:10EBC000F6F7F8FD80BD00000C790100F8B5061CD1 +:10EBD00080790024C0072DD5F0680068417A11299A +:10EBE00028D1C1880A0A09021143C90422D1017837 +:10EBF0003C00E0A60000114F0907890E0818418863 +:10EC00000A0A090211430D042D0C432D396801D164 +:10EC1000CA070ED4442D06D1C90704D5243000F00C +:10EC200022FB002805D00648854206D138688007B7 +:10EC300003D53C001CA700000124F068F6F73AFF5A +:10EC4000201CF8BD7C5A01006C07000080B500282C +:10EC500007D00021262008F07BFF0248006801F061 +:10EC6000BBF880BD0C79010010B5041C094A081CD2 +:10EC7000516801313C0058A7000051600021216219 +:10EC8000A162E27DE16AFCF718FB2063201CF7F724 +:10EC9000E6FA201C00F0EFFD10BD947901000CB5E0 +:10ECA000021C081C0021019100926A4601A900F093 +:10ECB00002F80CBD00003C0094A7000070B513687A +:10ECC000002B1ED000260B68002B02D113681B6896 +:10ECD0000B6013681C681B89E51808E05C781C1938 +:10ECE00002340C601C78844201D1181C70BD0B6882 +:10ECF000AB42F3D31368DB683C00D0A7000013607D +:10ED00000E601368002BE1D1002070BD000070B5CB +:10ED1000031C20D018681E89051C16E00478DD2C21 +:10ED200010D18478002C0DD1C478502C0AD10479EC +:10ED3000F22C07D144798C4204D13C000CA800008D +:10ED400002290CD18479944209D0447820180230E9 +:10ED5000441BB442E5DBDB68002BDED1002070BD34 +:10ED6000044980B50A780A20002A00D0486A00F0D9 +:10ED7000D1F880BD1C750100B0B5174C3C0048A807 +:10ED800000002068002829D0164DE869002825D108 +:10ED900001F03FFA002821D1FFF741FC00281DD1E6 +:10EDA0002068A969401808F0D6F9002816D002F0AA +:10EDB00006FD2168401808F0CEF900280ED03C006E +:10EDC00084A800000120E86100222521802008F0AD +:10EDD0008FFF0648296A04F083FD0121286A00F0AC +:10EDE00089FFB0BDE85901001C75010034630100C2 +:10EDF00070B5051C0024FAF70BFF184E716A401815 +:10EE00003C00C0A8000000F08EF800280BD104F0F0 +:10EE1000FEFB0021252008F0B0FE0322291C281C3F +:10EE200000F0AFF818E0706A441E00F07CF800288B +:10EE300012D10C48316A04F056FD0121306A00F00D +:10EE40005CFF3C00FCA800000020FAF70DFE06F075 +:10EE500003F8002300222520054908F03FFF201C6D +:10EE600007F0FCFA70BD00001C750100346301005E +:10EE70001027000080B5012807D080280DD100227E +:10EE8000002108483C0038A90000F8F79AFE80BD30 +:10EE9000012902D106490020C86104F0BEFB80BDF3 +:10EEA00005212520F6F7A7FC80BD61A900001C758F +:10EEB00001000021002880B501D1034841680122EA +:10EEC000252008F02CFE3C0074A9000080BD000045 +:10EED000E85901000249C8680138486270470000DB +:10EEE0001C75010038B5031C081C191C114B06D0F9 +:10EEF000012111800A1C191CF5F7AAFD17E00D4D20 +:10EF0000011C2C781288181C3C00B0A90000F5F7F1 +:10EF1000A2FD287884420DD000236B61002803D025 +:10EF2000002007F0A4FA05E0002200210020009252 +:10EF3000F8F723FC012038BD00001C75010070B5F6 +:10EF4000041C012608F0E1F9051C3C00ECA90000B6 +:10EF50000020FAF78BFD444302F040FC02F03EFC37 +:10EF6000011C231C0022281C08F07CFA002813D165 +:10EF70000A48231C00228169281C08F073FA002823 +:10EF80000AD1F8F719FC011C231C00223C0028AA16 +:10EF90000000281C08F069FA002800D10026301C67 +:10EFA00070BD1C75010070B50D1C041C161C07F00B +:10EFB00076F900280DD0FAF752FE002809D0FF306C +:10EFC00001304368002B04D0221C291C301C3C005B +:10EFD00064AA0000F5F7BBFC70BD000080B50121FC +:10EFE0001D2008F0DFFD074A0748116901605169DB +:10EFF00041600649496881600021C16003F074FCEA +:10F0000080BD00002861010048750100905C01008E +:10F010003C00A0AA000070B5041C406B002835D04D +:10F020001D4D00262878002824D04120005D0028AE +:10F0300003D108F076F9A8611BE0696901316961C3 +:10F04000A868002808D0814206D12069011C10312F +:10F0500004303C00DCAA00008222FFF7ADFF6868A4 +:10F0600000280AD06969814207D12069011C10314A +:10F0700004300222FFF7A0FF6E6168780521084086 +:10F0800008D0074800780E2803D36034E079FBF7F6 +:10F09000CFFF70BD3C0018AB00000348066070BD98 +:10F0A00000001C75010010670100D47E0100800281 +:10F0B0007047142330B5094D4B435B195B68082436 +:10F0C000002B00D1022438235A43054B8900D21863 +:10F0D000515A026809193C0054AB0000511A0160F2 +:10F0E00030BD0000744001008C410100F8B5071CE0 +:10F0F0002C48141C2C4A484386468018800D8446B0 +:10F100002B482A4A06261D1C48434A430E2F40D24C +:10F1100001A3DB5D5B009F443C0090AB0000060850 +:10F120000A0F14181D202724272B2F31C8001FE099 +:10F1300088001DE0214970464018000D18E01F4A64 +:10F140008018800D401821E01E481018000D1DE0A9 +:10F150001D4970464018400D0AE03C00CCAB000051 +:10F160001B49401801E01B481018400D11E01A49D6 +:10F17000401805E060462080002016E0174810186F +:10F18000800D06E0164902E016484843164940182B +:10F19000C00D03308008800020802E803C0008AC29 +:10F1A0000000F8BDFF21FF20F6F749FB002020807A +:10F1B0002880F6E70000D1451700FFFF3F00E33845 +:10F1C0000E0055551500FFFF0F00A9AA2A01701C5B +:10F1D0003700FFFF1F00CBCC4C00701C47003C00E9 +:10F1E00044AC0000A9AA7A00701C6700A9AABA0062 +:10F1F00084F61200EC25B4000449002801D009224D +:10F2000000E014224A80486070470000A4690100B1 +:10F2100080B50622F5F740FC80BD0000BCB5151C8A +:10F220003C0080AC0000041C04310904090C01AA54 +:10F230006B46FFF76AFF3820064968434018A10073 +:10F24000405A00AB99884018198840180004000CF7 +:10F25000BCBD8C410100BCB5041C151C01AA6B4649 +:10F26000FFF73C00BCAC000053FF38200549684361 +:10F270004018A100405A00AB998840180004000CC7 +:10F28000BCBD00008C41010080B500280FD00029D2 +:10F290000DD002780B789A4209D1FF2A05D0427826 +:10F2A0000232F5F73C00F8AC000081FB002801D1E8 +:10F2B000012080BD002080BD000080B506220449E9 +:10F2C000F5F775FB002801D1012080BD002080BD2D +:10F2D00000005E400100011C49780120002900D097 +:10F2E0000020704700003C0034AD000080B50622CD +:10F2F000F5F760FB002801D1012080BD002080BD12 +:10F3000080B5FFF7C7FF80BD80B506220449F5F739 +:10F3100051FB002801D1012080BD002080BD0000EC +:10F3200012610100011C80203C0070AD000081438F +:10F330008A080E201C2A10B506D2034C5200A35C8A +:10F340008B4201D11019407810BDFC4101001423FB +:10F350000249584340184068704774400100202219 +:10F36000011C80B50248F5F752FD3C00ACAD000031 +:10F3700080BD0000486101000806000E022801D18E +:10F38000002070470120704700290CD00749096808 +:10F39000002908D01423064958434018C0680028A3 +:10F3A00001D0012070470020704700003C00E8AD0C +:10F3B0000000AC6901007440010010B5041C062275 +:10F3C000011C0448F5F77DFB0622211C0348F5F7D4 +:10F3D00078FB10BD00001261010040800700002989 +:10F3E00001D10020704738235A43074BD2183C0004 +:10F3F00024AE00008300D25A14235843054BC01892 +:10F4000040881018081A0A380004000C70470000E1 +:10F410008C41010074400100F8B5071C081C161C43 +:10F420001C1C191C00F05AF8051C1435221C311C38 +:10F430003C0060AE0000381CFFF70BFF28180004EA +:10F44000000CF8BD000000B500F04BF80A300004D5 +:10F45000000C00BD0000F8B5071C081C161C1C1C85 +:10F46000191C00F03EF845001E35221C311C381CCA +:10F47000FFF73C009CAE0000EFFE28180004000CD3 +:10F48000F8BD0000FFB50F1C81B00AA9141C1E1C9A +:10F4900003C900F029F8051C1E35211C301C00F0A2 +:10F4A00023F82D18221C391C0198FFF7D5FE2818C7 +:10F4B0000004000C3C00D8AE000005B0F0BD0A49C5 +:10F4C00080B50988092904D0142907D101018000D9 +:10F4D00000E0C10008180004000C80BDFF21FF20DF +:10F4E000F6F7D1F9002080BD0000A669010038239D +:10F4F0005943064A14233C0014AF000089188200C7 +:10F50000895A054A58438018408808180004000C9E +:10F51000704700008C41010074400100024803491B +:10F5200000684000085A7047A86901005440010073 +:10F530000A20704710B5041C3C0050AF0000FDF7D6 +:10F5400062FF201C10BDB0B5041CC0680568A01D7A +:10F55000FFF7F5FE002818D0211C1431201C08F0FC +:10F56000E2FD002811D0298809482022818269887B +:10F570000183A98806354183C5613C008CAF00003A +:10F580003021095D1154616B41620120F7F728F8C1 +:10F59000201CB0BD707C010070B5041CC068211C2B +:10F5A00014310568201C08F0C1FD002808D0054E64 +:10F5B000F06802F0CFFD2888F08203203C00C8AF3D +:10F5C0000000F7F710F8201C70BD707C01003EB5FC +:10F5D000041CC0680568A01DFFF7B7FE002821D0F5 +:10F5E000211C1431201C02AA08F077FD002819D034 +:10F5F00002984B21095C002910D0012914D03C004D +:10F6000004B0000002290CD129880D2000AB18801D +:10F61000201C03F051F80190684602F05DFAF6F7FD +:10F62000B5F80021029806F09FFE201C3EBD07F0B1 +:10F6300029F8029800218069C207D20F0420F6F74A +:10F640003C0040B000007FFFEEE710B5041CFDF762 +:10F65000E6FE201C10BD3EB5051C00F040FE002853 +:10F6600015D1281C1430FAF7CEFB00280FD0052145 +:10F670002869FFF786FB041C09D00522211C684677 +:10F68000F5F73C007CB000003DFA05340294684672 +:10F6900003F01AFB2A1C0D218F2008F08FFB00209D +:10F6A0003EBD000010B5041CFAF798F8201C05F0C8 +:10F6B000E5F8201C10BD0000B0B5041C0069002155 +:10F6C00094B0FFF73C00B8B0000061FB6946FBF75F +:10F6D00026F800281ED00098FAF729FA011C01A884 +:10F6E00002F0D7F90098FAF7D2F90490052009AD95 +:10F6F000687202A8211C06220230F5F706FA0120E2 +:10F700000890216A0A903C00F4B00000282009917A +:10F71000005D287201A800F069F8201C14B0B0BD8B +:10F72000FFB5161C1F1C81B00A9D4C20F6F790FBFC +:10F73000041C143006220299F5F7EAF9201C06226F +:10F740000199F5F7E5F928203C0030B100000021CF +:10F750000655E1602762002D01D08E2000E08D204B +:10F76000221C0D2108F033FB05B0F0BD0000B0B540 +:10F77000051C4C20F6F76FFB041C4C22291CF5F7E6 +:10F7800026FA2920405D0D282CD23C006CB10000E7 +:10F7900001A31B5C5B009F44281A281E060A282828 +:10F7A0000E2822121600221C0D218C201AE0221C89 +:10F7B0000D21832016E0221C0D21842012E0221C42 +:10F7C0000D2185200EE0221C0D2186203C00A8B1D1 +:10F7D00000000AE0221C0D21872006E0221C0D21DA +:10F7E000892002E0221C0D218B2008F0F6FAB0BD22 +:10F7F000E868F6F7E6F9201CF6F711FBB0BDFEB598 +:10F80000051C9020F6F72DFB041C9021F5F73C0019 +:10F81000E4B100005BF9374E0127F069042803D9F1 +:10F82000706B013070634DE03348B16B04F0D0F879 +:10F8300001202062A87E211C803102910870221CC8 +:10F840006032019200202F1C20379072787A2B1C96 +:10F850003C0020B200001433D072E868AA1DA060FA +:10F86000E86B48604420405D0872291C201C05F0AC +:10F87000AAFC686A00280AD1019A201C937A02998E +:10F88000221C703258300978FAF7DBF906E03A7A30 +:10F89000231C3C005CB20000E869296A7033FDF764 +:10F8A0008DF93020405D184907280BD15820005DA4 +:10F8B000C007C0170130E06100202061201CF7F76D +:10F8C0003FFF18E00122201C05F0ACFF071C12D0FE +:10F8D00003F006FF3C0098B20000F36D002B06D049 +:10F8E00060682030827B616B381CF5F799F8E86816 +:10F8F000F6F773F9201CF6F79EFAFEBDF0690130A9 +:10F90000F061FAE70000C4690100346301000531C9 +:10F91000000070B5061C3C00D4B200000D1C0904A8 +:10F92000090C0020F6F77CF9041C2A1C311C006825 +:10F93000F5F706F9201C70BD4088704703781B0757 +:10F940009B0F0B70007800091070704704307047EF +:10F9500004307047D42101703C0010B30000002136 +:10F96000417070470000C421017000214170704750 +:10F970000000B4210170002141707047000001496E +:10F98000486570470000C469010001490865704777 +:10F990000000C4690100014988653C004CB30000C7 +:10F9A00070470000C4690100F8B55F4F051CB868D6 +:10F9B0000130B86007F024FD38619020F6F766FA50 +:10F9C000041C9021F5F794F8286B271C6063688B62 +:10F9D0008037261CC007C00F2062688B3C0088B3AC +:10F9E0000000603602214007C00F2063688B80074B +:10F9F000C00FF860287F3870B172002808D1F9F77D +:10FA0000C8FF002802D00120606201E00120A0624E +:10FA1000F868002803D00021022006F0CCFF3C004B +:10FA2000C4B300002B1C1033AA1D291C201C05F098 +:10FA3000DFFBA86A00280CD13978022907D0221CE4 +:10FA40007032201C5830B37AFAF710F908E001261A +:10FA50005EE0AA7D231C286A696A7033FDF7C0F84E +:10FA60003C0000B40000E96800200989002900D1A9 +:10FA70000420F0723878012814D10027009000206B +:10FA800006E02969012903D1A969012789071AD547 +:10FA900006F079FC0028F4D1012F14D10098012838 +:10FAA00011D13C003CB4000008E0201C583006F0A6 +:10FAB000E1FC00280AD08069800707D5F07A082188 +:10FAC0000843F0720120E062E87D3073E868A060CE +:10FAD000E06A002812D01A4FF86B00280ED0307B55 +:10FAE000F5F7DEFE3C0078B40000002809D0211CA8 +:10FAF000381C4030FCF755FC1448B96B03F089FF03 +:10FB0000F8BD104F1248B96B03F083FF0022201C90 +:10FB1000104905F0A2FE061C03D1386A0130386294 +:10FB2000EEE7201CF6F73C00B4B400009FF9E8684B +:10FB3000F6F76EF803F0F2FD0448836D002BE2D077 +:10FB40000022301C296BF4F786FFDCE7C469010052 +:10FB5000C4600100346301001130000010B50A20B8 +:10FB600007F0FEFC07F05EFC3C00F0B400000B491F +:10FB700044180CE0201C07F090FB002807D0F7F792 +:10FB800034F9002803D012218620F5F7CAFEF7F7D2 +:10FB90002CF90028EED101F080FD10BD0000409C42 +:10FBA000000010B50C1C011C174A3C002CB50000CD +:10FBB0000129506904D080291DD0812921D11CE060 +:10FBC0009178012915D102219170141C011C104853 +:10FBD00003F028FF0121606900F02EF9606901F04F +:10FBE0005FFC2070A088A16900230A4A3C0068B528 +:10FBF000000007F07EFC10BD222106E001F01DFC94 +:10FC0000201C00F04AF810BD1C212020F5F78FFEC3 +:10FC100010BDB4790100346301003D2E000070B5C1 +:10FC20001C4CA078002832D0052830D060693C00F8 +:10FC3000A4B5000000F0EAF8184EB579A0780128C4 +:10FC40000BD002280ED0032810D0042817D1421F51 +:10FC50008021202008F008F80EE00021202008F084 +:10FC600031F80CE0A08807F01DFC05E0207800F0DA +:10FC70003C00E0B5000039FA002000F0C4FD6069E6 +:10FC800001F0E1FB0520A070B571606900F061F939 +:10FC900000222021812008F0D6F870BD0000B47940 +:10FCA000010020100700B0B50D4D041CA8780028F5 +:10FCB00014D03C001CB60000686900F00BF90A483B +:10FCC000696903F0A7FEA88807F09EFB002C02D00C +:10FCD000687800F079FF0020A870A968201CF4F76C +:10FCE000CAFEB0BDB479010034630100064B80B593 +:10FCF000997803293C0058B6000006D10421997078 +:10FD00002021021C802008F0A4F880BD0000B479F6 +:10FD1000010010B50C4CA17803290FD11030FAF76F +:10FD2000DEF8002809D0207800F0E5F9002000F086 +:10FD300070FD002105483C0094B60000FCF79CFAD9 +:10FD400010BD1B212020F5F701FE10BDB479010084 +:10FD500051B60000094980B58978032909D100F01E +:10FD6000CDF9002000F058FD01210548FCF784FA88 +:10FD700080BD17212020F5F73C00D0B60000E9FD3A +:10FD800080BDB479010051B6000070B5104C1D1C47 +:10FD9000A378061C0498002B18D10123A3702261BC +:10FDA000E6606170A060A561002007F0ACFAA08059 +:10FDB000301CF7F73CFBE08007F03C000CB700007C +:10FDC0004FFBC721C900281A411A0022202007F042 +:10FDD00057FF70BDB4790100B0B5041C0D1C00F0D4 +:10FDE00009F8201C00F024F8002D01D0FFF7D4FE04 +:10FDF000B0BD0000B0B50C4C051CA0683C0048B775 +:10FE0000000000280FD10A48017E022211406160E3 +:10FE1000017E11430176072003F049FC206003F0C6 +:10FE200098FF03F0EEFFA0682843A060B0BD407CBF +:10FE300001000C8007000A4938B50A1C20323C003A +:10FE400084B70000947900AB1C70D279074C5A70CB +:10FE5000E268002A02D1064D01236B701043E06076 +:10FE600000AB1888C88438BD00100700407C010032 +:10FE700000500700B0B5051C002901D000F028F89B +:10FE80003C00C0B70000064C60782169084303D1EC +:10FE900001210E2006F0C5FD206928432061B0BD78 +:10FEA000000018630100B0B50A4C051C226900204F +:10FEB000002A0CD1002900D004E06078002802D18B +:10FEC00004F03C00FCB7000069FB6070281C06F0E1 +:10FED000EFFC0120B0BD00001863010010B5084C14 +:10FEE000607800280AD006F0E3FC002060702069EA +:10FEF000002803D001210E2006F096FD10BD000061 +:10FF0000186301003C0038B80000094980B50B694E +:10FF1000834204D14A78002A01D1012200E0002264 +:10FF200083430B61002A03D000210E2006F07FFDE1 +:10FF300080BD1863010080B50120F6F756FE80BD34 +:10FF4000000010B5041C3C0074B8000000F004F878 +:10FF5000201C00F01FF810BDB0B50C4D041CA868A3 +:10FF6000A0420FD10720296808F08CFB68680222A4 +:10FF700007490028087E01D0104300E0904308762E +:10FF800004F0C4F8A868A0433C00B0B80000A86022 +:10FF9000B0BD407C01000C8007000A4938B50A1C3E +:10FFA0002032947900AB1C70D279074C5A70E26809 +:10FFB000824202D1064D00236B708243E26000ABA7 +:10FFC0001888C88438BD001007003C00ECB8000059 +:10FFD000407C010000500700B0B5051C0A4C002110 +:10FFE0006069FFF711FF042001F046F901F088FB7A +:10FFF00000220421042001F08BF8281C01F04AFAA9 +:02000004800179 +:100000006069FFF7A7FFB0BD407C01003C0028B944 +:10001000000080B501F077FA80BDB0B50D4D01212B +:100020002869FFF7F4FEFFF72AFE00F02CFB00F032 +:1000300084FA002400220421201C01F06CF8013411 +:100040002406240E042CF5D32869FFF786FF3C0014 +:1000500064B90000B0BD0000407C0100F8B5051C8B +:100060000E1C074C171C01212069FFF7D3FE3A1C18 +:10007000311C281C01F052F82069FFF771FFF8BD10 +:10008000407C0100FFB589B0061C16981D1C002895 +:100090003C00A0B9000001D02948149028680088CD +:1000A0000006800E202801D0142817D10AAA18248F +:1000B000182105CAFFF777F9071C281C0189A142FE +:1000C00002DD006801190BE0C068641A0028F5D150 +:1000D0000F213C00DCB900008620F5F761FC00210F +:1000E00001E00021002718480890807907900C2033 +:1000F000164A704380180479049112991598149A3D +:1001000001910390059700950AAB0292211C301CC7 +:100110000CCBF7F73C0018BA000003F90125B540F5 +:100120000C4E083E3078284006D0201C00F0C9FD57 +:100130003078A843307003E0201C139900F043FF8F +:1001400007A903C988710DB0F0BD952400002010E7 +:100150000700747A01003C0054BA0000B0B5041CDA +:100160000C230949584340180079051C00F092FE01 +:10017000281CF7F7C7F80120034AA040083A117875 +:1001800081431170B0BD0000747A010010B5054CB8 +:100190002078002803D11A213C0090BA0000862064 +:1001A000F5F707FC207810BD000018630100014836 +:1001B0004078704700002C63010080B5F6F7D1FE4F +:1001C00000F01BF980BDFEB50168051C0C680E1C13 +:1001D0002178880771D16869C2073C00CCBA000059 +:1001E0006ED580076DD5E87AC20708070909029124 +:1001F0004549800FD20F00284F6805D0012809D04B +:10020000022821D003285BD1FF23201CA97AF4F710 +:1002100074FC55E002980B280AD00C283C0008BB5F +:1002200000000FD00D284ED1394FF868F4F761FC6B +:100230000020C0435AE0354FA97ABB68201CF4F770 +:100240005BFC40E0324F3869F4F753FC3BE000219F +:10025000019102990020FF23090701D401203C00ED +:1002600044BB000013E03189192901D3267E07E041 +:10027000152904D31826711A49190E7B00E00026AF +:10028000B10602D4012073075B0F01210191002800 +:1002900003D0A97A201CF4F736FC0199012915D165 +:1002A0003C0080BB0000F006C60F20881B4FE48A8C +:1002B000F96B0005C00F00291AD04B1C18D0002E76 +:1002C0000AD0002808D03888844213D002980C281D +:1002D00001E01DE012E00DD0081C01F076F90028C5 +:1002E00003D13C00BCBB000000F0A6FAF4F70AFC06 +:1002F0000020C043F863002E0DD03C800020F8633E +:1003000009E020880006800E202804D1044F201C1C +:10031000B96AF4F7F8FB291C0248FBF7EFFFFEBDB2 +:10032000287A01003C00F8BB0000A59A00000348B1 +:1003300080B50078002100F0FCFB80BD0000186350 +:100340000100044B054900281A6800D0011C101C4C +:10035000196070470000D4790100957500000548C8 +:1003600080B5007F24233C0034BC0000044958437E +:100370004018C069F4F7CCFB80BD0000D4790100BF +:1003800094460100021C064880B581628260007FAD +:1003900024230449584340188069F4F7B9FB80BD11 +:1003A000D4790100944601003C0070BC000080B587 +:1003B000002000F03CFB002000F06DFA00F065FA30 +:1003C0000449C86A0130C862081F008807F0C1F8F4 +:1003D00080BDD4790100064880B500210177C16A4B +:1003E0000131C1620438008807F03C00ACBC000059 +:1003F000B3F803F0D1F980BDD479010080B505F0E0 +:10040000E9FA80BD80B5002803D1012004F022FA6A +:1004100080BD012003F0E6FB80BD00000349012000 +:100420004978002900D00020704700003C00E8BC5B +:1004300000002C63010070B5134D2878002820D1EE +:1004400001212E1C7068FFF712FD0021072006F025 +:100450002AFB0D480024047104F0EDF806F0D5F9EC +:10046000012028700A4804604460F6F74CFD3C0007 +:1004700024BD0000F7F75EF8FFF7A2FF00F0A8FD2B +:100480000548716803F020FB012070BD2C6301005A +:100490005000070080000700C4600100B0B51E4C8A +:1004A0002078012835D1251C69681C4803F020FB01 +:1004B0003C0060BD000004F0F0F81A4801684908EB +:1004C00049000160016801221143016000F02BFE28 +:1004D00000F01BFC06F099F8F6F729FEF6F72DFC64 +:1004E00000202070FFF783FF00F08BFD0F4881781C +:1004F00008223C009CBD000091438170817811432B +:1005000081700C49102008716868FFF75FFDF7F7EC +:1005100039F8F6F74DFD0121072006F0CDFA01204C +:10052000B0BD00002C630100C4600100F0000700B2 +:10053000000007003C00D8BD000050000700034940 +:100540000120897A012900D0002070470000147A28 +:100550000100B0B5154D041C287A002820D1F9F708 +:1005600000FC02281CD101202872E868002810D065 +:100570002068296808603C0014BE000069680D48C6 +:1005800003F0C2FA01216868FFF7C8FC00222420AA +:10059000616807F0CFFBB0BD002028722168012000 +:1005A000F4F7CFFAB0BD00202168F4F7CAFAB0BD65 +:1005B000047A0100346301003C0050BE000004488E +:1005C00080B5007A012802D1002002F0F0FE80BD43 +:1005D0000000047A010080B5012807D0802809D1E5 +:1005E0000748007A002804D0012000E0002002F033 +:1005F000DEFE80BD0E212420F5F73C008CBE0000FD +:100600000BFA80BD047A0100F8B53A4E051CB07AA9 +:10061000002869D1F9F7AEFB022865D13648006899 +:10062000002861D03548716803F074FA01217068C0 +:10063000FFF77AFC6C20F5F7B9FC041C3C00C8BE3F +:1006400000006C21F4F7E7FA30682C220460296876 +:1006500081606968C160002111548162A968002924 +:1006600002D0E968016105E006F05DFF69684018A5 +:10067000316808617068FFF714FD692108553C0076 +:1006800004BF00000020F9F709FB01273B1C061CF2 +:10069000221C24320021F9F779FB1C480321008831 +:1006A00089030843211C40310091488318481021D8 +:1006B00060601848A060A76367630020F5F74CFBF3 +:1006C0003C0040BF0000E06002890099CA830768CF +:1006D000311C381D2761FEF78EFE381C0A300F4989 +:1006E000FEF789FEA4203880002004F0DEFB002203 +:1006F0001F20696807F02DFBF8BDFFE7002029687F +:10070000F4F73C007CBF00002EFAF8E7147A0100F1 +:10071000805A010034630100FA60010099EC000086 +:1007200015ED000012610100064880B5817A0029AC +:1007300007D0006804222030017B1143017302F0CE +:100740006BFD80BD3C00B8BF0000147A010010B5FD +:10075000044CA07A012803D106F0F1FE21688861DB +:1007600010BD147A0100031C081C1F4970B50A68EB +:10077000012B1CD0802B05D0832B30D1887A002808 +:1007800014D029E053693C00F4BF0000002B0ED0C8 +:100790009469D5692E1B0C695D1B361BB610A41914 +:1007A0000C61CC682D1BAD106419CC60936102F014 +:1007B00081FD70BD022812D1906A0C1C0028F8D06F +:1007C00007F00EFAA07A01283C0030C00000F3D1F7 +:1007D0002068816A0029EFD12030017B0822114373 +:1007E000017370BD02F021FD70BD0E211F20F5F7D1 +:1007F00028F970BD0000147A010002490C3103C9C8 +:10080000401870470000147A01003C006CC00000E2 +:10081000054880B5006804222030017B1143017334 +:1008200007F0E4F980BD0000147A010070B5164CA1 +:100830000E1CA17A00291CD02168086107F032FA49 +:10084000002817D020680025056200223C00A8C0BF +:10085000000083211F2007F094FA6068FFF703FC73 +:10086000216804222031087B2B1C90430873311C23 +:1008700000221F2007F061FB70BD20680822203095 +:10088000017B1143017302F0D6FC70BD00003C00F7 +:10089000E4C00000147A010080B500F077FC00F09D +:1008A0006FFC00F029FF00F05DFA00F0C5F800F0E1 +:1008B00085FF80BD80B5FAF785FA80BD0148C06824 +:1008C00070470000287A01000349002800D0011C6D +:1008D0003C0020C100000248C160704700008175E3 +:1008E0000000287A010001480249C86070478175FC +:1008F0000000287A01000149886170470000287AC9 +:1009000001000149002088617047287A01000349ED +:1009100000283C005CC1000000D0011C0248C161FD +:100920007047000089750000287A010003490028FB +:1009300000D0011C02488162704700008D750000E4 +:10094000287A01000349002800D0011C02480162F6 +:10095000704700003C0098C1000091750000287AA3 +:1009600001000349002800D0011C024801617047C2 +:10097000000099750000287A0100014802490861C9 +:10098000704781750000287A0100021C081C802A2B +:1009900080B502D100F03C00D4C1000007F880BD52 +:1009A0001E212120F5F762F880BD0000B0B5104D82 +:1009B000041CA86B0130A863696B091A281C006B22 +:1009C0000C2903D90021FFF791FA03E0082901D18E +:1009D000FFF732FB201C00F03C0010C200004DF974 +:1009E0006069400701D503F00CFC201CE96AF4F7AC +:1009F000DBF8B0BD0000287A01000349002800D0D0 +:100A0000011C0248416270470000B5750000287A59 +:100A1000010003490120096C00293C004CC2000080 +:100A200000D1002070470000287A010010B5074C63 +:100A3000E16B002901D1E06304E0814202D0002093 +:100A4000C043F8E706F09CFD206410BD287A010041 +:100A50000148006C70470000287A01003C0088C201 +:100A60000000054980B5002048638863FF210931F3 +:100A700015221020F6F7FBF980BD287A0100034902 +:100A8000002800D0011C0248816070470000C17539 +:100A90000000287A01000349002800D0011C3C0016 +:100AA000C4C200000248C16270470000C575000062 +:100AB000287A0100044B054900285A6800D0011C1F +:100AC000101C596070470000287A0100C9750000A9 +:100AD0000349002800D0011C024841617047000012 +:100AE0003C0000C30000CD750000287A01000F4BC8 +:100AF00010B5D968002919D00E4C0021CA0012196E +:100B0000403AD26B824202DA01310329F6D3481C03 +:100B10001A780006000E904208D018700806000EE1 +:100B2000041C3C003CC30000F6F7BAFA201C03F09A +:100B30001BFD10BD186301003C42010010B5144CB0 +:100B4000E168002922D02178124BCA00D218403A1D +:100B5000D36B834202DA481C20700BE0926B824216 +:100B600014DDFF313C0078C300000806000E207041 +:100B700003D119218620F4F78EFF2078FF3000067C +:100B8000000EF6F790FA2078FF300006000E03F012 +:100B9000EEFC10BD0000186301003C420100094852 +:100BA0000021018141813C00B4C300008181C181E9 +:100BB000074A02800123DB0243808280C2804176A3 +:100BC00031218176012101767047000030800700D5 +:100BD000FFFF000080B50120F6F7F8F80120F6F7D6 +:100BE000DBFC0120F6F75AFA3C00F0C300000120BC +:100BF00000F0F1FD0120F7F7C6FB80BD000010B545 +:100C0000114C002907D1002802D10120E06006E044 +:100C10000021E16003E0012907D1002801D0207004 +:100C200003E018218620F4F73CFF3C002CC40000B0 +:100C30002078FF300006000EF6F73EFA2078FF30ED +:100C40000006000E03F09CFC10BD000018630100BC +:100C5000054980B50968884205D0FEF7FFFB00F022 +:100C600087FAFFF72BFC80BDA86901003C0068C42F +:100C7000000001494870704700002C6301000149E1 +:100C8000C860704700004C7B0100034901200978CF +:100C9000002900D00020704700002C630100044AA6 +:100CA000002802D0906901309061D06940183C0062 +:100CB000A4C40000D0617047905C0100FEB5041C24 +:100CC00000680568281CFEF727FF071C6069154EA1 +:100CD000C007C00F21D001AA02A9281CFEF712FFED +:100CE0003878C0070CD46069800708D500AB187A43 +:100CF0003C00E0C40000002801D0022802D1706A44 +:100D000001307062FEBD00AB187A002801D00228C5 +:100D1000F8D1706A01307062B06A0130B062F1E7F8 +:100D2000F06A0130F062EDE70000905C01000249DA +:100D300048693C001CC50000013048617047000054 +:100D4000905C01007047000070470000011C4031BA +:100D500010B50A8B1207920F012A33D04A781A492C +:100D6000041C6034002A0B6A22D1E279012A02D9DC +:100D7000CC6801343C0058C50000CC60022A02D97E +:100D80000C6901340C610C6801340C60446B002C5C +:100D900003D00469247CE40702D54C6801344C601C +:100DA000806B002802D0086B01300863002A0CD049 +:100DB0009818013808E03C0094C50000012A01D0D1 +:100DC000022A02D1886801308860E0791818086228 +:100DD00010BD0000905C01007047000001490A202E +:100DE00008817047C47A0100F0B5324F041C78784E +:100DF00085B0C007C00F03903C00D0C50000B87894 +:100E000002900120A0400490391C88702C48008872 +:100E100006F00BFC0190FEF7AEFC0430294EA50055 +:100E200071590979884206D0FEF7A5FC7159043042 +:100E3000087101207870002078703C000CC600001A +:100E400021480121204E3038015571590320087086 +:100E500006F0C6FB061CFEF791FC36180E3609E0BC +:100E6000301C06F0F5FA002804D023218620F4F780 +:100E700033FE03E0F6F734FB0028F1D03C0048C60F +:100E80000000124813493C3800780872201CF4F71F +:100E9000A2FA0E4E715908710398002801D0012161 +:100EA000797009480088019906F0BDFB0298B87076 +:100EB000094949790498884203D0242186203C00BE +:100EC00084C60000F4F70EFE05B0F0BD0050070028 +:100ED000D0790100107B010080800700508007005E +:100EE000B0B50D1C041C052801D3F4F729FE052D0F +:100EF00001D3F4F725FE0B4AA8001158A0001058A2 +:100F00003C00C0C600000EC90EC0062106220648DD +:100F100069432A380918624310180622F3F70FFFB5 +:100F200002483038415D0155B0BD107B0100B0B5BD +:100F3000041C0E480D1C80780121A140084003D0FC +:100F400001213C00FCC600008620F4F7D1FD0621FB +:100F50000622094869430918624310180622F3F76C +:100F6000F1FE201CF4F740FA034AA1002A3251583E +:100F70000871B0BD00500700E67A0100034980B552 +:100F8000002048603C0038C7000007F032F980BDFF +:100F90000000D47A010010B5041C052801D3F4F731 +:100FA000D8FD0749087A074A107001200872FEF739 +:100FB000F4FB044A0430A1003C325158087110BDC2 +:100FC0000000808007003C0074C70000D47A010054 +:100FD000034980B50120486007F00EF980BD00008C +:100FE000D47A010010B5041C052801D3F4F7B4FD30 +:100FF000201CF5F78FFE0021201CFBF731FD01219D +:10100000002800D0011C09043C00B0C70000090CF6 +:10101000201C04F022FA10BD000006490120054BF7 +:10102000886000203C33002182009A581170013002 +:101030000528F9DB7047D47A01000F4938B5002044 +:1010400088600E48011C20318A793C00ECC7000002 +:1010500000AB1A70C9790A4C094D59700C343C35F3 +:1010600000210322635C002B02D08B00EB581A7026 +:1010700001310529F6DB00AB1988C18438BD0000B9 +:10108000D47A010000100700FFB5144F3C0028C8B7 +:101090000000041CBE790D1C81B00F2000F0B9F8CF +:1010A0002A1C104D0090211C281CF4F7DEFC211C8A +:1010B000A81D039AF4F7D9FC211C281C0C30049AB3 +:1010C000F4F7D3FC211C281C12300A9AF4F73C00D8 +:1010D00064C80000CDFC07F09BF8009800F076F89B +:1010E000BE7105B0F0BD000020100700E67A0100D7 +:1010F00010B50020F6F726F80749887800090001A6 +:1011000088700024201CF5F711FE01342406240EFB +:101110003C00A0C80000042CF7D310BD0000005014 +:10112000070080B502F0E3FB034881780F221143EA +:10113000817080BD000000500700F8B50D1C041C34 +:10114000052801D3F4F717FDA600002D114F07D194 +:10115000B8593C00DCC80000816800290ED14078F5 +:1011600000280BD002E0FF352D062D0E291C201C77 +:10117000FBF788FC011C201C04F07EF906490120C5 +:101180003039085504483C388068002802D1B959E4 +:10119000032008703C0018C90000F8BD0000107B57 +:1011A000010080B504F0CDF980BD10B5041C052800 +:1011B00001D3F4F7E6FC201CF5F7C1FD0020054A39 +:1011C000A10051588860044988780122A240104348 +:1011D000887010BD00003C0054C90000107B010065 +:1011E00000500700024A9178084390707047000051 +:1011F00000500700F8B50C4FBE790F2000F018F82A +:10120000051C0024201CF4F70DF9084AA1005158D0 +:10121000087101342406240E3C0090C90000042CFF +:10122000F3D3281CFFF7E1FFBE71F8BD00002010CA +:101230000700107B0100B0B508498D788A78054019 +:1012400082438A7006F0F9F9041C0A34201C06F067 +:1012500034F90028FAD0281CB0BD3C00CCC90000ED +:101260000050070001490A2008817047387B0100BF +:10127000F8B510480426041CE034051C383D00274E +:10128000201C1C30E460A06127610B48A682E0614D +:101290002762A7620620A084201CFEF73C0008CA33 +:1012A000000087FC201C0C30F6F7B7F90549383CE4 +:1012B000AC420880E7D1F8BD0000D4E4010012611F +:1012C0000100487B0100F7B5051C0C230F1C1249D7 +:1012D00058434418208806F0EAF9A07801283C0019 +:1012E00044CA00001AD16668022F05D15C20805BD9 +:1012F00002990009884211D1281CFEF7FBFF301C1F +:10130000F9F7FAFD0420A070391C281CFBF7F4F84B +:10131000034AE8003C32115801311150FEBD000073 +:101320003C0080CA0000607B01000120064A0021C9 +:101330000C234B439B189B78002B00D000200131DD +:101340000429F5DB7047607B010070B5041CFFF7D2 +:10135000EAFC002803D120210C20F4F7F6FB261C20 +:1013600060363C00BCCA00000021F171E164606B92 +:10137000251C4035002831D0FFF704F90122120363 +:1013800000282069018801D0914300E011430180C9 +:10139000206901220088D2022883201C583001884D +:1013A000914301803C00F8CA0000A36B5208002B57 +:1013B00010D091430180288B0007800F012815D0A1 +:1013C0002E20015D20690430F8F741FD616AFEF7C7 +:1013D000A8F904E011430180201CFBF7CCFB6883D3 +:1013E00004E0206941803C0034CB0000A88B2169D7 +:1013F000C882E068F6F720F93080606D002804D0DC +:1014000000220321707AFEF70DFF201C00F0B6F9D0 +:10141000707A06F045F870BDB0B5002406F022F9E8 +:10142000094A00210C234B433C0070CB00009D185F +:101430006B685B6CAD78C31A012D02D1A34200DD4D +:101440001C1C01310529F0D3201CB0BD0000607BBD +:101450000100B0B5041C06F0A8FE0C20084960434A +:101460004518288806F035F968683C00ACCB0000C8 +:10147000002806D02030007B012802D1201CFFF775 +:10148000A3FAB0BD607B0100FFB585B00FAE60CEA2 +:1014900038201E497043171C4418FFF77FF80122BB +:1014A0001203002803D02088904320803C00E8CB22 +:1014B000000002E02188114321801198391CE0626C +:1014C0000598F8F7D0FC011C2B1C381C069AFEF777 +:1014D00020F960800622201D0F49F3F772FC231CBF +:1014E0000898303318700E980C49587065633C00AA +:1014F00024CC0000002002900122049209480391AC +:101500005A780188019200911978243B301C626B53 +:10151000FEF7A8FE09B0F0BDD4E40100126101009D +:101520005D4E0000487B0100FFB587B0109812AFF8 +:101530003C0060CC00008C46A2CF4C23304C6B4367 +:101540001C19161C159A2785271C303706970597F6 +:1015500000233B73059F78731198271C60646160BA +:10156000226040373E70614661870798311CF8F76A +:1015700080FC3C009CCC00000599C8730A987870E8 +:10158000301CFEF773F8002801D0012000E0002095 +:10159000410002200140119A0120002A00D10020C0 +:1015A00008433872201C2E300799FDF7CFFF281C06 +:1015B00004F0AEF83C00D8CC0000FEF7FEFF4C2251 +:1015C000124B6A43D218012109032A32002804D0A1 +:1015D000101C12888A43028002E0108808431080A1 +:1015E0000B490020039106990290002204920848BA +:1015F0000A7B4188231C3C0014CD0000019200911D +:1016000079780833281C6268FEF738FE0BB0F0BD0D +:1016100058E30100754F00003C7C0100B0B50C1C84 +:10162000012827D0802830D1E06C002808D069201C +:10163000005D1849C00040183C0050CD0000043047 +:10164000016801310160201CFFF7E9FB134D503D9B +:10165000E868002805D02E20005DFEF710F802F0A3 +:1016600042FE201C6168F3F72FFB403460780028AD +:1016700002D106F012F8A860B0BD3C008CCD00008D +:101680002006000E8128FAD1220C2004000E02212F +:10169000FEF7E6FDB0BD0A210C20F4F77DFAB0BDDF +:1016A0009C7B0100F8B5184E184F051C3479B879A9 +:1016B0000090201CF5F77CFF002806D03C00C8CD28 +:1016C0000000124838384068854201D1002D03D10E +:1016D00010218620F4F763FA0D490020383948605C +:1016E0000421201CFFF759FC0421201CF5F7EBFE18 +:1016F0000C21064A6143303A89180C7104203C00E1 +:1017000004CE000030710098B8710F20FFF7A6FDDD +:10171000F8BD0000A47A010020100700F8B5041CF1 +:101720000F20FFF7C1FDF5F73BFF0125002800D092 +:101730000025164EB079164F00903879042801D153 +:101740003C0040CE0000002C03D111218620F4F78C +:101750002CFA1048290638384460090E0C1C042065 +:10176000FFF721FC0321201CFFF741FC211C042072 +:10177000F5F7AFFE0C21074A69430420303A891877 +:1017800008713C007CCE00003C710098B071201CB8 +:10179000FFF750FD0420F8BD20100700A47A0100D7 +:1017A0000C2302495843401880687047747A01003E +:1017B0006030C1798079814201D9012070470020D1 +:1017C000704700003C00B8CE0000014880687047B8 +:1017D00000004C7B010038B56921095C1823104AD0 +:1017E000594389188A6801328A604B69D21ACB68DA +:1017F000934200D2CA6000220B4C0260221C2032AD +:10180000957900AB1D703C00F4CE0000D2795A707F +:101810000A68002A01D1486000E0106000AB08604F +:101820001888E08438BD0000C47B01000010070068 +:1018300018230A495843411808690130086148686B +:10184000002809D0486901303C0030CF00004861D1 +:10185000486802684A60002A00D10A607047002088 +:101860007047C47B0100F8B5124E104D0F4C0A278B +:10187000211C0020E0602A31221C1832A160626124 +:1018800027820C4AE061A26160623C006CCF0000DC +:1018900006202084081CFEF7D7F9201C0830F5F735 +:1018A00001FF4C3CAC427080E5D1FF203070F8BDA8 +:1018B00088E401000CE301003C7C0100126101009E +:1018C000F8B5041C0B480E1C171C44703C00A8CF34 +:1018D000000005F000FF051C391C301CFDF7ABFFB4 +:1018E0000C21054A28180A30614308325050034839 +:1018F000891800688860F8BD00006C7A0100786E75 +:10190000010070B50B4E051C7078FF280FD03C000D +:10191000E4CF00000C23084C58430834205805F04D +:101920001DFE002806D170780C23584300198168E9 +:101930002943816070BD00006C7A010080B53021C0 +:101940000148F3F743FA80BDECE5010010B505F05E +:101950003C0020D00000C5FE0A4944180CE0201CC1 +:1019600005F0F7FD002807D0F5F751FE002803D059 +:1019700013218620F4F731F9F5F749FE0028EED15E +:1019800010BDB0360000FFB58BB0199B0D1C041CB8 +:101990001A203C005CD00000002B169900D11820C2 +:1019A00001901498002827D0FF20199B0130002BAC +:1019B00001D1182300E01A230433824204D3D01A41 +:1019C000400840000004000C0D906A480088C21ACC +:1019D0001204120C3C0098D000000492002908D098 +:1019E0008979664A4900515A049A511A0A04120C1C +:1019F0000492049A824205D90020049002E06048D3 +:101A000004900D9001980104090C0A910020F4F74C +:101A100084FA009000683C00D4D0000000260690B4 +:101A20002060002005900E9800240005000C09900D +:101A30001A980D9F4007400F089007940395002DBA +:101A40000DD02889B84204D836183F1A07D0ED685F +:101A5000F5E73904090C281C3C0010D10000F4F70C +:101A600038FBEFE7002E02D10799002971D1271C1E +:101A70006C20F4F788FB0799041C002920D10794F7 +:101A80000020A0611898271C606017982437A06078 +:101A90000698206115980FC80FC73C004CD1000074 +:101AA00014985C2160630998085319986921E063D0 +:101AB0001B9808551C9860651998002823D0089831 +:101AC000069908831FE06C22201C0799F3F71AFA85 +:101AD0003C60019862213018C85315983C0088D1A9 +:101AE00000004021807AC8550020B86306980A9902 +:101AF000F4F71FFAF8600299F4F73BF9201C403024 +:101B0000818B059A1207120F1143818303985E217E +:101B100002900198224A30180853126801213C00B3 +:101B2000C4D10000081C002A00D01B980006049AAB +:101B3000000E964203D92C2211551B4904E0159939 +:101B40002C22097A11551949085C662108551C9800 +:101B5000002801D01F200855002D03D0E86803900D +:101B60003C0000D20000002000E009E0E860059899 +:101B7000002601300004000C0D9F0590039D6DE7C9 +:101B80000098E0600299F4F7FAF800202060012143 +:101B9000A1636034608007980FB0F0BD000006615B +:101BA00001003C003CD200005C4301003809000009 +:101BB000186701000E6101000A6101000148006818 +:101BC00070470000C46A01000249091D03C940189A +:101BD00070470000C46901000148006970470000B7 +:101BE000C46901003C0078D2000001484069704798 +:101BF0000000C46901000148806970470000C469A1 +:101C0000010070B50D4E0020351C4035F0630DE02D +:101C1000A068F4F77AF9B36D002B04D000220120FC +:101C2000616BF3F795F83C00B4D20000201CF4F788 +:101C30009DFA281CFAF742FD041CECD170BD00008F +:101C4000C4690100F8B51A4F0026F86B00282CD0A3 +:101C5000381C403000901DE01648B96B02F05CF86B +:101C60000022201C144903F03C00F0D200007BFF4E +:101C7000051C04D1386A0130386201360DE0A068D5 +:101C8000F4F749F9BB6D002B04D00022281C616BCE +:101C9000F3F764F8201CF4F76CFA0098FAF711FDDA +:101CA000041CDCD10748B96B02F03C002CD30000C7 +:101CB00025F80020F863301CF8BD0000C46901005D +:101CC0003463010011300000C460010001490120AB +:101CD000C8637047C469010080B50020054A00212F +:101CE0001C2343439B1801300428D9663C0068D369 +:101CF0000000F8DBFCF7FDFC80BDC4690100014970 +:101D0000C86470470000C4690100014988647047D5 +:101D10000000C4690100B0B5041C0D1C211C028E1A +:101D2000806A4031F3F72FF8002816D102213C00D9 +:101D3000A4D30000201CF4F76FFAE269C000101869 +:101D4000828BAB889A4204D182692B689A4208D26E +:101D500001E09A4205D2002118300CCD0CC000E001 +:101D60000121081CB0BD0000F8B5061C002744681E +:101D70003C00E0D300000FE00949486A01304862A6 +:101D8000A069002802D0F4F700FAA761266225684E +:101D9000201CFFF752FB2C1C002CEDD1F8BDC469B0 +:101DA00001000330074A8108136850681B688900E6 +:101DB00009183C001CD400008B4201D3516000E0A4 +:101DC00000209060704700008C6E010070B5124ECC +:101DD0008038C50070590C1C002804D101210D2049 +:101DE000F3F72EFF0DE02069002805D1A81981889E +:101DF000E06801F03C0058D4000047FA20617159B6 +:101E0000201CF2F7BBFF041C002C07D0E068002860 +:101E100001D0F4F792F8201CF4F7BDF970BD5442DC +:101E2000010070B5041C0D1C0E490622F3F735F8AD +:101E30000026E66166623C0094D400000720302151 +:101E40000855E663281CF8F76BF8A076201C1430C0 +:101E50000622291CF3F724F80622291CA018F3F700 +:101E60001FF8266170BD00001261010080B5FDF70A +:101E700085FE80BD014948603C00D0D40000704719 +:101E80000000E4650100024980B54968F2F77CFF73 +:101E900080BDE465010080B5F4F7E5F9074907481E +:101EA0000EC90EC018380068002802D002F0B7FA38 +:101EB00080BD02F09EFA80BD00003C000CD5000001 +:101EC000B058010090730100054980B58968002071 +:101ED000002900D103200006000EFAF7E3FB80BDC5 +:101EE000606C010080B5034806220349F2F7DEFF6B +:101EF00080BD000040800700126101003C0048D511 +:101F00000000B0B5041C0C4D0B1C211C00200C3D26 +:101F10000029094C05D02878211C1080021C181CAF +:101F200007E011880E2907D80A06120E191C201C7A +:101F30002A70F2F7BEFF0120B0BDB06901003C007D +:101F400084D5000010B500200A4A012111600A4C16 +:101F50000AE0021C016A5032914205D061783C23AC +:101F6000594309190431016204F0BAFB0028F0D189 +:101F700010BD0000DC62010068610100044880B50A +:101F80003C00C0D500000068002803D0011C1020D0 +:101F900004F0C7FE80BD286101000322111F80B537 +:101FA0000020FBF776F980BD000080B50BF0B9FA90 +:101FB00080BDFFB583B0161C002101911F1C0821B4 +:101FC00002AA3C00FCD50000FAF70EFF041C2AD13F +:101FD00002984168490001D4092424E0FAF752FF2D +:101FE0003860029841684902CD0F291CFAF744FF76 +:101FF000011C306038680006000E00F01BF8002855 +:1020000001D10A243C0038D600000FE03168029864 +:102010002B1C01AAFAF7D7FF002806D00198002848 +:1020200004D004990968814200D2032401980499DC +:10203000086007B0201CF0BD000070B5051C0E1C28 +:10204000012400F084FF3C0074D60000002808D072 +:10205000032D01D0042D04D10320C003864200D3F8 +:102060000024201C70BD00007CB5151C061C0C1C37 +:10207000291C6A4601ABFFF7A5FF002802D1002CFE +:1020800001D103207CBD17483C00B0D6000000AB56 +:1020900006601879072821D202A31B5C5B009F44CD +:1020A00000001D040406101713000420EDE72A1C8D +:1020B000211C0120009BF2F781FE002812D106208E +:1020C000E3E72A68009905E000983C00ECD60000A0 +:1020D0004278811C01E02A686946201CF2F7FEFE66 +:1020E00003E004218720F3F7CFFD0020D0E70000B4 +:1020F000F86B0100F7B586B00E1C082105AA0698FA +:10210000FAF77EFE041C45D1059841683C0028D7AB +:10211000000002904902C90F002504950391089F11 +:10212000FAF7D5FE019002A903C9FAF7C6FE019994 +:10213000052914D202A35B5C5B009F4400000E03E0 +:10214000060C030087420ED807E087420BD83C00FC +:1021500064D700000125C01B049007E0874205D129 +:10216000012503E005218720F3F794FD002D01D11F +:10217000032415E005984168002969DA3A4A06996E +:102180001160FAF791FE071C05980399FAF786FE8D +:102190003C00A0D70000051C011C381CFFF75FFFA6 +:1021A000002801D10A245EE0072F57D202A3DB5D8D +:1021B0005B009F440000530404062E504800042492 +:1021C00051E00498002801D1002714E0089908186C +:1021D00000043C00DCD70000000CF4F72BF8071CCF +:1021E000311C089AF2F786FE089804993818F2F71D +:1021F0002FFE089804993E1C40180890311C0020BE +:1022000008AAF2F7ECFD002800D10524002F2DD0FC +:10221000381CF3F73C0018D80000EDFF29E00399C3 +:10222000002904D0059840688702BF0A00E0002713 +:10223000311C281C089AF2F760FE0499002903D08B +:1022400008982818F2F707FE002F12D0F2F7CCFDFD +:102250000FE0311CA81C3C0054D80000089AF2F78B +:102260004FFE0898687007E0FFE7072404E00824A1 +:1022700003218720F3F71AFD201C09B0F0BD0000F0 +:10228000F86B01009EB51C1C00AB19720092002275 +:1022900001946946FBF708FA3C0090D800009EBD07 +:1022A00000008FB5029200220090019003916946D0 +:1022B0000420FBF7FCF98FBD0000B0B50C1C012811 +:1022C0000AD0032819D004282CD1606801F035FC0D +:1022D000011C83200CCC22E01C203C00CCD8000048 +:1022E00014496043401814494518281CF8F746FC67 +:1022F000A968002903D0221C082005F071FEB0BD9A +:10230000208CC82801D3042004E0652801D30220D2 +:1023100000E001202084201C03F0DCFA3C0008D9F6 +:1023200000002268E368011C8220FFF7B4FFB0BD03 +:10233000A0210820F3F7C3FCB0BDDC71010064EEFE +:10234000FFFF0348044A81685161C068906170478B +:102350000000F4680100C07101000349044A3C0018 +:1023600044D90000086B90608868D0607047000016 +:10237000905C0100C071010000B5FFF7F1FFFFF7AD +:10238000E3FF00BDB0B50D1C002814D00B490C4C68 +:1023900088686269C968801AA269891A401804D0DD +:1023A0003C0080D9000064235943F2F7C4FE206149 +:1023B000FFF7CDFF206928600120B0BD0020B0BD2F +:1023C0000000F4680100C0710100B0B50D1C0028C8 +:1023D00017D00C490D4C086BA2688968801AE26816 +:1023E000891A3C00BCD90000401807D022889042CE +:1023F00004D964235943F2F7A1FE6060FFF7B6FFEA +:10240000606828600120B0BD0020B0BD905C010074 +:10241000C07101007CB51068002802D000F024F8DB +:102420007CBD0F483C00F8D90000C0698468E068B2 +:10243000256AA669F3F7E3FDE169F3F706FD201CC1 +:10244000E2694030C18B12898918C1830749019420 +:1024500000912869331C82880168E068C068F8F739 +:102460001EFCE0E700003C0034DA0000846A010052 +:10247000915E0000F0B58569066A041CC06885B0ED +:10248000C068002801D1F3F757FC0A49029504946B +:102490000391306982880168262001920091435D92 +:1024A000E068E1692A1C0E323C0070DA0000C06866 +:1024B000F8F737FD05B0F0BD0000E9D9000010B510 +:1024C000141C0548FCF77BFBA068F3F79EFDE16850 +:1024D000C160201CF5F7BBFA10BDA06A01007CB5F5 +:1024E000041C6030027BA16900913C00ACDA000062 +:1024F0000192221C211C3831A06848320D1C6369EE +:1025000003F07AFB08210020F3F788FDE0602669DC +:10251000B16B002901D0102300E018230549019474 +:1025200000913168CA180823011C281C3C00E8DA15 +:102530000000F8F720FD7CBD000081DA0000F0B556 +:102540004668171C041C0121301C9BB0FAF70DFCD7 +:102550000025002803D013490A7A012A01D1012558 +:102560001CE088624E612089C861608900283C00B7 +:1025700024DB000003D000200884488404E0E068E5 +:102580000884208A4884608A8884086B002803D1E4 +:1025900001A803F077FC04E001200861002002F0AC +:1025A00039FB3D711BB00120F0BD0000F46E01004D +:1025B0003C0060DB000010B5041CF7F7E8FB0028C6 +:1025C00011D14B20005D01280DD1201C04F085FAAB +:1025D0000021201C04F0F3F8A0690021C207D20FEB +:1025E0000420F4F7D8F910BD000038B5041C04F03D +:1025F00036F93C009CDB0000002803D04030807A94 +:10260000002825D10C2029210855211C0622A018BC +:10261000F2F7A0FC201C06220E49F2F79BFC0120D9 +:10262000E06160620720302108550025E56306203F +:1026300000AB18803C00D8DB0000E068002801D027 +:10264000F3F7DBFC02216846FDF773FBE060201C1A +:10265000FFF769FCE560201C38BD12610100FEB582 +:10266000051C0E1C152000AB98801421171C00209F +:10267000F3F7E3FC02903C0014DC0000046806223F +:10268000311C601D2571F2F76BFC0622391C201CE1 +:102690000B30F2F765FC01A8FFF752FCFEBD00000D +:1026A00080B50023FBF75CF880BD000070B5051C09 +:1026B00008350F4E291C041C3C0050DC000006228B +:1026C000301CF2F750FCA088B082281C05F0A1FF56 +:1026D00000280BD0E0883061281C04F0CCF8A188D9 +:1026E000403041800020F4F7B8F902E00420F4F70C +:1026F000A0F9002070BD707C01003C008CDC000063 +:1027000080B50020FBF7F8FB80BD000070B5041C0D +:102710000430051CFDF732F8002809D00020F7F737 +:1027200037FC002804D00622011C281CF2F71EFCEE +:102730000A4E0622291C301CF2F718FC3C00C8DCAB +:1027400000006089F082281C05F069FF002803D092 +:102750000220F4F788F902E00520F9F7F4FA0020E6 +:1027600070BD707C010010B5041C007904281CD2D7 +:102770006079012801D0032804D1002201213C0006 +:1027800004DD0000A01DF9F769FC6079002804D180 +:1027900022790021F9F762FC0AE0032808D100241D +:1027A000221C00210020F9F759FC0134042CF7DB2E +:1027B000012010BDF0B597B0171C051C0430041C97 +:1027C0003C0040DD000015AA16A905F0E2FE002835 +:1027D0002ED015984B21095C002923D0012902D065 +:1027E00002291FD101E004F090F9AD7A1348169E3A +:1027F00005800622211C0830F2F7C1FB221C311C87 +:1028000002A83C007CDD000000F074FB0A200AA94D +:10281000487200AB9D80022101A8FDF79FFA059048 +:1028200002A8FFF795FBF3F7F7F90021159803F0DD +:10283000E1FF002000E00120387117B00120F0BD59 +:10284000987C01003C00B8DD000080B50120FBF75A +:1028500062FB80BD0000B0B5041C807D151C0A1C05 +:10286000C007C0170130211CF9F7FBFC002803D179 +:10287000042028710120B0BD206AF7F776FE606A57 +:10288000F7F77BFE206A3C00F4DD0000FEF788FAD3 +:102890000020B0BD10B5141CC27981798088F7F78B +:1028A000A1FA2071012010BD80B50123FAF770FF55 +:1028B00080BD0000F0B5041C081C00210F2891B059 +:1028C00000D30221002941D13C0030DE0000C000CD +:1028D000244F1090C619B288216802A8F2F75BFB5A +:1028E0002189B088091A002907DD09042268090C2A +:1028F0001018F3F7C0FB051C00E00025B07980211B +:10290000884317497831095C00203C006CDE0000E8 +:10291000F3F7B4FB071C00681349019010980B589B +:10292000019A291C02A8F2F7ACFA0090281CF3F7D0 +:1029300073FB201CF3F782FB0098002808D0029854 +:1029400001990860B079391CFAF720FF3C00A8DE35 +:10295000000011B0F0BD381CF3F761FBF9E72D2042 +:10296000F3F7F5F9201CF3F76CFBF2E700002444C1 +:10297000010070B5051C2035061CA879042848D232 +:10298000E979012913D1301C283003F092FF3C0073 +:10299000E4DE000000283FD0011C8C310165A979DC +:1029A0004C22041C11548118416250340462E11E0F +:1029B00081620BE000292FD13C2218494243541870 +:1029C000174A04341268002A00D14870002C23D022 +:1029D0003C0020DF0000351C3035E879012801D0AB +:1029E000052801D10620E8712022311D2068F2F768 +:1029F000DEFAB08CA080E879A071A8790025A063E8 +:102A0000012060810020E0602E36E80000191830B7 +:102A100008223C005CDF0000311CF2F7CBFA0135E4 +:102A2000042DF5D3012070BD68610100DC62010056 +:102A300010B5041CC07A012801D0032807D1201D3D +:102A400003F040FF002802D0A17A40304173E07AC1 +:102A5000002801D03C0098DF0000032802D1A07AB2 +:102A600002490870012010BD00006861010070B5C6 +:102A70000E1C0321041C301CFCF7E1FB002801D0D4 +:102A8000857800E000250B48321C00680368207C34 +:102A90008007C00F211C3C00D4DF0000F7F762FE66 +:102AA000002805D00121281CFDF7FEFB002000E0D6 +:102AB000082003F0C5FF002070BD0000E4650100A0 +:102AC00080B5426800880121490608432D2105F0A0 +:102AD000D3FB80BD034901203C0010E00000497891 +:102AE000022900D0002070470000846601008CB5E8 +:102AF00001281FD100290DD001290BD0022901D0B6 +:102B0000032916D10020F9F714FC932000AB18809C +:102B1000002008E0012900D000203C004CE000002B +:102B2000F9F70AFC832000AB1880022000F0CCF8F3 +:102B300001906846FFF73AFA8CBD01210E20F3F7A9 +:102B40001BF9F9E7FFB5171C1E1C1421002083B0E8 +:102B5000F3F7ACFA051C0468122000AB3C0088E0D7 +:102B6000000098800622601D0399F2F732FA0020D7 +:102B7000207127730499201CE172311C06220D304C +:102B8000F2F727FA029501A8FFF713FA07B0F0BD94 +:102B90000000F8B5061C0F1C0C210020F3F73C00C8 +:102BA000C4E0000089FA0568041C281D0622311CB7 +:102BB000F2F712FA6F81201CF8BD0000B0B5041CBA +:102BC0000D1C08210020F3F777FA01688C718D80C5 +:102BD000B0BD0000F7B50E1C1021171C0020F3F744 +:102BE0003C0000E100006BFA0468051C201D062271 +:102BF0000099F2F7F4F96681A781281CFEBDF3B5B0 +:102C00000C1C0821002085B0F3F759FA061C076850 +:102C1000E068002802D00599012904D1059838718F +:102C200000203C003CE10000787156E0036801217F +:102C3000039320690290FCF717FB051C02983221D0 +:102C4000FCF712FB0022D243011C281C04ABF7F74F +:102C5000B9F8002804D1301CF3F702FA00263CE052 +:102C6000002D05D03C0078E100006878093807287D +:102C700001D8322028701C210020F3F726FA019099 +:102C80000568011C301CF3F740F9E068F3F70BFA14 +:102C9000A861E1680198F3F738F90020E060059831 +:102CA0008021084338713C00B4E100000120211C60 +:102CB00014317871281C0622F2F79AF9029A292019 +:102CC0000092005D0121E26A082800D00021281C42 +:102CD000039B02F09DFFA06B2861206C68617F3030 +:102CE00001D10F206861301C3C00F0E1000007B00A +:102CF000F0BD10B5041C08210020F3F7ECF90168C1 +:102D00000C7110BD00000148006870470000286188 +:102D100001000149086070470000E4650100021CE1 +:102D200001200006084380B52D213C002CE2000064 +:102D300005F0C0FA80BD000080B5012807D0F12859 +:102D400025D0F32827D1022002F0BCF980BD00294C +:102D50001AD0012903D0F229F8D188211CE01048AB +:102D60000178002905D140780128EFD13C0068E2C4 +:102D7000000000F016FA80BD0B4814300089FCF703 +:102D80005AFC011C01220F2005F09FF980BD04F0C0 +:102D900052FA80BD0020FAF732FE80BD02210F20DA +:102DA000F3F705F880BD84660100014800783C0017 +:102DB000A4E2000070470000746601000149002091 +:102DC00048607047EC650100F8B50E1C134D011CFE +:102DD000141C6822281C1F1C0C30F2F771F90F49D3 +:102DE0000020AC394860012129601921192C6E6737 +:102DF0003C00E0E2000000D3211C2981094914397C +:102E000088738F74C878012808D001210F2005F03D +:102E10009CF91920FCF715FCFBF799F80120F8BD87 +:102E200000009866010080B5012802D100F02FF85B +:102E300080BD3C001CE3000001211D20F2F7C0FF13 +:102E400080BD00007047000001200749000580B5E3 +:102E5000886000228021162005F04CF904F034FD32 +:102E60000249086180BD000000100700246D0100C8 +:102E7000064A80B53C0058E30000D16A814207D180 +:102E8000107F2423044958434018C068F2F735F8EE +:102E900080BDD4790100944601001D481CB500781E +:102EA00000282DD01C480068002829D01A4A1A4B47 +:102EB000043211681C693C0094E30000A14222D155 +:102EC00051685B6999421FD1164949689368C91ACC +:102ED000814219D2D06814490130D0600968884213 +:102EE0000CD90622FF216846F2F72EF9F3F7ACFC65 +:102EF000011C0023002268463C00D0E3000002F0E1 +:102F0000CEF901221D200A4905F0F7F81CBDF7F79C +:102F100088F904228118081CFCF727FBF6E71C75CA +:102F200001004475010028610100905C0100F05926 +:102F30000100A086010080B501683C000CE400009F +:102F4000002915D10079022812D1081CF7F780F862 +:102F500000280DD003F0F2FC0830418F002907D182 +:102F60008069002804D08079062801D1FCF718FB7D +:102F700080BD000001490020886270473C0048E4A1 +:102F8000000078690100B0B5054D041CA91DFFF7CC +:102F900014F80622291CA018F2F74BF8B0BD707C7B +:102FA0000100B0B5041C151CFFF707F80622291C08 +:102FB000A018F2F73EF8B0BD000080B50A303C0022 +:102FC00084E40000F7F7BCF90123002803D005488A +:102FD0000078012804D100220021002003F0C6FD62 +:102FE00080BD0000A079010080B5002300220021EF +:102FF000002003F0BBFD80BDB0B5054DAC790A1CC7 +:103000003C00C0E40000011C0123012003F0B1FDDD +:10301000AC71B0BD000020100700F8B5061C0C1CF8 +:10302000880702D5F6F747FA10E060070ED5174F6C +:10303000A320C05D154D102800D3154D04F059FC98 +:10304000B96F3C00FCE40000401A291A0120F6F791 +:10305000C1FAE0071149C00F48600CD00D4C443C48 +:10306000207803280FD1002E06D0F6F7F9F9011CBD +:103070000120F6F7AFFAF8BD09490120F6F7AAFAE0 +:10308000012020703C0038E50000F7E70121301CEA +:10309000F6F789FAF2E7A60E0000A46C0100C40955 +:1030A0000000B057010040420F0080B5062804DB45 +:1030B0000521FF20F2F79FFE80BD034AC00011509A +:1030C0000121801801713C0074E5000080BD000002 +:1030D0009C5A01000148806870470000D0600100E0 +:1030E000B0B5084C251D281C216800F0F1FE002811 +:1030F00003D101210448F2F7CFFA281C216800F01F +:10310000FBFEB0BDC06001003C00B0E500002C102B +:103110000700B0B5104D0C1CA868002802D104F0BF +:10312000F4FB2860201C04F038FB0121032003F08D +:10313000C4FE04F0F0FBA86800280BD104F0E5FB06 +:103140002968001B401A696840183C00ECE5000043 +:103150004108401828600120A860B0BDD06001007F +:10316000F8B51F4E0024B068002802D104F0D0FB4F +:10317000706005F061F804F08FFB051CF9F766FE3E +:103180003168184A41181268E80B002A3C0028E60A +:10319000000000D1A80A401885421FD9144F2D1AEB +:1031A000381C2030817900AB1970C079587005F057 +:1031B0006EF8002803D102218F20F2F728FE291C87 +:1031C0000C48F268F8F709FC002804D0011C3C0008 +:1031D00064E60000281CFFF7A5FF012400AB188857 +:1031E000F88405F047F8201CF8BD0000D06001000D +:1031F000F474010000100700891301000149012047 +:10320000C8607047D0600100064880B5006801289A +:103210003C00A0E6000007D10448AC38016903482F +:1032200000F079FEF3F72BFA80BD98660100346355 +:10323000010080B542788168007903F0DEFF002844 +:1032400001D1F5F7B6F980BD00001FB504F069FBA8 +:10325000F6F73C00DCE6000091FF164C022803D193 +:10326000FFF7DCFD042802D3002020701FBDFBF710 +:10327000F7FC0028FAD1606A0028F7D02078800790 +:10328000F4D40921162004F093FF012020700B4C88 +:10329000094902903C0018E700000194009104F0F5 +:1032A00046FB001903906846FDF7B5FB0022162186 +:1032B000842005F03EF8DCE70000606C010061ED61 +:1032C000000040420F00234870B580789CB0012870 +:1032D0003ED1204C09A83C0054E70000803C611C12 +:1032E000FEF792FE042011AD6872A06F19A9189024 +:1032F0007C20005D012608711D20005D002806D09D +:1033000010961296FCF7F6FA2872207A1190F3F7CD +:10331000CDFF6A21085340343C0090E700000022B2 +:1033200001A906A8F6F7CDFF211C0020FBF7CBFB77 +:1033300006A9FBF7C8FB01A9FBF7C5FB0A49096809 +:10334000002907D0331C0A226946FBF7DAFB009AF2 +:10335000072191700C9009A8FEF73C00CCE7000013 +:103360007BFE1CB070BD000084660100E4620100B9 +:10337000F8B5041CC068FF22016812020E1C087B0D +:10338000497B090211400843051C311C0622A01884 +:10339000F1F77CFE0622B118201CF1F73C0008E88A +:1033A000000077FE280A290208430004032149028D +:1033B000000C884208D2E06801890E390181E0687A +:1033C00001680E310160F8BD0026201C103003F0AA +:1033D000E8FA218B002905D1E17D00290BD03C00C2 +:1033E00044E800008069800708D4E068012601896C +:1033F00002390181E0680168023106E0E068018974 +:1034000006390181E0680168063101601449002035 +:103410000B1F42009A5AAA4202D11149063102E01A +:103420003C0080E8000001300228F5D3E068062265 +:103430000068F1F734FE012ECBD1812000AB18805B +:10344000E17D208B49030843310308430004000C4D +:10345000010A000208435880E06819880068C180AA +:1034600059883C00BCE800000181B5E76A460100CC +:10347000B0B50D1C01890622083101810468044998 +:10348000083C0460201CF1F70DFEE580B0BD000093 +:103490006A460100F8B5002901D0002801D10020BA +:1034A000F8BD09043C00F8E80000090CF2F743FFFE +:1034B000061C051C002720E02C892968022C01D25B +:1034C000022001E048780230844202DD241A091803 +:1034D000F4E7844210D0011B0A040104090C120C09 +:1034E000281CF2F79EFE3C0034E90000002806D1BB +:1034F000E868F2F72DFEEF602889001B2881ED684F +:10350000002DDCD1301CD1E7F8B58568041C80693A +:103510002E1C00280DD07168F2F7F6FDA069F2F7B5 +:1035200017FE06E00021C1603C0070E90000F16078 +:10353000A08D36680138A085F0680028F5D1306884 +:10354000A060A08D01380004000CA08502D0201CD2 +:10355000F9F739F82A4F2A480068002803D00621D5 +:103560006868FAF77CFD686800683C00ACE9000018 +:10357000817800292BD1C178002930D1218E0139E1 +:103580002186FBF715F8A16A081AA062E169884252 +:1035900003D904210220F2F767FCB86800281ED086 +:1035A0001A49208E49680C22521A90423C00E8E9E0 +:1035B000000008D319239B01AF2292015943A06A4E +:1035C000511A88420ED200210C2003F0ACFC0020DE +:1035D000B86007E0012905D1C078172802D1A08E74 +:1035E0000138A0862A1D06CAE0686369F1F73C002D +:1035F00024EA0000DCFCB54201D02D68B4E7A08DC0 +:10360000002803D10548B96900F09EFCF8BD000010 +:10361000FC5A0100CC5C010018570100C460010095 +:103620008907074BCA0F80B5197C002906D0814352 +:103630003C0060EA0000197403D10721152004F052 +:10364000A2FE80BD00007869010080B5011C012048 +:10365000FFF7E9FF80BD80B5011C0220FFF7E3FF03 +:1036600080BDB0B51B4C6068FCF72FFF20680025BB +:1036700040683C009CEA0000002803D0FDF718FCDD +:10368000206845606068FCF7C5FE1448616800F07A +:1036900061FCA07A012805D0022803D020680068C8 +:1036A00000F0DEF801211F2004F0B2FD00211F20F0 +:1036B00004F0AEFD3C00D8EA000002211F2004F017 +:1036C000AAFDA57221682C20405C8968F1F776FC80 +:1036D0006068FCF7E4FE20680562B0BD0000147A63 +:1036E00001003463010004490A68C868926A002A2C +:1036F00001D0096908183C0014EB00007047000075 +:10370000147A0100B0B5134C051CA07A01380228C8 +:1037100019D801211F2004F081FD2068FC23011C21 +:103720002030027B1A400273002D0FD001231A4370 +:103730000273A07A032807D13C0050EB000001205F +:1037400001F0E7FD002801D1FFF797FFB0BD4B6204 +:10375000B0BD022111430173F6E7147A010010B5E0 +:10376000041C0A30F6F743FE00280CD022880A49D0 +:103770000B7A9004C00F002B06D13C008CEB0000AC +:103780001206920E202A00D10120C86010BD002828 +:10379000FCD100222421802004F004FE10BD000092 +:1037A000047A010080B5021C1F21802004F0FAFD7C +:1037B00080BD0000F8B51D4E041C30683C00C8EB0D +:1037C00000001D1C4768201CF1F70AFCFBF787FA74 +:1037D000002804D0281CF2F72AFB002828D12088D2 +:1037E000400525D430680068FEF759F9002803D158 +:1037F000FDF789FAF1F7EDFB3068002540683C00E1 +:1038000004EC0000002803D0FDF764FB306845603D +:1038100020880009000703D104F0C8F86188451822 +:1038200030684561816A0131816220888004C10F5E +:103830000248F8F7CDFFF8BD147A0100B1EB0000A3 +:103840003C0040EC0000B0B50E4C051C6068FCF775 +:10385000F6FD0C48616800F092FB0021242004F082 +:10386000ECFC0022D2438021242004F0B8FC00208C +:10387000E0602072206801682806000EF1F7B0FBB6 +:10388000B0BD3C007CEC0000047A01003463010010 +:1038900010B5041CC068F2F785FC201CF2F7B0FDDF +:1038A00010BD000070B51C4E051CB07A2C1C4034B5 +:1038B000022826D1A08B3189884222D13068416A02 +:1038C000002908D03C00B8EC00002030007BC00785 +:1038D00004D5012001F02FFD002818D160780028C0 +:1038E00009D1306802232030027B0D495208520072 +:1038F0001A43027301E0FF21F53101221F2004F079 +:103900006EFC0320B0723C00F4EC000002E0281CC6 +:10391000FFF7C4FF6078002803D1291C012003F0C1 +:1039200029FB70BD147A010050C30000B0B5041C1F +:103930006034E0790E4D00280AD10220A872286870 +:103940004068002804D10B483C0030ED0000FDF732 +:10395000D0FA2968486004F038F82968C861FFF790 +:10396000E0FE29680969081A03F06FFF002801D0FA +:10397000E079A071B0BD147A0100C1EB0000F8B588 +:10398000041C002604F021F8051C3C006CED00002E +:10399000224800270770A10704D0E107C90F016280 +:1039A000C5610126416B002934D1002E32D0061C9E +:1039B000F9F744FF316B1A4B411AA20712D5DA68A6 +:1039C000002A08DD91421A6802DA14093C00A8EDC9 +:1039D0000000A21806E01409121B03E00A4302D1FA +:1039E0001A6852001A60B7630AE0B26B0132B26320 +:1039F000022A1A6801DD940800E01409121B1A60FB +:103A0000D9603063F56218680849884201D93C00E2 +:103A1000E4ED0000196003E0642801D2642018601E +:103A2000F5F7FCFDF8BD0000606C0100B057010027 +:103A300020A10700FEB5041C0020504D0021686144 +:103A40002069FBF7B3FC071C20690321FBF7AEFCE0 +:103A50003C0020EE0000002803D0807829788842BE +:103A600063D1474D201C1430391C061C2A7802F003 +:103A70005AFA002859D1E068056841480195583044 +:103A80000290FBF76AFF3E4D193500280BD0281C29 +:103A9000FBF73C005CEE000055FF00281ED1311CF6 +:103AA000281CFBF765FF002842D017E0281CFBF715 +:103AB00049FF002806D0391C0298FBF763FF002855 +:103AC00036D00BE0391C0298FBF75CFF00282FD0A2 +:103AD000311C281C3C0098EE0000FBF74CFF00282E +:103AE00029D0301CF6F7ADFC294A1832117C002988 +:103AF00004D0516A002901D000281CD1906A002806 +:103B00003BD01378019D01216D8901202B409B073B +:103B100011D0A36B1E4E3C00D4EE00001D1C7F355F +:103B20009836002D14D0558A002D08D15569AB4226 +:103B30000FDA0020174D01236B610AE029E0F578C8 +:103B4000022D06D1144F55693F68ED19AB4200DADA +:103B50000020236C1D1C7F353C0010EF000010D0AE +:103B6000558A002D03D19569AB420AD208E0F57859 +:103B7000022D06D10B4E95693668AD19AB4200D2C5 +:103B80000021084308D0106A002801D0F1F74BFA51 +:103B90000021201C01F0B9F9FEBD3C004CEF0000F3 +:103BA000EC650100C4670100CC6701003EB5056A01 +:103BB000041CC068F2F734FBE169F2F757FA201CE5 +:103BC0004030C18B0431C1832B6910499879062894 +:103BD0000AD1988801910294009060693C0088EFB6 +:103BE00000001B680168E0680322C0680AE0022840 +:103BF0000BD11020009001910294E068A369C06885 +:103C000000220021F7F70FFB3EBDF2F7A6F9FBE714 +:103C10000000BDEF000080B5D1685069C9683C0064 +:103C2000C4EF0000C160D168C860111C4031CB8B6B +:103C300000891818C8831068002802D0FFF7BCFF5D +:103C400080BD0348FBF7CCF8006AFEF7F5F980BDAC +:103C5000A06A0100F8B5061C0A2430070109A00774 +:103C60003C0000F0000001430F1C0A4D2F6004F0DF +:103C7000FAFEAD682801000FB04205D0013CF4D235 +:103C800001219B20F2F741F92802000A082E01D1F8 +:103C900031050843F8BD600007000122D20580B558 +:103CA00000213C003CF00000042004F0DDFC0F206B +:103CB000FFF7D6FF0F2109040840000C80BD00006B +:103CC00080B50548FDF74AF90448FDF77BF804483C +:103CD000FDF76CF880BD000089340100ED24000080 +:103CE000111C00003C0078F0000080B50248F3F79A +:103CF0002AFC80BD0000D124000080B5F2F753F902 +:103D000080BD80B50021002001F051FE032002F0AB +:103D100046FF80BD0000064880B5C169002906D174 +:103D2000016A002903D13C00B4F00000816B034814 +:103D300000F05EF980BD0000C46901003463010039 +:103D400010B5044C206AFCF7B3FB0348216A00F06D +:103D50004FF910BD1C75010034630100B0B50D4C66 +:103D6000207C002802D001213C00F0F00000FDF78B +:103D700086F900252570A068012803D10020A560E0 +:103D800001F08FF8A078012805D103489838006920 +:103D9000FCF7EFFBA570B0BD00008466010080B5A4 +:103DA0000021012001F009FE80BD3C002CF1000043 +:103DB00038B569460025F8F7B7FE041C01D101208B +:103DC00038BDA068002804D00099A131082004F073 +:103DD00073FA1C21201CF1F7A3F9281CF0E700005E +:103DE000FEB5071C4C233949584344183C0068F180 +:103DF0000000251C4035287A37494876211C30318F +:103E000002910C23C856421C0A73497B884246DA49 +:103E10003248007880073ED500200190F6F7AFFACF +:103E200000282ED0AC210958002901D0E4303C00F4 +:103E3000A4F1000000E0CC30061C4068002825D02A +:103E40000299087B012811D1201C2E302978F6F721 +:103E5000EDF9716803E07218127A824203D9FF31DA +:103E60000906090EF7D1A97001200190231C3E33E9 +:103E70003C00E0F100001A1D301C00970199F8F792 +:103E800058FA002811D0A8788019007A00E00020A4 +:103E9000687068780121FBF7E0FD6060381C01F074 +:103EA00014FE381C01F0A5FBFEBD0299087BFF3013 +:103EB00048733C001CF20000381CFCF719FC03F0AE +:103EC000C3FD061CFBF78EFE41007618687861681A +:103ED000FBF76AFE3118208D3B1C054A03F012FEE9 +:103EE000E5E7000058E30100308007001D75010080 +:103EF000D54E00003C0058F20000031C044880B579 +:103F000002792030034900F030F880BD0000AC7C1D +:103F10000100C4670100031C044880B5C278383032 +:103F2000034900F022F880BD0000AC7C0100C867A6 +:103F30000100031C04483C0094F2000080B5827923 +:103F40005030034900F014F880BD0000AC7C010043 +:103F5000CC670100031C044880B5427968300349EE +:103F600000F006F880BD0000AC7C0100D0670100C5 +:103F700010B5002484800B603C00D0F20000191CB6 +:103F8000514301601906091610220630F1F79FF916 +:103F900010BDB0B5064D0024AC60EC60EC612C6245 +:103FA00002F0F1FC00F00DF8EC622C70B0BD447D25 +:103FB000010080B580210148F1F73C000CF30000BE +:103FC000C7F880BD04660100F8B5074F002400263D +:103FD00018206043C519EE6003F042FD103501342E +:103FE000022C41C5F4DBF8BDB87D0100002303605D +:103FF000044B002900D1191C4160002A3C0048F301 +:10400000000000D11A1C82607047BD75000010B519 +:10401000074C206801302060202803D958215820FF +:10402000F1F79DFF216801200139884010BD605BD8 +:104030000100B0B50D1C041C2168002000293C00C3 +:1040400084F300000AD0A943216007D1A068F1F7EA +:1040500023F8002802D1216829432160B0BD000067 +:10406000B0B50D1C041C2168002029432160A94221 +:1040700007D16068F1F710F8002802D12168A94340 +:104080003C00C0F300002160B0BD1A4BB0B59A6A85 +:1040900000280BD0002A07DBB8242458013CA41ABE +:1040A0000019B030007B02E00E2000E00D205D6AB8 +:1040B000124C002D01D0207800E0205CFF24A834B1 +:1040C000C4403C00FCF300009C60F524C4409C61AB +:1040D000FD24C440DC61FF242934C4405C61FF241A +:1040E0005334C44000200C3311C3002905D0002AEA +:1040F00003DC0221504200F065FBB0BDAC7E010044 +:10410000B85201003C0038F4000010B5134C1348BD +:10411000211CFF3169310EC90EC0211CFF31242240 +:1041200075310F48F1F751F8211CFF313C229931CC +:104130000D48F1F7A6F8FCF7A2FF211CFF31102271 +:10414000D5310948F1F73C0074F4000041F8211C16 +:10415000FF312822E5310748F1F796F810BD00003D +:1041600040630100008007000C80070030800700DA +:1041700080800700A0800700F8B5002859D004F01F +:104180004BF9F8F7B3FB00223C00B0F4000001212A +:10419000132004F07CF92A492948496C0160002168 +:1041A0002948C9434160264C1434616C8160A16C7C +:1041B000C1600020254D022601016E500A194F19D9 +:1041C000503204370ECA013008283C00ECF40000DD +:1041D0000EC7F4DB1422211CCC311E48F1F75AF82B +:1041E0001D4881780909090181700021C170417061 +:1041F000211CE0310A78027049784170211CE831B5 +:1042000030220830F1F746F8211CFF313C0028F538 +:104210000000502219311248F1F73FF88320800046 +:10422000142221181048F1F738F811204001842297 +:1042300021180D48F1F731F8FFF773FF201CF1F753 +:1042400028FDF8BDFFF76DFFFBE7082007003C00E5 +:1042500064F500002C6301004020070000300700D7 +:104260000040070000500700006007001000070032 +:1042700000900700F8B5051C1848C068002825D034 +:10428000164E013674783078271A7919201CF1F708 +:104290003C00A0F500004BF80090291C201CF1F711 +:1042A000B2F8C119201CF1F742F8601A3070701E84 +:1042B000806800280DD05336F4780099201CF1F75F +:1042C000A2F8B178611A4118201CF1F79CF8601A25 +:1042D000B0703C00DCF5000003485C300169C26846 +:1042E00069435118C160F8BD447D0100B0B50C4D63 +:1042F000E868296940187D2109014418201C03F051 +:104300000BFB00280AD003F0CFFB011B2869F1F753 +:104310007DF801303C0018F600000004000CFFF7A7 +:10432000B2FFB0BD0000A07D010070B5104C606808 +:104330008025A84360602068284320600D4E301C13 +:104340001030F3F7C8FC002803D107218520F1F7CE +:104350002AFE084800213C0054F6000080684163B2 +:10436000C06C10307061012030612068A84320606B +:1043700070BD0000F400070000300700247E01003B +:10438000011C0020052980B509D202A35B5C5B00FB +:104390009F440000030303033C0090F60000030069 +:1043A000FFF7CFFC80BD0122920280B500210720DB +:1043B00004F0ABF980BD80B540220021002004F05C +:1043C000A4F903220021002004F09FF980BD70B5FC +:1043D0000E1C051C141C08280ED13C00CCF6000055 +:1043E00000F000FC0E2801D1142000E01020E103B1 +:1043F00000D50138C0060A49C00E887108E0092DB1 +:1044000006D1A00401D5002000E00120F3F7B0F9A7 +:104410003440211C321C281C04F07AF93C0008F7B7 +:10442000000070BD00000080070070B50024132953 +:1044300011D8002801D1084E0825012801D1074EC6 +:10444000092500F078FA002805D0021C311C281C30 +:10445000FFF7C3FF0124201C70BDF8FF07003C00DC +:1044600044F70000FFFF00000122D20280B50021C6 +:10447000072004F053F980BD0F22120407214904DC +:1044800080B5092004F04AF980BD000080B5002104 +:10449000042004F01BFC4021002004F017FC044918 +:1044A0003C0080F700000020886002480969203045 +:1044B000FFF709FE80BD64730100B0B560210020E4 +:1044C00004F007FC114D002400220420295D04F0B3 +:1044D00028F90C2003F09BFB01342406240E052C44 +:1044E000F2D33C00BCF700000F2200210A2004F0A8 +:1044F0001BF96121002004F0EFFB064901208860D0 +:10450000044809692030FFF7CDFDFF202D30B0BDF4 +:10451000A858010064730100F8B5061C1248C67063 +:104520000120FFF73C00F8F70000FDFB0127BF0268 +:10453000041CB843011C012004F0D1FB0320FFF749 +:10454000F2FB051CB843011C032004F0C8FB301C1F +:1045500000F09FF900F057F8211C012004F0BFFB88 +:10456000291C032004F03C0034F80000BBFB0020B1 +:10457000F8BD00006473010080B5002240210020D6 +:1045800004F0D8F880BD000070B5051C0124092096 +:10459000FFF7CCFB0F210904884303218904E204BF +:1045A000052D124E20D202A33C0070F800005B5D86 +:1045B0005B009F44000006090C100300032109045E +:1045C0000CE00121090409E00121490406E0F36837 +:1045D000042B05D902E0F368042B01D8014301E064 +:1045E0001043011C092004F080FB3C00ACF80000E3 +:1045F000201C70BD0024FBE7647301000121C90584 +:10460000002880B502D00A1C002100E0002204200E +:1046100004F096F880BD0000F0B591B0002640216E +:1046200001A8F0F7DDFD2A4FB87901223C00E8F837 +:104630000000520300900021062004F084F860215D +:10464000002004F058FB6121002004F054FB0820F6 +:1046500003F0EFFA00240F20FFF771FB4005050F70 +:10466000A80001A9095801AA013101340C2C3C0011 +:1046700024F900001150F1D30020810001AA515803 +:10468000B14201D90E1C051C01301028F5D30620BB +:10469000FFF758FB0F2149028843690208430121B3 +:1046A00049030143062004F029FB0D488468643463 +:1046B0003C0060F9000008E0201C03F05AF90028D3 +:1046C00003D001219520F1F798FC0F20FFF73DFB67 +:1046D0000004F1D5872003F0B2FA0098B87111B048 +:1046E000F0BD201007000001070010B5174C6169EC +:1046F00000293C009CF9000004D00A21132003F09B +:1047000047FE10BD011C1248012900780CD0112968 +:10471000F7D1052803D101211320F1F771FC20788E +:104720000728EED102210AE0052807D006280AD082 +:104730000728F7D03C00D8F900000828E4D1002071 +:1047400005E001211320F1F75EFC10BD012002F00D +:104750006CFD10BD00007C7801000D4980B5097822 +:10476000032901D100280BD0072901D1002807D047 +:10477000022901D100283C0014FA000003D10529C8 +:1047800009D1002807D00020FCF728FD00221321C2 +:10479000112003F0C1FE80BD7C78010080B50622A7 +:1047A0000821002003F0DEFF80BD0000074880B52F +:1047B0004069002801D1F1F73C0050FA000033FFB6 +:1047C0000549054A0868506148689061012080BD2C +:1047D000000064730100B058010010000700074892 +:1047E00080B54069002801D1F1F71DFF0549054A50 +:1047F000086890614868506101203C008CFA000014 +:1048000080BD000064730100B05801001000070073 +:1048100011B500AB597814480123C056002209187D +:104820000B061B161321132B02DD00AB597007E09A +:10483000002B02DA00AB5A7002E01C1C3C00C8FAE4 +:10484000000000AB5C7000AB1B7818180006001667 +:10485000132802DD00AB197006E0002802DA00AB75 +:104860001A7001E000AB1870009818BD0000647366 +:10487000010038B50C1C154900AB496813253C00F4 +:1048800004FB00000091597809185970197808182C +:10489000187019881048022CC18001D0002C0BD14F +:1048A00000AB1878132800D91D7000AB19780020D0 +:1048B000FFF7EEFD022C01D0012C09D100AB587896 +:1048C0003C0040FB0000132800D95D7000AB597814 +:1048D0000120FFF7E0FD38BD000064730100A0581F +:1048E000010070470000B0B5041C0E28134D04D021 +:1048F0001249A00000194D3945180620FFF73DFA6E +:104900000F493C007CFB0000E02209191039C97BEB +:104910009043490111400143062004F00DFA291C7F +:104920000520094A03F030FF08481F2200191038FB +:10493000C07BC104D204082003F026FFB0BD0000F4 +:10494000B40900003C00B8FB000014450100FF0F53 +:104950000000C05801007047000080B506490028DB +:1049600001D1086880BD012801D1486880BDF1F7F8 +:1049700090FB002080BD7C730100014840687047B7 +:104980000000A05801003C00F4FB00000448012393 +:104990000449C056C95640180004000C7047000076 +:1049A000A0580100A258010001484068704700006B +:1049B00064730100F8B5051C0E1C00F055F9041CC9 +:1049C00000F058F900282CD03C0030FC0000B30067 +:1049D000601E002D1C4E19491A4A06D10B250E2CBB +:1049E00000D1194AD258085608E0012D1CD19A1856 +:1049F0000436081808250E23126DC056071C4743BD +:104A0000FB00DF19124B3F2158433C006CFC0000B7 +:104A1000114BA9400C1C3818C0181440EC40C011B0 +:104A200060431B0AC018801203D1012004E000205B +:104A3000F8BD3F2800DD3F203060A84008408A4391 +:104A40001043F5E7CC590100DC5801003C00A8FCFC +:104A500000007C7301007C5901000606000026005E +:104A60000200034808B5C08800AB1880009808BD54 +:104A70000000A0580100B0B50B4D094C0E206C6031 +:104A8000FFF78DF90949021CC8600106090E3C00B8 +:104A9000E4FC0000133A022A02D91738042800D88F +:104AA0000021081C6C60B0BD041802006000070003 +:104AB000647301000A4898B502781321142A00D3C0 +:104AC00001704278142A00D34170064C6068FFF7E9 +:104AD0003C0020FD0000BDFE009000AB1888E08087 +:104AE00000F075FF98BDA4580100A05801000348CC +:104AF00080B541780120FFF7E6FC80BD0000A65894 +:104B00000100034880B501780020FFF7DCFC80BD80 +:104B100000003C005CFD0000A6580100B0B5054D4A +:104B20000024201CFFF744F90134102C01C5F8D3F0 +:104B3000B0BD0000D4440100044980B58870044928 +:104B400080000958072004F00FF980BD647301004C +:104B5000D05801003C0098FD0000B0B53F24021C75 +:104B6000002A01D108200B23012A01D109200823A2 +:104B7000251C9D40002900D101213F2900D9211C7D +:104B800099400A1C291CFFF77CFCB0BD000091B5C0 +:104B9000124900AB1A783C00D4FD00000878114C93 +:104BA00080180006000E207049785A788918090686 +:104BB000090E13221328617000D92270132900D91D +:104BC0006270084908480639C98881802178002028 +:104BD000FFF782FC617801203C0010FE0000FFF727 +:104BE0007EFC98BD0000A4580100A6580100647323 +:104BF000010070B51D4D041C28780E1C032803D13C +:104C000002211120F1F735FA201C00F04EF800289F +:104C100025D0287801280AD168683C004CFE0000A5 +:104C2000002807D00121112003F0EEFB0120696864 +:104C3000F0F7BDFA6C706E60201CFFF7C1FC041C1D +:104C400000F0D4FE002C02D06868002802D1F6F7EC +:104C5000D9F870BD012028700122211C3C0088FE7B +:104C60000000112003F09FFB70BD02211120F1F71D +:104C700006FA70BD00009C73010080B5012805D1C3 +:104C8000002904D0012901D1F6F7BFF880BD0549FC +:104C90000878032802D00020087080BD03213C0062 +:104CA000C4FE00001120F1F7EDF980BD9C730100F6 +:104CB00001484078704700009C730100011C0139D5 +:104CC00001200E2900D300207047000010B5134CBE +:104CD000207801280ED1606800280DD00121112014 +:104CE0003C0000FF000003F098FB01206168F0F732 +:104CF00067FA00206060207001E003280ED00021D8 +:104D0000112003F08AFBFFF724FCFFF7C0FB0549E5 +:104D1000087B40084000087303202070012010BD6C +:104D200000003C003CFF00009C730100880007006D +:104D300010B50D4C2078032813D1002020700B48AB +:104D4000017B012211430173FFF770FCFFF718FC90 +:104D5000002806D002212170011C0022112003F03E +:104D60002BFB01203C0078FF000010BD00009C736D +:104D700001008800070080B50549002804D0002004 +:104D8000086003F05AFA80BD0120086080BD805A97 +:104D90000100FEB5051C8035041CA8682979066849 +:104DA000201CA03002293C00B4FF00001CD169790E +:104DB000082901D00C2917D101216162A96809686D +:104DC000098B0182A9690191008AC00605D5606836 +:104DD0000088400501D4012000E000200290052059 +:104DE00001A902F0B7F902E03C00F0FF0000002149 +:104DF00061620182A9681A230A89676A181C002F58 +:104E000000D11820101A0881A8680168626A002A77 +:104E100000D11823C9180160A86841C43088083C33 +:104E2000400403D5201CF7F7BCF93C002C0001001E +:104E3000FEBD0021E1613079C00703D4201CF7F7E3 +:104E400091FEF5E7201CF7F743FFF1E7F7B5051CE6 +:104E50000A30061CF5F7A4FA144F041C3988F2F73F +:104E600083FE328878680280728802303C006800D5 +:104E700001000280B18841806988029A201CFAF7FB +:104E8000CEFE0B4D08356880FBF72BFE0121090390 +:104E90000028288801D0884300E00843288004487F +:104EA000002200211430F2F732FE201CFCF73C00F7 +:104EB000A400010085FAFEBD247B010010B5134C4F +:104EC0001149201CFF3069300EC90EC0201CFF3074 +:104ED000242275300E49F0F717FA201CFF303C22CF +:104EE00099300C49F0F76CFA201CFF301022D530B5 +:104EF0003C00E00001000949F0F709FA201CFF30EE +:104F00002822E5300749F0F75EFA10BD0000008066 +:104F10000700406301000C8007003080070080809C +:104F20000700A0800700B0B500283FD021484168A5 +:104F3000214C3C001C0101006160C168E160016915 +:104F40002161806AA0621E491C48096814384164C6 +:104F50001C48251C3C350FC80FC5201C80224C3036 +:104F60001949F0F733FA1422201CCC301749F0F716 +:104F70002DFA38223C0058010100201CE030154970 +:104F8000F0F727FA201CFF30502219301349F0F7B0 +:104F900020FA83208000142220181049F0F719FA13 +:104FA00011204001842220180E49F0F712FAFFF771 +:104FB0008EFFF8F794FB3C0094010100B0BDFFF7B1 +:104FC00089FFB0BD00100700406301000820070002 +:104FD0004020070000300700004007000050070095 +:104FE0000060070010000700009007000C4980B522 +:104FF000012048600A4814383C00D00101000078C4 +:10500000012804D008489438406F002803D00020BD +:1050100000F01FF880BD08680028FBD00348F2F7B5 +:105020007AFE80BD000098660100FFFF000080B599 +:10503000002809D1F2210F2003F03C000C020100EE +:1050400013FA00220F21F12003F0CCFA80BD0120D9 +:10505000F8F76AFE80BD000010B5041C032000F0C4 +:10506000C9F900210F2003F0FFF9FFF765F80B499C +:1050700000204874FBF7E6FA094800683C00480243 +:105080000100002803DC02214042FFF752FC0448E3 +:1050900014300068002802D0201CF2F742FE10BD38 +:1050A000000084660100D47E0100064980B50978BD +:1050B000042905D0052903D0062901D007293C0081 +:1050C0008402010001D1FEF7BDFD80BD74660100C0 +:1050D00010B5094CE06800280BD107482C38008A2D +:1050E000C00704D5002101206268F9F7C9FA012040 +:1050F000E060012010BD0000F46E01008CB5021CC0 +:105100003C00C0020100081C111CFDF728FF0190A3 +:10511000002805D0172000AB18806846FDF7FFF87F +:105120008CBDF1B52E4CAEB0002525632069012859 +:1051300003D101A801F0A1F84EE00126284F267006 +:10514000503F3C00FC020100B869F8F74FF82549D0 +:105150002C3900281DD0E06A01281AD1088A0F1CBA +:10516000800704D5002102206268F9F78FFA388A97 +:10517000000707D5E068012804D1002108206268F3 +:10518000F9F784FA3C00380301000022182182203C +:10519000266303F036FA25E0088A0E1C800704D542 +:1051A000002102206268F9F774FA308A000707D5F7 +:1051B000E068012804D1002108206268F9F769FA43 +:1051C000308A400704D53C0074030100002200210E +:1051D0000420F9F761FA2E98012804D01E950921C0 +:1051E0001BA8FFF797FFE562BD61E5602FB0F0BD3A +:1051F000F46E010080B50720FEF7A0FE00210F200D +:1052000003F044F90C4801783C00B0030100002988 +:105210000FD00221017088380078002804D0074997 +:105220001031487C01304874F2220F20054903F008 +:10523000FCF800220F21F32003F0E9F980BD746629 +:10524000010080841E0010B5041C3C00EC0301002A +:10525000F2210F2003F020F9012C0AD10848084957 +:1052600000681439002805D0C878022802D1F7F761 +:10527000AFFA10BD002048700520FEF765FE10BD96 +:1052800098660100F8B5284E3021351C3C002804F2 +:10529000010060352889895D884203D10020FFF72D +:1052A000F6FEF8BD341C70340121217041188019BC +:1052B0003030298140781D4F183F3870002808D0C1 +:1052C0000021FBF7C2F9002807D12078FFF73C0046 +:1052D000640401009BFFE7E701210F20F0F71AFFAC +:1052E00014480121803081703869FBF755FA20732A +:1052F00000210F2003F0D6F8707A01280ED10E4855 +:105300000068002804D0387802F0DAFA002805D0C6 +:105310003C00A0040100307F60730320207071897D +:1053200005E005202070A888FAF73BFB011C00224D +:105330000F2003F086F8BAE7000004660100E4627B +:10534000010070B5041C02F06CFC364B191CA03136 +:105350000A783C00DC040100102A02D20A79102AE3 +:1053600001D3012500E00025304ECA798036012C9A +:1053700012D00025022C2ED0042C3CD15C6B002CCA +:1053800039D19C6F001B2A4CA04234D9B268986A6C +:10539000824231D03C00180501004D7234E0B06803 +:1053A0009C6A0222A04221D1586B00281ED1002DF8 +:1053B0001CD1487A192820D03468986F6400001BEB +:1053C00074680019FF301C4C3930A04216D248795D +:1053D0008C79001930283C005405010011D31022AB +:1053E0000FE05C6B012C06D1B0689A6A904200D144 +:1053F0004D72002205E09C6F001B124CA04200D3AE +:10540000202206E04A7A192A01D201324A72202269 +:10541000B06030689B6F98423C009005010004D159 +:10542000002A00D148794A7106E0102A04D370603E +:10543000336048798871F6E7CA7170BD0000A46CCA +:105440000100A304000071020000350C00000548B3 +:1054500080B5817B002905D000213C00CC050100EE +:10546000817303490F2001F00FFF80BD74660100B6 +:10547000E9030100F8B5041C02F0E2FB051C384EFC +:10548000201C3749341CA0341022443901282CD068 +:1054900004284ED1371C743609CE26783C00080605 +:1054A0000100C01A202E04D1304EB04201D900268E +:1054B0004E613E1C3F6C002F48D1776C002F45D1C8 +:1054C000B76A002F3DD0776B002F3AD0274FB842F4 +:1054D00037D26078102806D3F06F181A244B3C009E +:1054E00044060100984201D2E270F5664869062838 +:1054F0002FD201302CE02078202801D106234B61E7 +:1055000002232371B36A002B19D04969032916D9E4 +:10551000716B736D594012D0E178102910D3617806 +:105520003C0080060100331C10290CD3D96F691A86 +:10553000134DA94207D2586C002802D0986C00285D +:1055400000D12271F8BD0228FCD12270FAE7486927 +:10555000002801D0013848610A49F06E401802F075 +:10556000B0FA3C00BC0601000028EED00120E0703B +:1055700006482818F066E8E7A46C0100E204000081 +:105580001A06000053070000002D3101005A620284 +:1055900080B541680979C90713D5C16900290DD0C3 +:1055A000897902293C00F80601000AD10821018608 +:1055B000011C38318162021C06480449F9F7FDFCE0 +:1055C00080BDF7F7DCFB80BDF7F723FB80BDB97129 +:1055D0000000A06A010010B50024002803D002F0EA +:1055E000E8FE002817D03C00340701000C4C0120D5 +:1055F000A0722068002141620A490268C9786032BD +:105600009171218901312181006840308183FBF74C +:1056100031FC20680068FCF7A1F90124201C10BDB2 +:10562000147A01000E6101003C00700701007FB593 +:10563000061C1E481D1C438802881C21002090B0B7 +:10564000F0F745FF03900468FF2101312180082015 +:1056500060800620207104206071C001002D00D1FF +:10566000081CE08001A80230311C3C00AC0701009E +:10567000051CFAF75FFA10496846FAF75BFA201C36 +:1056800008306946FAF756FA291C201C1230FAF73E +:1056900051FA10AB9888002201212083D8886083BA +:1056A0001889E081588920826846F9F73C00E807AC +:1056B000010017FF14B070BD0000146E01001261EC +:1056C0000100B0B5041C1848251C0078603580071F +:1056D000002808DAE879002805D0F4F770FF011CEB +:1056E000201C00F078F929882E20005DF2F73C009C +:1056F000240801009FFAE87900280BD1201C4030D3 +:10570000018B22691180418B22695180808B216934 +:10571000C88207E0012805D1206901220188D20250 +:10572000114301806A7AE0680249F2F753FAB0BD8A +:105730003C00600801001D750100D14F000090B5CC +:10574000041C38230C495843431885B000200A49EB +:105750000290181C012203910949049230304278CA +:1057600009880192009101785A6B0C33201CFBF7D9 +:105770007CF83C009C08010005B090BDD4E4010019 +:105780005D4E0000487B010090B585B0031C0020F1 +:1057900002900A49181C0022049260300391C279D9 +:1057A0000188019200915A6ADC682033997B407A23 +:1057B000231CFBF73C00D80801005DF805B090BD44 +:1057C00000000D4F0000074980B5886A002808D105 +:1057D00001208862F0F7AFFC011C03480022F2F7B9 +:1057E000B8FE80BD00007869010041E40000F0B51A +:1057F0009BB0002820D03C0014090100011C08A81F +:10580000FCF7B2FD01201190032010AD2872042096 +:10581000687205A800226946F4F700FF00240026FC +:1058200005A90020F9F7FCFA6946F9F7F9FA0B9097 +:1058300008A8FCF7BBFD01343C0050090100022C14 +:105840002E72F0DB1BB0F0BD000090B5041C4C23A1 +:105850000C495843431885B000200A4902900022A1 +:1058600004923C200391C25C084841880192412087 +:105870000091C15C5A680833201C3C008C0901006F +:10588000FBF702F805B090BD58E30100754F00002A +:105890003C7C0100F8B50E1C224C3821171C051C5D +:1058A000201CEFF775FD231C2533211C243110200B +:1058B0006A46F9F71DF800AB188807213C00C809B3 +:1058C00001001A4A02382084201C20308170C570E3 +:1058D000111C0673477334312163303262630179DE +:1058E000251C103521812060E5601888401A20832E +:1058F000201C28302061201CF9F711F80D483C00CD +:10590000040A01000068002807D00621201CF8F7CF +:1059100047FD1021281CF8F743FD084802210162C9 +:1059200044620121016206480068EFF7D5FCF8BD2A +:105930008C8E0100E4FE0100CC5C01000030070009 +:105940003C00400A01005C5B0100F0B5061C4036DB +:10595000318B041C251C0807800F6035012885B099 +:105960003BD0E879002805D120690180B08B2169FE +:10597000C88207E0012805D1206901220188D202EE +:1059800011433C007C0A0100018020480078800718 +:1059900026D5E879002823D0A06B00281CD0F4F786 +:1059A0002FFE002809D0B8210958002905D0302140 +:1059B000095DB4300818077A00E000270121381C7F +:1059C000FAF786F93C00B80A010004902069043017 +:1059D000391CF4F76CFD0499FAF7D3F902E0201CA6 +:1059E000F7F7F9FB7083708B216900224880094921 +:1059F0000A48049203910290EA7929880192009161 +:105A0000626AE36820343C00F40A0100A17B687AF2 +:105A1000FAF74CFF05B0F0BD1D750100D14F000035 +:105A2000DD2F0100FEB5041C261C012020360029B4 +:105A300002902ED05820005B0007800F012801D172 +:105A4000CC3100E0B43148683C00300B01000D1C43 +:105A5000002824D0201C6030C2790121012A00D006 +:105A60000021271C626D3037002A04D03A1C281C04 +:105A7000F6F7E7FD07E0427A231C683300923A1CF0 +:105A8000281CF6F79AFD029038783C006C0B010058 +:105A90004019007A0121B073FAF726F901E00020DD +:105AA000B0736062B07B0D2801D9F0F7BBFB0298A0 +:105AB000FEBD0000FFB5041C8030251C5E3500785B +:105AC000AE1DAF1F002883B012D1F4F73C00A80B25 +:105AD0000100C7FB002807D006980599029004989A +:105AE0000190A66167610DE00498069902900598FF +:105AF0000190666105E004A903C90290069801902F +:105B00006761A5610622381CEFF78BFC06223C007A +:105B1000E40B0100281C0299EFF786FC0622301CDA +:105B20000199EFF781FC07B0F0BD0000B0B50D1C86 +:105B3000041C052801D3F0F77BFB0249A00008589C +:105B40008560B0BD107B0100F8B5FFF759F9051C61 +:105B50003C00200C0100FEF7E8FF041C281CFFF7A6 +:105B600058F9002842D0691E214D4A00204B1C3DA7 +:105B7000AE5C985C3040D6180123F6565219D256C6 +:105B8000964201DD151C00E0351C184B2A3B595686 +:105B900051183C005C0C0100B14200DB311C0E1CB2 +:105BA000002826D0FEF7BEFF009000AB18781249FF +:105BB0000023C95600AB1522101A5B78001B401851 +:105BC000D21A121B51180022854202DB00AB1A7058 +:105BD00002E0401B3C00980C010000AB18708E42A4 +:105BE00002DB00AB5A7002E0881B00AB58700098D3 +:105BF000FFF78DF801F0FFF8F8BDE6780100657356 +:105C0000010070B5084E064D00240620604380193F +:105C10000622291CEFF73C00D40C010011FC0134D2 +:105C2000052CF5DB70BD00004E470100E67A01004F +:105C3000034880B501680348FEF742FB80BD0000C1 +:105C4000A8790100C4600100034880B501680348D9 +:105C5000FEF74AFB80BD00003C00100D0100A87952 +:105C60000100C460010010B500280AD0064CA169EB +:105C7000002901D1002000E00968F7F738FBA06196 +:105C800010BD002010BDA46E0100F3B5374883B0ED +:105C9000029080790E1C002701903C004C0D010001 +:105CA0003448354A016A039C031C1B69A14201D098 +:105CB000936100E0536131498A6896423FD02D4894 +:105CC0008E60C1680024251C00292D4809D0002EB3 +:105CD0000BD028480124C06A240300283C00880D0A +:105CE000010006D0012704E0002E01D0051CF9E7D1 +:105CF000041C002F06D0FBF71EFB1F48016822483A +:105D0000FEF7FBFA201C28430ED02A1C211C012080 +:105D100002F021FE2A1C211C022002F01CFE3C0085 +:105D2000C40D01002A1C211C032002F017FE002FC5 +:105D300006D1134801681648FEF7CEFAFAF742FD7D +:105D4000039C002C01D101F0E1FF01A903C9887176 +:105D500001F0DCFF0A4C0A4B443CA1692269083B74 +:105D60003C00000E0100411A002A03D01A685118A5 +:105D7000196002E05A6851185960A061266105B0A7 +:105D8000F0BD20100700A46C010010000700B05700 +:105D9000010000106000847301001CB54C23084909 +:105DA00058433C003C0E01004418201C4030417810 +:105DB0006268009101923F210B5D618F0078626CF7 +:105DC000FAF728F8A0851CBD58E30100B0B5164DC0 +:105DD000A969002925D02C1C3034207A002820D035 +:105DE000002381223C00780E0100182002F089FC7B +:105DF000207AFF300006000E207212D10C482821B4 +:105E00002C38095C2172297A002901D1006A00E04E +:105E1000406AA9698002814203D24900814201D2CD +:105E2000A961B0BDA8613C00B40E0100B0BD01F095 +:105E30001DF9B0BDF46E01007FB5051C04206B4652 +:105E40001B180290002628186A4602A9FCF78AFB54 +:105E5000002806D100AB1879042808D01879032847 +:105E600005D000AB187910213C00F00E010008436A +:105E700004B070BD03A9E868F6F7D3FF002805D089 +:105E80000398202108430006000EF1E703A9002033 +:105E9000F6F7C7FF041C01D10220E9E7E86800AB70 +:105EA0002060009860601879A0763C002C0F0100FB +:105EB000A88C6076E8692061688CA082288C2076A6 +:105EC00069690948814200D9081CA060201C02F0C1 +:105ED000A1FDA168002904D0039AA132082002F094 +:105EE00037FB301CC7E70000A08601003C00680FAC +:105EF0000100FEB5061C40780124062850D3C11EBF +:105F00000320EFF75EFB00900E2849D800200AE03E +:105F10004100091889194A798979511801390E29DE +:105F200000D90024013000998842F1DB002C3C00AC +:105F3000A40F010037D00322B11C1B48EFF7A4FACD +:105F40001A4C1C21201CEFF74DFA002528E06900AF +:105F5000491902918A1953791548435493790F18B6 +:105F60007B70D379BB700723D2560192445C0FE05B +:105F70003C00E00F0100201CFEF77BFF002807D04B +:105F80000C4A600080180121103881730199C17397 +:105F900001342406240E07480299405C79784018A1 +:105FA000A042E8D8013500988542D3DBFEBDE86207 +:105FB00001003C001C100100E6780100EB620100CA +:105FC00001680F2901DD0F2101600168002901DA54 +:105FD0000021016070470000F8B5041C1E48221D16 +:105FE00005680092161C231C0F1CCC332A1C201C95 +:105FF0007030A16D3C005810010000F03EF9009691 +:10600000A16D27200140231CE433201C2A1C5C3096 +:1060100000F033F9134800780E2801D2012585409D +:106020001148A1690078294000070BD4480703D51F +:10603000080701D504203C00941001008143880624 +:1060400003D5480601D520208143231CB4332A1CE4 +:10605000201C3030009600F013F9391C201CF0F79A +:1060600047FCF8BD2C7D0100106701001D75010083 +:10607000B0B5F2F727FCFEF73C00D010010009F99B +:106080000F48002545700E480D4C00885B34A082F7 +:10609000F9F723FD2061A08A002804D00121890599 +:1060A000EFF70DFBE18205480138456001F055FE30 +:1060B000021C231C00210020F4F73C000C110100FD +:1060C00049FDB0BD457D0100F467010070B5161CA7 +:1060D0005A89041C04989207920F00250029A27186 +:1060E00009D00521F9F724FB002801D0C07800E091 +:1060F0000120E07100E0E571E560A6603C00481118 +:10610000010070BD0000FEB5051C0E229C30164932 +:10611000EFF7CFF9291C281C8030883100242F1C70 +:106120006037029101902006000E061CF9F70DFE63 +:10613000002803D001984268029901E0EA6D3C0012 +:1061400084110100391C002A0DD0002003E00B5CF3 +:10615000B34202D801309042F9DB08181038C07BF6 +:1061600029199031087301340E2CDFD3FEBD0000D5 +:10617000CC470100FFB581B0141C101C06220D1C79 +:106180003C00C0110100191C0B9E0A9FEFF797F904 +:106190000622391CA018EFF792F9E6602C60102057 +:1061A00028816E600198E86005B0F0BD000070B510 +:1061B000041C002020615820005D0E1C151CC00727 +:1061C000C0173C00FC1101000130E061216B002987 +:1061D00036D11E490968294332D0A168898A00292D +:1061E0002ED000280BD0201C583000F0F3FD0028E2 +:1061F0001BD0816A026A406A0978007806E0144A76 +:106200003C2311783C0038120100507843439A181F +:106210000432002D03D1022901D0032902D16D21BE +:1062200022610855206900280DD08188002901D1FC +:10623000012070BD8079022805D1221C074907483A +:10624000F8F74BFF02E03C0074120100201CEFF74E +:10625000B5F8002070BD00002861010068610100F0 +:10626000A1DA0000A06A010010B500210020F9F7B2 +:1062700039FEC400F9F754FE2418F9F747FE08491F +:1062800020180988084C40183C00B012010006494B +:10629000098840186061F9F746FE054909884018E9 +:1062A0004000A06110BD0261010004610100D479C9 +:1062B0000100A66901001140081C10B51C1C191C26 +:1062C00008311860F1F731FE60603C00EC1201000B +:1062D00010BD0000F8B5061C22480F1C4168914211 +:1062E00003D000218160C1604260C46815E02820AD +:1062F0001D4960434018051C0622311CEFF770F859 +:10630000002807D1A81D391CF9F710FD3C002813FF +:106310000100002801D00120F8BD01342407240F1A +:10632000124880688442E5D1104C2823A0680F4DA4 +:10633000584340190622311CEFF7D3F8A0682823F0 +:106340005843401906302222391CEFF7CAF83C00A6 +:1063500064130100A06801300007000FA060E1682D +:10636000814203D101310807000FE0600020D6E729 +:10637000EC650100A0F4010010B50021032000F03D +:10638000E5FF054CA068002804D101F007FD616815 +:106390003C00A0130100401A606010BD0000D060F6 +:1063A000010002680A6001607047011C0068002853 +:1063B00001D002680A6070470000FEB5141C1D1C65 +:1063C0000022D24301ABF3F782FF01980026284058 +:1063D00001903C00DC1301000025002720601EE036 +:1063E0000121B9400A1C024018D0884301903906A7 +:1063F000090E7019001902910177081CF9F7C6FC03 +:10640000002806D0301C0019013602993030017086 +:1064100004E0281C3C001814010001350299001901 +:106420000172013701980028DDD17019A061656003 +:10643000E662FEBD0000B0B5144D041C287A0128A8 +:1064400002D10420F6F7ADF9211CA86AF5F721FC6A +:10645000002803D104203C0054140100F6F7A4F9ED +:10646000B0BD02202870288C002800D06081688C84 +:10647000002800D0A081A88C002800D0E081E86925 +:1064800001230204120C201C0249FCF719FFB0BDC5 +:10649000F46E0100A17700003C0090140100F8B5F3 +:1064A000194E051CB069002800D13068FFF73BFC8D +:1064B000154F041C503700280BD06068291C7860E9 +:1064C00001203863201CF5F7EAFB002804D10020E6 +:1064D000F8BD0023FB62FAE700233C00CC14010066 +:1064E0002377F86A002801D10120F862387A012860 +:1064F00007D0F86906490204120C281CFCF7E6FED6 +:1065000001E0FB62B3610120E5E70000A46E010039 +:10651000DD02010070B50D1C041C161C3C000815A2 +:106520000100042C1BD21048834207D258000F49A7 +:10653000EFF7FBF8FF30000A013800E000201F35BC +:10654000EA066107090ED20E11437207520D11437C +:106550000006000A0843064AA100505070BD3C00E6 +:106560004415010001218D20EFF7ACFE70BD000045 +:10657000409C000000803801E8600100094A80006A +:106580001058400940010722024307480368002BC6 +:10659000FCDB42600906016001680029FCDB082081 +:1065A0003C008015010070470000E86001003020C9 +:1065B0000700B0B5041C0D1C0749A00008580028AE +:1065C00003D102218D20EFF780FE291C201CF6F755 +:1065D000A8FAB0BD0000E8600100B0B5041C0D1CB5 +:1065E00007493C00BC150100A0000858002803D151 +:1065F00002218D20EFF76CFE291C201CFFF7C4FF41 +:10660000B0BD0000E8600100F8B50D1C161CF7F7DE +:1066100017F9041C2868404F817800293BD1C178C4 +:10662000002958D13C00F8150100F8F7F8F9228E3E +:10663000618E8A4204D0A16A0918E069814210D9AA +:106640003849321C486B01304863206A01302062AF +:10665000386801303860E0686369291CEEF7D8FEBD +:10666000F8BD013212043C0034160100120C2286DF +:10667000A162B868002834D12C480C2300681B1A8A +:106680009A4207D219239B01AF2292015843101A54 +:10669000814226D30120B86001210C2000F07AFE4F +:1066A0001FE001291DD1C0783C0070160100172899 +:1066B0001AD1A08EE18E884214D3E968096809795D +:1066C00009060FD5606A321C01306062E0686369B8 +:1066D000291CEEF7A3FEE868016808310B2000F0E2 +:1066E0005CFEC3E70130A086A08D3C00AC16010023 +:1066F000E18D884204D103210220EFF7F5FDB8E7D0 +:1067000060684560866000686060F8680130F86025 +:10671000A08D411CA1850028ABD10848B969FDF7BF +:1067200061FE221C0221F12002F064F83C00E81610 +:106730000100A1E70000FC5A0100905C010018571D +:106740000100C460010080B5021C0221F02002F0AB +:1067500054F880BD0000002803D102484178C907E1 +:10676000FCD5704700000400070080B500063C001F +:106770002417010001D1F1F771FE80BD80B5F4F757 +:10678000E5FA80BD80B5F6F7EBF880BD0149002041 +:10679000087470477869010080B5C00703D50249C5 +:1067A000012000F01DFC80BD50C300000006000E5B +:1067B0003C0060170100012880B502D1F6F7E1F92D +:1067C00080BD0028FCD1F1F74CFE80BD000080B5F3 +:1067D000F6F7D7F980BD034980B500200874F6F7B5 +:1067E000FEF980BD00007869010080B50006000E4A +:1067F000F1F73C009C17010071FE80BD10B5012827 +:1068000008D0022803D0032801D0EFF7A7FDF6F740 +:10681000E9F910BD01F0F8FA041CFAF75DFD241A3D +:10682000FAF73EFD084900280BD0486A002808D036 +:10683000064884423C00D817010005D2011B012202 +:10684000072001F0F4FEE5E700204861E2E77869FF +:10685000010050C30000094980B5486900280CD0E8 +:10686000086ACA69801A002807DD002048610121F2 +:10687000072001F010FF3C0014180100F6F7B8F9EA +:1068800080BD00007869010080B500F0E7FB80BDA5 +:1068900080B500F03FFC0020F7F7D4FC80BD00007D +:1068A00080B500F037FCFDF76FFCF5F773FD30F0B5 +:1068B00047FB80BD044880B53C0050180100C16A08 +:1068C000006BF2F7DEFF0120F7F789F880BDA46CBA +:1068D000010010B5F3F741F80D4C002804D0012059 +:1068E000E064F7F7B2FC10BD01210120F3F7E9F8ED +:1068F000FDF74DFC606D002803D03C008C180100B2 +:10690000F3F782F8002801D0F5F74AFD0120F2F7ED +:10691000C1FC10BDA46C0100044880B5C16A006BC5 +:10692000F2F7B2FF0120F7F75DF880BDA46C01001B +:1069300080B500F0F5FBF5F733FDFCF73C00C81817 +:10694000010031FDF9F7CBFF0420F2F7A6FC80BD72 +:106950000000034880B5C16A006BF2F798FF80BD64 +:106960000000A46C010080B500F0DDFB0020F7F70B +:106970003CF830F0EEFA80BD000080B500213C000C +:10698000041901000120FFF719FA0120F2F788FC31 +:1069900080BD000080B500F0C9FBFCF707FD0121B8 +:1069A0000120FFF70BFA0420F2F77AFC80BD00000B +:1069B00080B500220021002000F08AFB80BD00008D +:1069C0003C0040190100034880B5826A012104207F +:1069D00000F081FB80BDD479010080B50022002148 +:1069E000032000F078FB80BD0000034880B5826A78 +:1069F0000121042000F06FFB80BDD479010080B537 +:106A000000223C007C1901000021032000F066FBFD +:106A100080BD0000064880B5816842690069511850 +:106A2000814203D90121012000F058FB80BD000004 +:106A3000D4790100064880B58288816800695118C0 +:106A4000814203D93C00B81901000121022000F065 +:106A500048FB80BD0000D479010010B5084C207BB4 +:106A6000216AF9F79CFAA1694218A0682169801887 +:106A7000884203D90121022000F033FB10BDD479F4 +:106A8000010080B500223C00F41901000021002023 +:106A900000F02AFB80BD00000006000E012880B532 +:106AA00002D1F6F78FF880BD0028FCD1F1F7FAFC8F +:106AB00080BD000080B5F6F785F880BD80B5000682 +:106AC000000EF1F729FD80BD3C00301A0100B0B581 +:106AD00002250228104C0BD1FBF747FC002801D1FE +:106AE000FEF74FFF2570A1680C48FDF7A8FCB0BD6C +:106AF00003280DD108487D231C380069DB0058436A +:106B0000191C40184108022000F03C006C1A0100DA +:106B100091FA2570B0BDF8F731F9B0BD7869010080 +:106B20003463010010B5054CE068002801D1EFF78F +:106B300039FC0220207000F0AFFA10BD7869010026 +:106B4000034880B5826A0121042000F03C00A81AA5 +:106B50000100D3FA80BDD479010080B50022002164 +:106B6000032000F0CAFA80BD000080B50022002199 +:106B7000002000F0C2FA80BD0000034880B54269E1 +:106B80000121012000F0B9FA80BDD47901003C0058 +:106B9000E41A0100064880B58288002A02D001214B +:106BA000022002E000220021002000F0A9FA80BDAE +:106BB000D479010010B5064C207B216AF9F7FEF963 +:106BC000A16942180121022000F09AFA10BD0000CC +:106BD0003C00201B0100D479010080B50022002177 +:106BE000002000F090FA80BD000038B5FAF741FEB1 +:106BF0000020F0F780F8009000AB1C885D88F8F763 +:106C00003CF9002C02D0FDF79EFA02E00120F6F7D5 +:106C10000AFF3C005C1B0100291C201CFCF7B8FC8F +:106C2000002C02D0F5F7E0FB02E0002000F0DCF9D8 +:106C30000320002C00D102200006000EF2F74EFBCC +:106C400038BD0000034880B5826A0121042000F0AD +:106C50005DFA80BD3C00981B0100D479010080B52D +:106C600030F09BF980BD80B500220021032000F0A8 +:106C700050FA80BD0000034880B54269012101201F +:106C800000F047FA80BDD4790100044880B58288BD +:106C9000002A03D001213C00D41B0100022000F097 +:106CA0003BFA80BDD479010010B5064C207B216AE7 +:106CB000F9F790F9A16942180121022000F02CFA9D +:106CC00010BD0000D479010080B5FCF793FB0121D1 +:106CD0000120FFF797F804203C00101C0100F2F798 +:106CE00006FB80BD000080B52FF06BFB00280AD0AA +:106CF0000120F2F7FCFAFAF72AFC002802D104205E +:106D0000F6F75DF880BD03211620EFF732FB80BD5A +:106D10000000024880B50068EEF73C004C1C010002 +:106D2000C5FB80BDD4790100034880B542690121CB +:106D3000012000F0F7F980BDD479010080B530F072 +:106D400035F980BDB0B5184CAA20005D042819D1D2 +:106D50000125E562256301F093F8A0663C00881CDC +:106D6000010001F0FCFDF2F72EFE00280ED00220FB +:106D7000F2F7C3FAA56001F086F864306060FAF7B4 +:106D80008AFD01210120FFF746F8B0BD0120F2F78E +:106D9000B4FA0020A06000210120FFF73CF83C007D +:106DA000C41C0100F2F766FE0028F1D0FAF776FD68 +:106DB000B0BD0000A46C010080B50020EFF7D6FE46 +:106DC00080BD000080B50120EFF7D0FE80BD00003F +:106DD000AC21095C024A09028918C0318160704700 +:106DE0003C00001D01007075010080B5012804D130 +:106DF00003C90968EEF764FB80BD01211420EFF799 +:106E0000C4FA80BD0000002802D1024840687047E3 +:106E10004068704700005875010010B50024F8F76D +:106E20001CFB3C003C1D0100002804D04030807A4F +:106E3000052800D10124201C10BD000004480021B9 +:106E4000406801E0016340680028FBD17047000002 +:106E500058750100B0B5041C0D1CF7F7A5F84034B7 +:106E6000E572B0BD3C00781D0100F8B5071CF8F7CD +:106E7000FAFA041C04D005211420EFF78CFA28E05C +:106E80000025144928024618301C443006221249B5 +:106E9000EEF72DFB002802D1AC208555341C0135BE +:106EA000032DEED3002C3C00B41D010014D0391C7E +:106EB000201CF8F72BF80949002020601839486891 +:106EC0006060002800D004604C60CA68002A03D0CB +:106ED0000121201CEEF7FEFA201CF8BD70750100A0 +:106EE0005846010080B5F8F73C00F01D0100C1FADA +:106EF000002804D106211420EFF753FA80BDF5F7DE +:106F000016FC80BD000080B5F8F7B3FA80BD10B55F +:106F1000094C2188022903D11420EFF742FA04E03A +:106F2000A3688A009850481C20803C002C1E010059 +:106F3000208801380004000C10BD000058750100C5 +:106F40000B1C111C084A80B51288904206D2DA68E0 +:106F5000C0001218142001F0BBFB80BD03211420D7 +:106F6000EFF722FA80BD0000587501003C00681E52 +:106F70000100084A80B51288904206D2C968C00054 +:106F80000918142001F0DBFB80BD04211420EFF769 +:106F90000EFA80BD0000587501000149C8607047B5 +:106FA00000005875010080B506224430EEF73C0021 +:106FB000A41E0100ABFA002801D1012080BD0020F1 +:106FC00080BD00001CB5144C2069002823D0207817 +:106FD0000A2801D000F0FCF8002060610F484079D9 +:106FE000A070002801D0012815D1FDF7EDFE019019 +:106FF0003C00E01E0100FDF782FE009000AB187916 +:107000001978401A187158795978401A58710198AE +:10701000F2F789FE0520207000F0BFF91CBD7C78D6 +:1070200001000C5A010008B5044A009014320020F7 +:10703000024B3C001C1F01000249F1F77DF908BD1D +:107040002C750100B1A80000B0B5002806D00128B9 +:1070500006D0022807D10C4C012507E00B4C04E0B8 +:107060000A4C2A3C01E0084CB634002500F02CFF05 +:107070000749896E3C00581F01000919091AA142ED +:1070800000D900212A1C162001F031FBB0BD71028D +:1070900000000C050000A46C01008CB500AB8E2133 +:1070A0001980FCF738F901906846FBF7A6FA8CBD09 +:1070B0000000BFB5134A3C00941F010001910D1C54 +:1070C000117C8843041C2143081C1074A0070BD5B5 +:1070D0000E4800900120029000F0FCFE0C49401880 +:1070E00003906846F9F76AFFE0070CD5F1F72CFD2D +:1070F000002803D0074885423C00D01F010000D281 +:107100000190064800906846F9F709FFBFBD78690D +:10711000010081EA000010270000A086010075EA46 +:10712000000010B50A4C606900280ED10120606192 +:10713000A1680748FDF7CBF900213C000C200100B5 +:10714000A068F9F7D1FB01220720044901F0D8FA21 +:1071500010BD00007869010034630100983A000016 +:1071600010B50C1C111C064A002B107003D000280F +:1071700002D1F9F7F5FD10BD201CF9F73C004820BD +:10718000010001FE10BDA0790100B0B50A4C051C3C +:10719000E36A201F0133E3620088002906D0A1685A +:1071A00089182161054A00F0FCFE01E000F0CFFEE5 +:1071B0002577B0BD0000D479010055E300003C0004 +:1071C00084200100011C034880B54088FFF7ECFED5 +:1071D00080BD0000987C0100034880B5C168183864 +:1071E0008088FFF7E1FE80BD707C010080B5002142 +:1071F000162001F0BFFA0121162001F0BBFA80BD74 +:107200003C00C020010010B50B4C20780A2810D09B +:10721000012060610A21132001F0AFFA0A2060709A +:107220002070FDF73CFB0120FDF7E9FB0020FAF799 +:10723000C4F910BD00007C78010010B50C4C002092 +:107240000B493C00FC2001002063E062503988615A +:107250002070084838210C38007A08558121182000 +:1072600001F08EFA2069012802D10020F5F73EFBDB +:1072700010BD0000F46E0100B0B51C4C00252C229E +:10728000011D201C3C00382101009AB0EEF739FAAC +:1072900018492C31081C007A8A69002A13D1022867 +:1072A00003D1A068002820D004E000281DD1606828 +:1072B00000281AD0800288610E4869462438006888 +:1072C000EFF7CBFB11E03C00742101000022022803 +:1072D00003D1A068002809D104E0002808D1606823 +:1072E000002803D18A61FFF7B1FF01E080028861C5 +:1072F000281C1AB0B0BD0000C86E0100F8B50C49DA +:10730000022048600B4900053C00B02101000860E4 +:107310000B4FB868F9687C68451A2E1C04E0A06819 +:107320006168EEF709F92468013DF8D27C60F868DD +:107330008019F860F8BD402007000010070044E302 +:107340000100F8B51F4E041C30693C00EC2101001F +:107350000121F9F799FA1D49600040181038817B26 +:107360001B4A5172C07B10741A4F1B4D0E2C0AD150 +:1073700001220221082001F0F3FB0320FF2141310B +:107380003986142108E00222012108203C0028222D +:10739000010001F0E8FB1249022039861021A97191 +:1073A000E8711048114A00191038C07B002803D03A +:1073B00001215173107301E0002050730021201C43 +:1073C000FDF7E5FD3069F9F708FBF8BD00003C006A +:1073D00064220100407C0100764601000C80070019 +:1073E0003080070000800700FF0100005C570100AB +:1073F000D080070010B5154C144A217800201832AF +:1074000005291DD006291BD0072901D0082906D13E +:107410003C00A022010091680520102900DB062015 +:1074200020700120A178002861700BD00020FAF7AD +:10743000DCF800216078F4F73CFA0A221E211320C0 +:1074400001F07FF910BDD16907201029E8DB082081 +:10745000E6E73C00DC2201007C780100B0B50D1CA1 +:10746000011C041C44310020F6F740FA3034002D92 +:1074700007D00EC80EC408C8103808C4F4F7C4F901 +:10748000B0BD1ECC1EC0B0BDF8B5081C111CF4F771 +:1074900087FA084C3C00182301000025084E084FCD +:1074A00006E0306B002803D035632068EEF755F80E +:1074B00038680028F5D0F8BD00005C5B0100E4FEF0 +:1074C0000100845A010080B50006000E00F007F8A4 +:1074D00080BD80B50A1C3C0054230100232101F02B +:1074E0002BFA80BDB0B50D1C041C122803D301215A +:1074F0002320EEF79BFF0649A000085804E012C8BD +:10750000281CEEF72EF8201C0028F8D1B0BD000092 +:10751000685B0100F8B50E1C3C00902301000025BB +:10752000041C122803D301212320EEF782FF134805 +:10753000A700C45908E02068B04203D103212320EA +:10754000EEF777FF251C6468002CF4D10C4A043A4E +:107550001068002801D0416811603C00CC23010074 +:10756000002804D102212320EEF766FFF8BD002198 +:1075700041600660002D01D06860F7E70149C851FD +:10758000F4E70000685B010070B50E1C051C0024C8 +:10759000122803D301212320EEF74EFF3C000824DC +:1075A00001000D4BAA00985804E00168B14204D0D4 +:1075B000041C40680028F8D170BD0028FCD0002CC5 +:1075C000416801D1995000E061600021034A0160E7 +:1075D000043A11684160106070BD685B01003C00B6 +:1075E00044240100F3B581B0002817D00178FF29A9 +:1075F00014D04578441902348027013C2678013D97 +:10760000BE43301CF8F782FC012181400298014002 +:1076100002D03E43301C2070002DEED1FEBD000094 +:107620003C0080240100104B10B55968411A0F2905 +:107630000DDC0E22D243914209DB1A1C926800290C +:1076400001DD002A03DA00290DDA002A0BDC0433FD +:1076500003C3FDF710FD041CFDF713FD002802D045 +:10766000201C3C00BC240100FFF792FE10BD00006E +:1076700018630100F8B5644C071C6078A178884253 +:107680000FD1081CFDF7CEF8E060042060700A22DC +:107690001E21132001F070F800216078F4F724F91E +:1076A000F8BD04283C00F82401006ED1584EFDF7C7 +:1076B000BCF800907178041C0020052921D201A398 +:1076C0005B5C5B009F440B0F141A02005148514948 +:1076D000604341187D20C000EEF787F811E0872055 +:1076E00060434D4902E03C003425010045204D49EE +:1076F0006043401808E04C48CD2109016043401A1E +:1077000002E0462060438238060648480721007997 +:107710003616081A001900906846FEF75FFD381CFF +:10772000FDF72EFB0099424A3C00702501004900FC +:10773000515A48433949041C8878002801D001284F +:107740001ED13549002803D13A480578042002E0CB +:10775000384845780C203049C968491B0818009002 +:107760006846FEF73EFD009833493C00AC25010019 +:1077700040002031085A2A494443C868A84201D928 +:10778000012500E000252E4821184000EEF7A2F860 +:10779000041C002D03D0FDF7C3FA02E03DE0FDF725 +:1077A000F3FA002F02D125480E3801E03C00E8250D +:1077B000010023480A380168611ACB1C01DB032948 +:1077C00000DD04600168A14201D2013104E0A14260 +:1077D00003D9002901D0013901600168381CFDF787 +:1077E000C0FB104C0A2060700A221320A1683C00E4 +:1077F0002426010000F0D2FF606800F0F7FA0028AC +:1078000000D15FE700F0BAFB1149002340180E4990 +:1078100060601E39C856B042F3D00E70311C002093 +:10782000FFF784FE4EE7FFF715FE4BE77C7801007B +:107830003C006026010060D7FFFF608F0100540B01 +:107840000000C90900008EFEFFFF0C5A0100125A09 +:10785000010020A1070040420F0030B50C4BFE2470 +:107860001B880440C0075D076D0FDB08C00F9C42FA +:107870000BD83C009C260100A218043A9A4207D378 +:107880001A1B895C0122AA40114001D00221084341 +:1078900030BD0000FA60010080B5002803D0011C53 +:1078A0001420F5F7FFFA80BDB0B5041CF7F708FD0A +:1078B000134D00283C00D82601001DD1A00716D585 +:1078C00002208443114801222A624068002813D014 +:1078D000F2F751F900280FD10B48E430807A0128E3 +:1078E00000D00022111C0120F2F7A5F904E000F0FD +:1078F0004EFBE861F2F73C00142701006BF9A96A1E +:10790000002902D0201CEDF75CFEB0BD606C0100C8 +:10791000B05701002048B0B58168012904D1007832 +:10792000002801D1FDF772FD1B4D803D2C1C7034E9 +:1079300020780338052818D23C005027010001A305 +:107940001B5C5B009F44041527272700FBF7F1FF12 +:10795000607B011CFF3161730028F7D10420207087 +:10796000A889F8F7DAF9011C00220F2000F025FFA2 +:10797000B0BDEFF7CEFF6A21495B3C008C270100C8 +:1079800088420BD0E889F8F7CBF9011C00230022CC +:107990000F2000F0F7FF07202070B0BDFDF73AFE82 +:1079A000B0BD000084660100F0B585B0041C038002 +:1079B000180C60800D1C5178107809023C00C82713 +:1079C00001004840A080D178907809024840E080CA +:1079D0005179107909024840208168461A491422D9 +:1079E000EDF7E3FE00230020D907C90F8C464200C3 +:1079F0005607760F6146891949006E5C49193C00AB +:107A00000428010049786F4609024E4081007958E8 +:107A10000F4F4900615A01304E403106360A760058 +:107A2000C90D795AF61901277F02F6193688714077 +:107A3000A65A8919A1520528DCDB2089C018013318 +:107A40003C0040280100082B2081D2DB05B0F0BDAE +:107A50000000D8560100D8520100F0B5051C0C1CDE +:107A60001E1C002089B04100535A013006AF7B52E2 +:107A70000528F8DB108900AB3A498019588468461C +:107A800018223C007C280100EDF798FE0020410000 +:107A90000A195278635C6F46120253408200BA584A +:107AA00006AF5200BA5A314F013053401A061B0A32 +:107AB0005B00D20DBA5ADB1901277F02DB191B8844 +:107AC0005A4006AB3C00B82801005B5AD21806ABFE +:107AD0005A520628DEDB617B207B00AB090248405E +:107AE000598C48404108C0034840198B40181883FE +:107AF000E17BA07B09024840198B48404108C00344 +:107B00004840598B40183C00F4280100588302205B +:107B1000410006AA8A18203AD28B01305308D203BA +:107B20005A4006AB5B5AD21806AB5A520628EFDB16 +:107B3000300A28707004400E202108436870AE702F +:107B40006178207800AB09023C00302901004840F0 +:107B5000598C4840C005000EE8700020410006AA7C +:107B6000535A4A190130137106AB595A090A517117 +:107B70000628F3DB09B0F0BD0000EC560100D85236 +:107B80000100F0B54668051C60303C006C2901001E +:107B900085B0049060E068680C2107690020EEF76A +:107BA0002DFE7061018904390904090C0181706995 +:107BB000006840180421EEF721FEF0617069202171 +:107BC000046804980422407B800108433C00A829F3 +:107BD0000100E07028694089A07028694089000A86 +:107BE000207029690C31A018EDF79BFD2078202129 +:107BF0004006400E0843607028690A300188013150 +:107C00000904090C018004D128690C3001683C008A +:107C1000E4290100013101603562617920790902AE +:107C20004018A17909044018E17909064318009326 +:107C3000A0782178090240180404240C1020EEF7E3 +:107C400013FFB06128693A1C0168009B01A80A3241 +:107C50003C00202A0100FFF7C8FE2869231C0168A8 +:107C6000B06901AAFFF711FF3668002E9CD10349C5 +:107C700004486A68F7F763FB05B0F0BD0000FD6BD0 +:107C80000000A06A0100013807494000095C002992 +:107C900006D03C005C2A010004491C39085C00281D +:107CA00001D001207047002070470000E6780100F5 +:107CB000FEB5051C002002901348171C00680C1C20 +:107CC0008678301CFDF728FA002801D10298FEBD05 +:107CD000002D08D13C00982A0100206800AB1871E3 +:107CE00060685871A068987103203880291C301C86 +:107CF00001AA00F00EF8002DECD000AB197921603C +:107D0000597961609979A1600C213980E2E7F86BBB +:107D10000100F8B5151C3C00D42A0100421E0138B0 +:107D200047003F181F483E18002906D001240322AF +:107D3000311C281CEDF704FD32E06878012400288E +:107D400005D02978081801380E2800D90024002C05 +:107D500026D0002A07D12A213C00102B010012480E +:107D6000EDF79FFC1C211148EDF79BFC0F48032207 +:107D7000291C301CEDF7E7FC0C487178C05DB27827 +:107D800000290ED0002A0CD001224318084D06E02D +:107D90004100491910398A73B7783C004C2B010017 +:107DA0000130CF738342F6D8FEF760F8201CF8BD8F +:107DB000EB620100CA78010070B5051C1C48002365 +:107DC000C056431C32D1A87AF8F70CF900260028D7 +:107DD000184C08D0E869E16B00290BD13C00882BD6 +:107DE000010066630121E163A66306E0A869E16B17 +:107DF000002902D06663A663E663A16B0131A1632B +:107E0000820301D50E4A1043E26B002A00D04042A3 +:107E1000626B1018606308290BD1002801DD3C005B +:107E2000C42B0100012003E0002803DA0020C04336 +:107E3000EFF762FE6663A66370BD0000F46B01009D +:107E4000846A01000000FEFF0C21054A41438918A5 +:107E500080B58978002901D1F3F7F2FA80BD0000DE +:107E60003C00002C0100607B010080B5011C00205B +:107E7000F7F703FA80BD80B5011C0120F7F7FDF983 +:107E800080BD02498968401AC00F70470000000198 +:107E9000070002498968081AC017013070470001BD +:107EA00007003C003C2C010005494A6801231A43A5 +:107EB0004A608A681018886048689843486070472C +:107EC0000001070010B5154B00210A019A58002A3D +:107ED00017D101240A019C50D21810730023537348 +:107EE000022301283C00782C01000E4A05D1C8006D +:107EF0008018103002789A4304E0C80080181030CF +:107F000002781A43027002E001310829E0DB0829F7 +:107F100004D101219920EEF7FEFA03490804000C70 +:107F200010BDAC7301003C00B42C010000600700E0 +:107F3000FFFF0000F7B5194F194E0C1CC100C919FD +:107F4000B268103181B0013A4A600B781D1C0D22D5 +:107F500093430B70012282403A73124B0001039A43 +:107F6000C0188260104A101C3C00F02C0100203028 +:107F7000877900AB1F70C0795870B0680330002358 +:107F8000261A01D5041C01234C600D70002B04D06F +:107F9000201CFFF78AFF0028FAD000AB1888D08495 +:107FA000FFBD00600700000107003C002C2D010010 +:107FB000AC7301000010070030B50020C0430B4C2B +:107FC000094B0022D10009190D7CED0707D549693D +:107FD0009D68491B00D50021814200D2081C013256 +:107FE000082AEFDB30BD0000000107003C00682DCF +:107FF000010000600700B0B508280BD2084D04014D +:108000002959002904D000F04AF800202851B0BDB9 +:10801000022100E003219920EEF789FAB0BDAC738C +:108020000100034900014018417B082211433C0034 +:10803000A42D010041737047AC73010001488068B2 +:10804000704700000001070070B50B4E094D00227B +:10805000D0008419207CC00707D56069FFF726FF90 +:10806000002802D0A868323060610132082AEFDBB4 +:108070003C00E02D010070BD000000010700006021 +:108080000700024AC00080180174704700000060B9 +:1080900007000449C0004118087C0823021C9A43C9 +:1080A0000A74704700000060070070B5082817D2F6 +:1080B0000E493C001C2E01008A680E4D013AC10099 +:1080C00049194A610C4B9A7910310C780D26B4434A +:1080D0000C700121814029739A71094A07490001F6 +:1080E0008018416070BD05219920EEF729FA70BD16 +:1080F000000107003C00582E01000060070020101E +:108100000700D1750000AC730100F8B59E461A4B0C +:1081100094469B681A4CC2001219013B5361151C0E +:10812000184CA6792A1C103213780D27BB43137004 +:108130000127124B87403C00942E01001F73A6714B +:10814000124E0001801963464360734683601378C2 +:10815000407BA679012718433843143500AB1E70C5 +:10816000E4795C70064B9B680333CC1A00D5191C6C +:108170002960107000AB18883C00D02E0100034C21 +:10818000203CE084F8BD00010700006007002010DB +:108190000700AC73010000B5011CFFF75EFF421839 +:1081A000101CFFF792FE0028FAD000BD0000891ACB +:1081B000401A9918884201D801203C000C2F010078 +:1081C0007047002070470000F8B50F1C041C002801 +:1081D00001D1EEF7EFF9211C0120FFF719FA412038 +:1081E000005D002801D1002504E0022801D1052509 +:1081F00000E00125E068EEF729FBA66B3C00482F64 +:108200000100002E10D0002F06D02F20025D206A22 +:10821000416B281CEDF744FAA069002801D0EEF765 +:1082200046FC206AEEF743FC201CEEF740FC301CB5 +:10823000F8BDB0B5041CC06B002809D020693C0013 +:10824000842F0100008BEEF755F9002803D0211C84 +:108250000620FFF7E3F9084D201CA96DFFF7BAFFD0 +:10826000002807D0E8680130E860286A01382862F1 +:10827000FCF778F8B0BD0000C469010010B5064CE9 +:108280003C00C02F0100E16DFFF7A7FF002804D0DC +:10829000E0690138E061FCF768F810BD0000C469CE +:1082A00001000C230C495843401810B54468A168DC +:1082B000002902D0201CEDF7F3F9E06B002808D06C +:1082C00020693C00FC2F0100008BEEF719F9002813 +:1082D00002D0201CF9F726F910BD0000607B0100D8 +:1082E000F8B522494868800006D40120400708609C +:1082F0004A69920000D448601D4F787EC306012071 +:10830000021CDB0E3C00383001009A400A6079699B +:108310008C688C602107890F09D0210704D50B21B7 +:108320009E20EEF728F900E078640C208443124880 +:108330003D68065D6C682C3406E0A0680068A060AB +:10834000E968281CEDF73C0074300100B2F9013EE9 +:10835000F6D2A068806800280DD0408900280AD095 +:10836000786C002807D178698068800703D10C21D8 +:108370009E20EEF703F9F8BD00100700CC6D010058 +:10838000B4440100094980B53C00B0300100087ECA +:10839000C206D20E01209040074A106000200A69F0 +:1083A000C04390600868243106C90369EDF786F977 +:1083B00080BDCC6D010000100700F8B54468061CB4 +:1083C0002C3420680D1C806800903C00EC300100CB +:1083D000002800D0C5602068006820604068002840 +:1083E00003D00A219E20EEF7CFF820684560281CB4 +:1083F00002E000224260081CC1680029F9D17168BE +:1084000060270B1C40339C469B78CA7E3C00283179 +:1084100001005B011207120F3B401A438B8FFF27AD +:108420003F041B043B401A4390231A4342606346B7 +:108430009A780132D207D20F9A70896BC160216895 +:1084400088600098002801D00098C5600A4F3C0061 +:1084500064310100BD79A06900280CD00022A2611E +:1084600074686069EFF72EFFE06A616940684860F0 +:10847000616901200860BD71F8BD0000201007008F +:10848000FEB544680F1C01942C34201C123002905D +:108490003C00A03101002CE00C20EEF700FB051C95 +:1084A000606800281DD10298002100900020EEF79E +:1084B0000EFA061C00980421EEF709FA011C019837 +:1084C000C07E0007000FD03070600198C07E0007AA +:1084D000000F3C00DC310100F0304860301CEEF74A +:1084E00019F96560E66001E0206805606068286051 +:1084F000256000206860A860381CFF300006000E70 +:10850000391C071C0029CAD16068A060FEBD0000AC +:10851000FFB5051C3C0018320100081C002681B084 +:10852000F4F72FFE041C02D06068FF2801D1062654 +:1085300028E0211C20310A78012A01D1032621E0FC +:10854000012725600F7011C51D48083D686103981B +:108550006A46E86004983C005432010028611A48D9 +:10856000A8611A48E8611A4828621A486862207EA1 +:10857000A168EDF7B3FE002806D1607EE1686A4687 +:10858000EDF7ACFE002807D00426311C9E20EEF744 +:108590000DF8301C05B0F0BD3C00903201006A4679 +:1085A0000F491D20EDF79DFE01210D48490701608F +:1085B000227E3B1CD206D20E93404360627ED206DE +:1085C000D20E974047604160E6E731330100D9326F +:1085D000010091310100DD3001003C00CC3201008E +:1085E000FD320100713301000010070042682C3297 +:1085F000506843680B6081684B890B818368002158 +:10860000D9604160816000685060002070470000C0 +:1086100070B54268FF269187106B0C043C0008334C +:108620000100051C3604344043685968B1432143B6 +:1086300059600068A842F7D1106B516940684860E2 +:1086400051690120086070BD0000B0B54368081C86 +:1086500059629A6200250AE04581C4682A1C3C00E0 +:1086600044330100002C03D19A7E1207120F1032FE +:108670004260201C0028F2D118694160196901206C +:10868000086002480068EDF737F8B0BD5C5B010098 +:1086900001200549400780B58860044801680D2025 +:1086A0003C0080330100FEF7E6FF80BD00000010B3 +:1086B0000700C4600100F8B50E4F0C4E002448209E +:1086C0006043C5194821281CEDF77BF81C20604346 +:1086D0008119281D1C22EDF7FEF81C23E8560549D8 +:1086E000FBF73C00BC330100CDF80134012CE9D389 +:1086F000F8BD0000B8440100CC6D01001532010046 +:10870000FFB5051C0A30061C81B0F2F7DDF8184FE2 +:10871000041C3988EFF7BCFC3288786802807288C4 +:10872000023002803C00F8330100B188124E4180D3 +:10873000288808364005002805DA6988039A201C35 +:10874000F7F701FD00E000207080F8F75EFC0121E2 +:1087500009030028308801D0884300E008433080B6 +:108760000548002200213C00343401001430EFF7AA +:1087700065FC201CF9F774F805B0F0BDB07A010073 +:1087800010B50E4C6068F8F795F92068006A00286B +:1087900013D1F8F7BFFC002808D021680120086237 +:1087A0001F210022832000F03C00703401009FF95B +:1087B00002E06068F8F721FAFFF797FC216808618A +:1087C00010BD147A0100FEB51B4E0F1C1D1C141C9D +:1087D000B060081CF7F72BFFB08034733562381C8B +:1087E00001AA02A9F7F725FF00AB3C00AC34010059 +:1087F000187A012818D118790B2808D1307F242342 +:108800000F49584340188068ECF788FFFEBD00AB65 +:1088100018790A2808D1F7F739FD071C291C201CF4 +:10882000F7F716FD3818B080307F24233C00E83479 +:1088300001000449584340184068ECF772FFE8E72C +:108840000000D479010094460100B0B5FFF753FC55 +:10885000041CFBF7FCFA0C4D29680969091B0C1A6A +:1088600002211F2000F08BF8142C06DD02223C00B0 +:1088700024350100211C1F2000F050F80120B0BD5C +:1088800029680120896A0029F9D00020B0BD0000C4 +:10889000147A0100F8B51A4D071CAE790121194C64 +:1088A00000202268002A14D1AE71A268D06806CADE +:1088B0003C0060350100ECF73CFFAE790021134A23 +:1088C000506901305061A0688068A0606268904281 +:1088D00006D10120206003E001300C340328E3DBE3 +:1088E000002F08D100290AD00A484068002806D085 +:1088F000FAF73C009C350100F5FF03E0012F03D09F +:10890000002901D1AE71CEE7AE71F8BD201007008D +:1089100018D90100A8600100705D010080B5012335 +:10892000F5F77CF880BD000080B50023F5F776F8F8 +:1089300080BD00003C00D8350100F8B5134B002481 +:108940001B8898421BD2114BC000C01845680668AE +:108950002868002817D10E4FA8684368B34209D190 +:10896000C3688B4206D10368934201D0531C01D1E6 +:108970000124476080683C00143601006B68834224 +:10898000EED103E001218020EDF740FE201CF8BD70 +:1089900056570100845D010029E30000F8B5174F28 +:1089A0000A1CBE79164D00236C6807E021689142CD +:1089B00002D12179814204D03C0050360100231CB1 +:1089C000E468002CF5D117E0002C15D0002B0DD158 +:1089D000E3680D486B600088002B02D1FFF7D1FBE4 +:1089E00006E00A4A9968FFF7F6FB01E0E068D86004 +:1089F0002868E0602C6002E001213C008C36010018 +:108A0000FFF7A4FFBE71F8BD201007007C5D0100D8 +:108A10002C7401002138010070B5094EB579F9F7C1 +:108A2000AFFE041C09D0201CEDF70CFB05498A6839 +:108A300080188860086801300860B5713C00C8364D +:108A40000100201C70BD20100700A860010009482B +:108A500080B54068021C0BE00169002907D0824202 +:108A600004D0816805480088FFF7E5FA80BDC0683A +:108A70000028F1D180BD7C5D01002C7401003C0018 +:108A800004370100054880B54268002A04D0044834 +:108A900000889168FFF7D2FA80BD00007C5D01007C +:108AA0002C74010005480168002904D0C068002822 +:108AB00001D00120704700207047000018D9010044 +:108AC0003C004037010080B5F6F7D1FA80BD131C99 +:108AD0000D4AB0B5128890420FD203290DD20A4A2E +:108AE000C00014580A4DAC4207D113500C2359430F +:108AF000084BC91880184160B0BD02218020EDF7F5 +:108B000094FD3C007C370100B0BD000056570100C9 +:108B1000845D010009A0000018D90100F8B50F1C00 +:108B20001E1C151C041C111CFFF74AFF331C2A1CB9 +:108B3000391C201CF4F78AFFF8BD0000F7B59446F5 +:108B4000FF2921D03C00B837010015480088814238 +:108B500021D2144A154EC8008518B4796868026895 +:108B6000002A03D1031D0CCB9A4211D043689A68A6 +:108B700042600E4A176901371761B4710022026022 +:108B80000098D86060463C00F43701001860197402 +:108B900028685860FEBDB471062100E007218020DE +:108BA000EDF74CFDF6E7000056570100845D01002B +:108BB00020100700A8600100B0B5144D6C68002CAF +:108BC00001D0844204D00C213C00303801008020C8 +:108BD000EDF737FDB0BDFFF7B8FAA168401A0D49AF +:108BE000884203DA10218020EDF72BFD21792268DD +:108BF0000120FFF7ACFFE3686B60002B05D007484E +:108C0000064A00889968FFF7FEFA3C006C380100BC +:108C10002868E0602C60B0BD7C5D010018FCFFFF9F +:108C2000213801002C740100B0B5154C0820211C1E +:108C300080310870134A4104116013480068134DD5 +:108C40006B69184001D1102000E000203C00A838DA +:108C50000100A8235B5D1843231C40331873516047 +:108C600020788008800020700020FFF712FBFFF7BB +:108C700072FA643028660138A06120780321084325 +:108C80002070B0BD000000900700001007003C00FD +:108C9000E438010010000700A46C010038B50A4C4C +:108CA000211C20318A7900AB1A70C979074D59709F +:108CB0006978884203D1F8F713FCFF20687000AB95 +:108CC0001888E08438BD0000001007004C7B0100CC +:108CD0003C0020390100F8B50B1C061C041D7F3335 +:108CE00014D033685D18356023881F180623FF569B +:108CF000EB1B336023881818817120880130000431 +:108D0000000C2080904201D300202080101C31688C +:108D1000ECF73C005C3901006DFEF8BD0E490A7CA1 +:108D200083781A430A74427883789A430B7C93437E +:108D30000B748A7C43781A438A748A7C03789A433A +:108D40008A74027843781A434B7C1A434A744A7CEB +:108D5000C07882433C00983901004A747047100083 +:108D60000700B0B5064D00242006000EEDF7F7F819 +:108D7000A100695808710134042CF5DBB0BD107BEB +:108D800001000B480C497D234269DB00002AC86BB7 +:108D900007D0C0181A013C00D43901009042C863C2 +:108DA00001D90748C8637047FF38F538C86398424F +:108DB000F9D2CB6370470000F4680100447D0100E4 +:108DC0007017000070B50D1C041C161CFBF7F6FA9A +:108DD000B0432843011C201C3C00103A010000F065 +:108DE000CCFA70BD000080B50B4A002909D00229D9 +:108DF0000FD1011C0848D2783830FFF778FF0649B8 +:108E000006E0011C044812792030FFF770FF034987 +:108E1000086080BD0000AC7C01003C004C3A0100C1 +:108E2000C8670100C467010080B50B4A002909D05A +:108E300002290FD1011C084852796830FFF75AFF08 +:108E4000064906E0011C044892795030FFF752FFB2 +:108E50000349086080BD0000AC7C01003C00883AFA +:108E60000100D0670100CC67010008B50421009122 +:108E7000817E4368032906D1011C0C3101206A461A +:108E8000ECF79AFC08BD1968C160FBE7000010B55B +:108E9000031C0020084C0021CA00121992783C00E3 +:108EA000C43A01009A4203D1C8000019406810BDBD +:108EB0000131090609160629F1DB10BDCC5A010063 +:108EC000F8B50F1C161C0025FEF78EF9041C0AD0FD +:108ED0004A20005D052806D1381CF1F781FE0028E4 +:108EE0003C00003B010001D001253460281CF8BD86 +:108EF000000070B50D1C161C0024FEF778F9002840 +:108F00000BD04A21095C052907D10169002904D148 +:108F10003060F1F704FD01242860201C70BDF8B515 +:108F2000061C3C003C3B010000250C1C081CF1F712 +:108F30005DFE002801D0002105E0201CF1F774FE41 +:108F4000002814D00121301CF4F780FB0090002889 +:108F50000DD0084F01250622311C381CECF7C2FC4D +:108F60000622211C3C00783B0100B818ECF7BDFC40 +:108F70000098F860281CF8BD0000707C01000021FA +:108F8000002806D04278072A03D1C079012800D1F1 +:108F90000121081C7047F8B5051C0027164EF1F793 +:108FA00028FE002807D03C00B43B0100F1F7C0FBCD +:108FB000002810D10024F1F7BBFC06E0F1F702FE17 +:108FC000002808D00124F1F799FD011C0622301C6D +:108FD000ECF78EFC0127002F0DD0211C281CF4F784 +:108FE0003BFB011C054806223C00F03B0100063813 +:108FF000C160291CECF77FFC0120F8BD0020FCE7D4 +:109000000000767C0100F0B5071C006802210468AE +:10901000786987B00140002500290591744E12D06F +:1090200022880121130502D4C0073C002C3C01001A +:10903000C11701316F480029006801D0013004E0F8 +:109040001106890E2D2901D1033030602088800758 +:1090500067D17869C00764D503AA04A9201CF7F773 +:109060004BFB00AB187C002807D0187C3C00683C08 +:109070000100022858D1187B4007400F042853D81C +:1090800020790599C007C01701300290002902D14C +:109090000298002848D10599002904D020880005AD +:1090A00001D400203060C020EDF7CBFD051C3C0052 +:1090B000A43C0100201C0A300690FEF7ADF8061C07 +:1090C000281C08302388021D111DDB0506D5069BD0 +:1090D0000360201C10301060201D0EE0231D136063 +:1090E0002288920505D5221C10320260069B0B6077 +:1090F0003C00E03C010004E0069B0360201C1030B3 +:1091000008602869F1F743FC002808D0012812D034 +:10911000022858D100AB187C002854D112E000ABD3 +:10912000187C02280BD1002E4DD04B20805D0228E8 +:1091300049D13C001C3D010007E063E000AB187C16 +:10914000002802D1381CFEF71BFF2088410430485C +:1091500011D5002E52D000AB197C002926D00299DF +:10916000002902D0B06A007800E0007801281DD004 +:10917000032843D13C00583D01001AE000AB197CA4 +:10918000022916D1197B042913D0197B0C2910D080 +:109190002249096800290CD0002E0AD00299002922 +:1091A00002D0B06A007800E00078012829D00328B6 +:1091B00027D02822391C3C00943D0100281C88300F +:1091C000ECF70AFC00AB197C281C80300171197B7C +:1091D00041716C606E611BE00599002914D0114843 +:1091E000846C002C10D00022002E04D04036B07ABF +:1091F000052800D1012200923C00D03D0100F87A00 +:10920000BA7A2969C307DB0F0698ECF700FB281C24 +:10921000EDF707FD0025281C07B0F0BD0000C46A6B +:1092200001006861010028610100C469010080B586 +:109230000220FFF770F880BD00003C000C3E0100EA +:10924000B0B51D4D012817D0A22806D0A32803D100 +:1092500001211520FFF708FCB0BD002901D11748F6 +:1092600002E07D20C000484300230122011C286049 +:109270001520FFF7A7FCB0BD012904D03C00483EF3 +:1092800001000229FAD100F02AF8B0BD6C68F5F7A8 +:10929000DEFCFEF7A8FF6860002C09D029680A23CD +:1092A0005943001B884203D901211520EDF717FA15 +:1092B000012215202968FFF7A6FBB0BD00003C0085 +:1092C000843E0100047901000087930301200449D2 +:1092D000400380B5086003211520EDF703FA80BD37 +:1092E00000100700074880B5BE210173017A1022E3 +:1092F000114301720023022215200349FFF768FC85 +:109300003C00C03E010080BD000000030700809FBC +:10931000D50080B5002803D00A1C1521A22002E048 +:1093200000221521A320FFF766FC80BD000010B5C8 +:1093300000F019F80A48BE210173037A1022934302 +:1093400001243C00FC3E0100234303720173017AB7 +:109350009143202211430172022215200249FFF796 +:109360005BFB10BD00030700809FD50080B5022184 +:109370001520FFF785FB0448BE210173017A1122F5 +:10938000914301723C00383F010080BD00000003A2 +:109390000700F8B5061C051C60360027446822E06B +:1093A00008210020EDF741FB6061018904390904BF +:1093B000090C01816069006840180421EDF735FB54 +:1093C000E0616069717B3C00743F010000688901C5 +:1093D000C17029690C310322ECF7BAFA28690C3004 +:1093E0000168013101602562A7612468002CDAD18F +:1093F000024903486A68F6F7B3F8F8BDFD6B000050 +:10940000A06A010080B500073C00B03F01000009E0 +:109410000902090A084302490860FFF720FF80BDDE +:1094200000006000070008001400C8000000E80306 +:10943000000010001400C8000000E80300001C0039 +:109440001400C8000000E80300003C00EC3F0100ED +:109450002401070032000000E8030000400601007C +:109460000600000007000000416E62697E64616FC3 +:109470006F00000052656C6561736520365F375F71 +:109480003135204275696C6420323A353C00284001 +:1094900001003239382053657020303420323030AA +:1094A000392031373A31333A3230202848573D3469 +:1094B0003A332C4254434F455829000000003200F3 +:1094C0001C00102030405060FFFFFFFFFFFF3C00FA +:1094D00064400100000000000100000001000000E5 +:1094E00000000000E8037000000000000100000020 +:1094F0000000000002000000D0073800000000005B +:109500000100000001000000040000007C151500AF +:109510003C00A0400100000000000100000001002C +:1095200000000B00000070171E0001000000010089 +:109530000000000000000C000000282316000100BD +:109540000000010000000000000012000000F82AE6 +:109550000B003C00DC4001000000000001000000A6 +:109560000100000016000000E02E120001000000C3 +:1095700001000000000000001800000050460E002E +:1095800001000000010000000000000024000000B5 +:10959000F05508003C0018410100010000000000E7 +:1095A0000000010000002C000000C05D0E00010062 +:1095B0000000010000000000000030000000E88012 +:1095C0000400010000000000000001000000420053 +:1095D0000000A08C0A003C00544101000100000082 +:1095E00001000000000000004800000080BB0A00ED +:1095F0000100000001000000000000006000000009 +:10960000F0D20A000100000001000000000000008C +:109610006C000000C00090003C0090410100C000C0 +:109620009000C00090001400100014001000C00052 +:1096300090001400100014001000C00090001400EE +:109640001000C0009000140010001400100014005E +:109650001000C0009000600048003C00CC410100B8 +:109660006000480014001000140010006000480062 +:1096700014001000140010006000480014001000D6 +:1096800060004800140010001400100014001000C6 +:10969000020004010B020C03120416053C000842F0 +:1096A00001001806000E000E2407000E2C083009D9 +:1096B000000E000E000E420A000E480B000E000EB7 +:1096C000000E000E000E600C000E000E6C0D00006F +:1096D00000000000000000000080C0FFFFFF3C0011 +:1096E00044420100B6FFFFFFD3FFFFFFC9FFFFFFAA +:1096F000FFFFFF7F000000000000000000000000EE +:1097000000000000000000000000000051B0000058 +:109710000C00000051B000000C00000059AF000028 +:109720003C008042010000000000A5AF00000000E6 +:1097300000004DAF00000600000000000000000027 +:10974000000045B00000060000000000000000001E +:109750000000D5AF000000000000ADB00000000028 +:1097600000003C00BC42010095DB0000000000004E +:1097700095DB00000000000099B000000C00000024 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A000000000003C00F8420100000000002D17FE +:1097B00001003517010021170100D99C000049174D +:1097C00001003D170100D19C0000D19C00001D1A32 +:1097D0000100D19C0000011A0100311A0100251A74 +:1097E00001003D1701003C0034430100811A0100D3 +:1097F000D19C000079170100D99C00005D17010081 +:10980000A11701009517010081170100211801001F +:10981000F5170100000008000C000000100008000F +:1098200008000000010000003C007043010002003D +:109830000000040000000800000010000000191CD7 +:1098400001008941000089410000854100008541F7 +:1098500000008541000085410000894100008541EC +:10986000000085410000351B01003C00AC430100B5 +:109870009D1B0100011C010089410000894100007D +:109880008941000085410000651801002918010088 +:1098900039180100BD180100894100004D18010070 +:1098A000A518010085410000011901003C00E843B2 +:1098B0000100D9180100ED180100151901008941B6 +:1098C0000000894100008941000085410000894174 +:1098D000000089410000691C010089410000711CE1 +:1098E00001008941000089410000FDDB00003C00CF +:1098F000244401001D7C000000008000F5DA000017 +:1099000014008100FDDD000008008200C5DD0000BC +:109910003800830045DC00001000840099DC000062 +:109920000C00860039DC00001000880011DE000009 +:109930003C006044010010008A0035DD00000C008E +:109940008C00ADDF00001C008E00C9DE0000380076 +:109950008F00EDDC00003800900075DF00000C0087 +:1099600091008DDC00000C009300B9DD00000C00BC +:1099700094003C009C44010000080808100C0C0CEA +:10998000080C080C080C0808080814080814003013 +:109990000001010200000000AD300100153001009F +:1099A00020300700303007000607020300000000E7 +:1099B000000000003C00D8440100FFFFFF00FFFF53 +:1099C000FF00FFFFFF000000000080C90200943F7D +:1099D0000300E08B5A00053A8500C8F20600F84CF7 +:1099E000560020A73D00B74A0000B74A000000001B +:1099F0000000000000003C001445010001010102CC +:109A00000202030303040404050600002D7C000089 +:109A10000000FF00FD9500000800FF00ED9700002A +:109A200008008200CD9500000C0083004D960000D8 +:109A30000C0085002D7C00003C005045010000001A +:109A4000FF002D7C00000000FF002D7C00000000C6 +:109A5000FF003D9600000C008900D9970000080027 +:109A60008A00919500000800FF002D7C0000000096 +:109A7000FF002D7C00000000FF003C008C45010031 +:109A8000F997000008008D002D7C00000000FF0009 +:109A90002D7C00000000FF00C997000030009000FE +:109AA0001195000018009100159600000800920022 +:109AB000599500003C009300299600003C00C845E1 +:109AC000010008009400A19500000800950081970E +:109AD00000000C0096006D97000010009800000038 +:109AE00000000000FF00000000000000FF00000870 +:109AF00008080808000000100800000800103C00DA +:109B000004460100080C0C0C0C1C0C0C0800000096 +:109B10000D8B0000F58A0000E98A0000018B00002F +:109B200014080C0C100C0000B1980000800000001C +:109B300019990000810000003D7C000080000000B9 +:109B40003C00404601003D99000082000000099958 +:109B50000000830000003D7C000085000000000044 +:109B6000000000000102020104040808813780F3AC +:109B7000AAAA03000000AAAA030000F86DA96DA913 +:109B80006EA93C007C4601006EA86EA86EA86FA767 +:109B90006FA76FA76FA66FA670A670A570A4000030 +:109BA000B51B0100C91B0100E11B0100E59C000081 +:109BB000A51B0100E59C0000891B0100D59C00004D +:109BC000D59C00003C00B8460100D11A0100E51AFE +:109BD0000100051B0100251B0100B11A0100E59CD5 +:109BE00000009D1A0100D59C0000C11A01008919CE +:109BF0000100A9190100C9190100F1190100791921 +:109C00000100E59C00003C00F446010065190100DC +:109C1000D59C0000D59C0000D59C0000D59C000080 +:109C2000D59C0000D59C0000D59C0000551C01006F +:109C3000451C0100451C0100D59C0000D59C00007E +:109C4000D59C0000D59C00003C0030470100D59C0D +:109C5000000055190100E59C00004119010031196F +:109C60000100D59C000002050A00000002040A0061 +:109C70000000C5200000212100002521000039211D +:109C8000000049210000552100003C006C47010004 +:109C900061210000ED2100000D22000021220000C2 +:109CA0003D22000049220000C5220000E122000000 +:109CB000F5220000E91F0000E91F0000E91F000075 +:109CC000E91F0000E91F0000112300003C00A84725 +:109CD00001001D23000089230000A5230000B923F3 +:109CE0000000112000001D2000006D2000008D20CC +:109CF0000000B92000000001020303050606080960 +:109D000008090909C480CA8080808080D0803C0016 +:109D1000E4470100D6D9DCDFE2808080E5E880807E +:109D20008080EBEEF1F4F7FAFD0001000200030081 +:109D30000400050006000700080009000A000B00E7 +:109D40000C000E00100011001300160018001B007C +:109D50003C00204801001E00220026002B0030009D +:109D600036003C0044004C0055005F006B0078005A +:109D700086009700A900BE00D500EF00FF7F0C0011 +:109D8000060002000000FEFFFCFFFBFFFAFFF9FFE8 +:109D9000F8FF3C005C480100F7FFF6FFF5FFF4FF19 +:109DA000F3FFF2FFF1FFF0FFEFFFEEFFEDFFECFF3F +:109DB000EBFFEAFFE9FFE8FFE7FFE6FFE5FFE4FF6F +:109DC000E3FFE2FFE1FFE0FFDFFFDEFFDDFFDCFF9F +:109DD000DCFF00003C00984801000000000000008B +:109DE0000000B17C4100115A40E2B27C4100055AAA +:109DF00040E2AF7C4100F95940E2B07C4100ED59AE +:109E000040E2246701000E0000E35C6701000E00E1 +:109E100000E30A6101003C00D4480100010000E3B6 +:109E20000E610100010000E3326701000E0000E353 +:109E30006A6701000E0000E30B610100010000E30E +:109E40000F610100010000E3406701000E0000E324 +:109E5000786701000E0000E33C00104901000C612E +:109E60000100010000E310610100010000E34E6702 +:109E700001000E0000E3866701000E0000E30D61A3 +:109E80000100010000E311610100010000E3C0488E +:109E900001000400000AE04801003C004C490100B8 +:109EA0000400000A004901000400000A20490100E2 +:109EB0000400000A18670100040000E2287501018F +:109EC0007DA940E22C750100040000E2207501002C +:109ED000040000E244750100040000E23C008849EF +:109EE0000100F0590100040000E200000000000041 +:109EF00000000000000000000000247501000400C4 +:109F000000E2B87C0100040000E28DA9000001001D +:109F100000DA1D750100010000E2C46701003C0089 +:109F2000C4490100040000E200000000000000003D +:109F3000215900000E0000D9C8670100040000E2AA +:109F4000CC670100040000E2D0670100040000E2D9 +:109F500065D90000040000DAA5D90000040000DA89 +:109F60003C00004A010001590000010000DA32679C +:109F700001000E0000E36A6701000E0000E31159C2 +:109F80000000010000DA0000000000000000B048FE +:109F900001000200000AA04801000200000A404936 +:109FA00001003C003C4A01000500000A684901002C +:109FB0000900000A6C570100040000E2386101004A +:109FC000040000E20000000000000000AC6E010090 +:109FD000040000E2B06E0100040000E270570100CE +:109FE000040000E23C00784A0100E8590100080042 +:109FF00000E3DC5801144DFD40E32C59011439FDF8 +:10A0000040E3C05801000E0000E300000000000023 +:10A0100000000000000000000000647341003D2EBD +:10A0200044E27C5901143C00B44A01009D2F44E3F2 +:10A030005C5701000E0000E2792E0400010000DBF5 +:10A04000A0580100020000E3A2580100020000E352 +:10A05000A05701000E0000E3D1880100010000DAE2 +:10A060001D890100040000DA3C00F04A01009588D7 +:10A070000100040000DB312F04000E0000D9C52EC2 +:10A0800004000E0000D9686C010115D540E2C057EC +:10A090000100080000E3C8570100340000E39C6C95 +:10A0A0000100080000E3B05801033C002C4B010004 +:10A0B000E9D440E2BC580100040000E29DA3000086 +:10A0C000600000D970790100040000E27879010095 +:10A0D000040000E27C5A0100040000E25D1C000064 +:10A0E000110000D9246E0100040000E23C00684B1E +:10A0F000010018580105D5D540E3FC5701001400B4 +:10A1000000E3048E0103E5D540E3005B0100040099 +:10A1100000E2185B0100400000E2D4670100040087 +:10A1200000E28D370000040000DBBD3600003C007B +:10A13000A44B0100040000DBFC600100020000E20F +:10A14000907D0100040000E270690100040000E25B +:10A150000000000000000000B04901001A00000AE1 +:10A16000904B01000600000AA458810005FD40E361 +:10A170003C00E04B0100804A01000C00000A0C5A30 +:10A180008101252D44E3E04A01000300000A186321 +:10A190004100FDBB40E208570100010000E29C487D +:10A1A0000100040000E20000000000000000F84A86 +:10A1B00001003C001C4C01000200000ACC740100AC +:10A1C000030000E365734100A92E44E2F659010142 +:10A1D000D12C44E3084B01000400000A07000000F2 +:10A1E0000100006A284B01000200000A887D01007E +:10A1F000040000E23C00584C010000750104656F4A +:10A2000040E3BC7801000E0000E3384B010004007D +:10A21000000A0457010004000062584B01000200CC +:10A22000000A804B01000200000A684B0100030095 +:10A23000000A8C7D01003C00944C0100040000E207 +:10A24000392D0400040000DB947D0100040000E2CD +:10A2500000000000000000000000000000000000FE +:10A260000000000000000000104001000000006439 +:10A27000A84C01000400000A3C00D04C0100000082 +:10A28000000000000000C84C01000100000AD04C92 +:10A2900001000200000A0000000000000000E77A50 +:10A2A0000100010000E2E87A0100010000E2000084 +:10A2B000000000000000ED7A01003C000C4D0100A0 +:10A2C000010000E2EE7A0100010000E2000000005F +:10A2D00000000000F37A0100010000E2F47A0100BE +:10A2E000010000E20000000000000000F97A010017 +:10A2F000010000E2FA7A0100010000E23C00484D52 +:10A300000100E84C01000300000A004D01000300B9 +:10A31000000A184D01000300000A304D010003003F +:10A32000000A905C0100040000E2945C010004005B +:10A3300000E2985C0100040000E29C5C01003C002B +:10A34000844D0100040000E2A05C0100040000E272 +:10A35000A45C0100040000E2A85C0100040000E22B +:10A36000AC5C0100040000E2B05C0100040000E20B +:10A37000B45C0100040000E2B85C0100040000E2EB +:10A380003C00C04D0100BC5C0100040000E2C05C68 +:10A390000100040000E2C45C0100040000E2905CE3 +:10A3A0000100380000E3684D01000E00000AD84D9E +:10A3B0000100020000FA1261810131D540E306611B +:10A3C00001003C00FC4D0100020000E20B610100B5 +:10A3D000010000E30F610100010000E308610100DA +:10A3E000020000E2507B0100040000E200000000D7 +:10A3F00000000000384E01000E0000649C5701016F +:10A40000918841E33C00384E01006E41676FE26580 +:10A4100060696F20414200000000F04D010009001A +:10A42000000A484E01000100000AE84D0100010049 +:10A43000000A0000000000000000484D0100040078 +:10A44000000A286101013C00744E0100BDD540E2C4 +:10A450006961410085D540E230610100040000E2FD +:10A4600034610100040000E23C610100040000E2EC +:10A4700034610100040000E244610100040000E2D4 +:10A48000000000000400006A3C00B04E0100704E65 +:10A4900001000800000A18610100020000E21C61CE +:10A4A0000100040000E220610100020000E22461DA +:10A4B0000100040000E2B84E01000200000AC84E8C +:10A4C00001000200000AD84E01003C00EC4E0100E1 +:10A4D0000200000A96480100060000E3E062010065 +:10A4E000040000E2000000000400006A9B7D0100FF +:10A4F000010000629C7D010002000062607C01009E +:10A50000040000E2010000000400006A3C00284F43 +:10A5100001002D6301000100006200000000000046 +:10A520000000000000000000000049D500000E00FF +:10A5300000D9F467010002000062467D01000100BD +:10A5400000629C7C0100040000E2987C01003C0059 +:10A55000644F010002000062A07C0100060000625E +:10A56000587C010002000062647C01000600006269 +:10A570005A7C0100020000626A7C01000600006251 +:10A58000010000000400006AE4620100040000E22F +:10A590003C00A04F0100E8620100030000E200005F +:10A5A00000000400006A000000000400006A0100CE +:10A5B00000000400006A000000000400006A0000BF +:10A5C00000000400006A000000000400006A0000AF +:10A5D00000003C00DC4F01000400006A00000000A5 +:10A5E0000400006A000000000400006A000000008F +:10A5F0000400006A000000000400006A000000007F +:10A600000400006A000000000400006A000000006E +:10A610000400006A3C001850010000000000040023 +:10A62000006A000000000400006A0000000004004E +:10A63000006A000000000400006A0000000004003E +:10A64000006AF04E01002A00000A01000000040028 +:10A65000006A752A01003C00545001000C0000DB28 +:10A66000020000000400006A752A01000C0000DBF3 +:10A67000030000000400006A752A01000C0000DBE2 +:10A68000040000000400006A752A01000C0000DBD1 +:10A69000050000000400006A3C0090500100752A8B +:10A6A00001000C0000DB060000000400006A752AAF +:10A6B00001000C0000DB070000000400006A752A9E +:10A6C00001000C0000DB080000000400006A752A8D +:10A6D00001000C0000DB090000003C00CC50010030 +:10A6E0000400006A752A01000C0000DB0A0000006B +:10A6F0000400006A752A01000C0000DB0B0000005A +:10A700000400006A752A01000C0000DB0C00000048 +:10A710000400006A752A01000C0000DB3C000851AF +:10A7200001000D0000000400006A752A01000C0001 +:10A7300000DB0E0000000400006A752A01000C0016 +:10A7400000DB485001000200000A585001000200DE +:10A75000000A685001000200000A785001003C0025 +:10A76000445101000200000A885001000200000A62 +:10A77000985001000200000AA85001000200000ADF +:10A78000B85001000200000AC85001000200000A8F +:10A79000D85001000200000AE85001000200000A3F +:10A7A0003C0080510100F85001000200000A0851ED +:10A7B00001000200000A185101000200000A405086 +:10A7C00001000100000AE84E01000100000A00003B +:10A7D0000000000000000000000000000000B04E7B +:10A7E00001003C00BC5101000100000A0000000013 +:10A7F00000000000285101000E00000A00000000C7 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A82000000000003C00F8510100985101000C00AC +:10A83000000A504E01000400000AE04C0100010033 +:10A84000000A0000000000000000C04B01001D00D5 +:10A85000000AF85101000500000A248007000000EA +:10A8600000001D8007003C00345201000800000079 +:10A870002A8007005C00000024800700020000001E +:10A880001D800700200000002A8007006A000000E9 +:10A8900024800700020000001D8007002000000047 +:10A8A0002A8007006A0000003C007052010000018D +:10A8B00002030405060708090A0B0C0D0E0F101100 +:10A8C00012131415161718191A1B1C1D1E1F0163CD +:10A8D0000000A1630000C5630000B1620000C56311 +:10A8E0000000216300004D6300003C00AC520100F9 +:10A8F000A163000001630000A163000006050505D7 +:10A9000005050505050505050505030506070809EF +:10A910000A0A0C0D0E0F0F1011000000A5C684F8D6 +:10A9200099EE8DF60DFFBDD6B1DE54913C00E85294 +:10A93000010050600302A9CE7D5619E762B5E64DCD +:10A940009AEC458F9D1F408987FA15EFEBB2C98EAF +:10A950000BFBEC4167B3FD5FEA45BF23F75396E479 +:10A960005B9BC2751CE1AE3D6A4C5A6C417E3C005B +:10A970002453010002F54F835C68F45134D108F987 +:10A9800093E273AB53623F2A0C08529565465E9D75 +:10A990002830A1370F0AB52F090E36249B1B3DDF47 +:10A9A00026CD694ECD7F9FEA1B129E1D74582E3412 +:10A9B0003C00605301002D36B2DCEEB4FB5BF6A424 +:10A9C0004D7661B7CE7D7B523EDD715E9713F5A665 +:10A9D00068B900002CC160401FE3C879EDB6BED451 +:10A9E000468DD9674B72DE94D498E8B04A856BBB2C +:10A9F0002AC53C009C530100E54F16EDC586D79A49 +:10AA000055669411CF8A10E9060481FEF0A04478BF +:10AA1000BA25E34BF3A2FE5DC0808A05AD3FBC21A1 +:10AA2000487004F1DF63C17775AF634230201AE5E7 +:10AA30000EFD6DBF3C00D85301004C811418352623 +:10AA40002FC3E1BEA235CC88392E5793F25582FC34 +:10AA5000477AACC8E7BA2B3295E6A0C09819D19EC8 +:10AA60007FA366447E54AB3B830BCA8C29C7D36B50 +:10AA70003C2879A7E2BC3C00145401001D1676ADB9 +:10AA80003BDB56644E741E14DB920A0C6C48E4B82F +:10AA90005D9F6EBDEF43A6C4A839A43137D38BF2B6 +:10AAA00032D5438B596EB7DA8C0164B1D29CE04940 +:10AAB000B4D8FAAC07F325CF3C0050540100AFCA1C +:10AAC0008EF4E9471810D56F88F06F4A725C24380D +:10AAD000F157C773519723CB7CA19CE8213EDD96AB +:10AAE000DC61860D850F90E0427CC471AACCD890C1 +:10AAF000050601F7121CA3C25F6A3C008C540100DA +:10AB0000F9AED06991175899273AB92738D913EB7C +:10AB1000B32B3322BBD270A98907A733B62D223CB1 +:10AB2000921520C94987FFAA78507AA58F03F85952 +:10AB30008009171ADA6531D7C684B8D03C00C854EA +:10AB40000100C382B029775A111ECB7BFCA8D66DB9 +:10AB50003A2CC6A5F884EE99F68DFF0DD6BDDEB170 +:10AB6000915460500203CEA9567DE719B5624DE6B7 +:10AB7000EC9A8F451F9D8940FA87EF15B2EB3C0098 +:10AB8000045501008EC9FB0B41ECB3675FFD45EA3C +:10AB900023BF53F7E4969B5B75C2E11C3DAE4C6A44 +:10ABA0006C5A7E41F502834F685C51F4D134F90848 +:10ABB000E293AB7362532A3F080C955246659D5E43 +:10ABC0003C0040550100302837A10A0F2FB50E096F +:10ABD00024361B9BDF3DCD264E697FCDEA9F121B9D +:10ABE0001D9E5874342E362DDCB2B4EE5BFBA4F6F9 +:10ABF000764DB7617DCE527BDD3E5E711397A6F533 +:10AC0000B9683C007C5501000000C12C4060E31F86 +:10AC100079C8B6EDD4BE8D4667D9724B94DE98D410 +:10AC2000B0E8854ABB6BC52A4FE5ED1686C59AD7B5 +:10AC3000665511948ACFE9100406FE81A0F078448D +:10AC400025BA4BE33C00B8550100A2F35DFE80C07D +:10AC5000058A3FAD21BC7048F10463DF77C1AF7551 +:10AC600042632030E51AFD0EBF6D814C1814263565 +:10AC7000C32FBEE135A288CC2E39935755F2FC8202 +:10AC80007A47C8ACBAE73C00F4550100322BE69590 +:10AC9000C0A019989ED1A37F4466547E3BAB0B8322 +:10ACA0008CCAC7296BD3283CA779BCE2161DAD76A8 +:10ACB000DB3B6456744E141E92DB0C0A486CB8E4FD +:10ACC0009F5DBD6E43EFC4A63C003056010039A81D +:10ACD00031A4D337F28BD5328B436E59DAB7018C5E +:10ACE000B1649CD249E0D8B4ACFAF307CF25CAAF1F +:10ACF000F48E47E910186FD5F0884A6F5C723824DB +:10AD000057F173C79751CB23A17C3C006C560100CF +:10AD1000E89C3E2196DD61DC0D860F85E0907C424B +:10AD200071C4CCAA90D80605F7011C12C2A36A5FB1 +:10AD3000AEF969D0179199583A2727B9D938EB134A +:10AD40002BB32233D2BBA970078933A73C00A85686 +:10AD500001002DB63C221592C9208749AAFF5078E0 +:10AD6000A57A038F59F809801A1765DAD73184C696 +:10AD7000D0B882C329B05A771E117BCBA8FC6DD600 +:10AD80002C3A0400000000000000010000003C001C +:10AD9000E45601000200000003000000050000006E +:10ADA000000000000100000002000000030000009D +:10ADB00004000000010000000172657145727252CA +:10ADC0006561736F6E000000010000000500000067 +:10ADD0003C0020570100C48E0100249A01000000AD +:10ADE000000030000000249A0100A4B2010000001D +:10ADF00000006C000000A4B2010014C801000000B3 +:10AE00000000C00000001020304050BB30000100A6 +:10AE100000003C005C5701001416181A1C1E20226A +:10AE20002426282A2B2C01007017000001000000A6 +:10AE30000D250000413F0100652901000D2500009E +:10AE4000F55E0000413F0100413F010002040B0C90 +:10AE5000121618243C00985701003048606C01001D +:10AE60000000101010101010101010101010101002 +:10AE700000006400000001000000FFFFFFFF010070 +:10AE80000000000210121100000118000000020072 +:10AE90000000010000003C00D45701000000000049 +:10AEA000000000000200000004000000000000009C +:10AEB00000000000E093040040420F00000000008A +:10AEC0000100000000800000DF40CFFD0040830053 +:10AED00000000000010200003C00105801000000CA +:10AEE0000000000000000000000040008081000021 +:10AEF0008000BFFF7F7E0102000000000000000014 +:10AF0000000001000000786F010000000000B86F31 +:10AF1000010000000000F86F01003C004C580100E7 +:10AF2000000000003870010000000000787001008F +:10AF300000000000B870010000000000F87001007F +:10AF4000000000003871010000000000787101006D +:10AF50000001000090710100000100003C008858D1 +:10AF60000100A87101000001000000050A01060BA4 +:10AF700002070C03080D040900000303010100048B +:10AF800000040406161E1F0000000000000100005F +:10AF900080000000000000FFFFFF181818183C0098 +:10AFA000C458010018181818181818181818000094 +:10AFB000618B4A00618F4A00618B4A0005E3C00043 +:10AFC00005CBC00005BBC00085BAC00085A2C0008B +:10AFD0008592C000858AC000857AC0004589C0007E +:10AFE0003C00005901004571C0004569C000456141 +:10AFF000C0004559C0004551C0004549C000454109 +:10B00000C0004539C0004531C0004529C000452178 +:10B01000C000602D0600602D0600602D0600602D2A +:10B0200006003C003C590100602D06006028060027 +:10B030005026060050210600501F0600501C060036 +:10B04000501A06005018060050160600501406004C +:10B050005012060050100600500E0600500C06005C +:10B06000500A06003C00785901002B0B06001D75A4 +:10B07000C0001D75C0001D75C0001D75C0001D7588 +:10B08000C0001D75C0001D6DC000DD5BC000DD4B44 +:10B09000C000DD43C000DD3BC000DD33C000DD2B60 +:10B0A000C000DD23C0003C00B4590100DD1BC0001E +:10B0B000DD13C000DD13C000DD13C000DD13C000D0 +:10B0C000DD13C000050505040403030202010100AD +:10B0D000000005050504040303020201010000004D +:10B0E00000000000881300003C00F0590100070038 +:10B0F000000080005B004002E0FDF200B8FCA4010B +:10B1000000000F0000000F000000030B9F5F07010D +:10B110002A04210417040E040404FB03F103E803CA +:10B12000C903AA038A036B034C033C002C5A010099 +:10B130002D030E03EE02EC02010316032B03400362 +:10B1400055036A037F039403A903BE03D303E803F3 +:10B15000BE0394036A030002040607090A0B0C0DE0 +:10B160001010101010101010101000033C00685A3E +:10B17000010005080B0E1010101010101010101008 +:10B18000101010100000010000000100000000007D +:10B1900000000000000000000000000000000000AF +:10B1A00000000000000000000000000000003C0063 +:10B1B000A45A010000000000000000000000000090 +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F0003C00E05A010000000000000000000000D8 +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B2300000003C001C5B010000000000000000005A +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B27000000000003C00585B0100000000000000DE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B0000000000000003C00945B01000000000062 +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F00000000000000000003C00D05B01000000E6 +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000003C000C5C010068 +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B370000000000000000000000000003C00485CED +:10B3800001000000000000000000000000000000BC +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B00000000000000000000000000000003C0051 +:10B3C000845C01000000000000000000000000009C +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B400003C00C05C010000000000000000000000E3 +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000003C00FC5C0100000000000000000067 +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B48000000000003C00385D0100000000000000EA +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C0000000000000003C00745D0100000000006E +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B5000000000000000000003C00B05D01000000F1 +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B54000000000000000000000003C00EC5D010075 +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B580000000000000000000000000003C00285EF9 +:10B5900001000000000000000000000000000000AA +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C00000000000000000000000000000003C003F +:10B5D000645E0100000000000000000000000000A8 +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B610003C00A05E010000000000000000000000EF +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000003C00DC5E0100000000000000000073 +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B69000000000003C00185F0100000000000000F6 +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D0000000000000003C00545F0100000000007A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B7100000000000000000003C00905F01000000FD +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B75000000000000000000000003C00CC5F010081 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B790000000000000000000000000003C00086005 +:10B7A0000100000000000000000000000000000098 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D00000000000000000000000000000003C002D +:10B7E00044600100000000000000000000000000B4 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820003C008060010000000000000000000000FB +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000003C00BC60010000000000000000007F +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A000000000003C00F860010000000000000003 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000003C00346101000000000086 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B9200000000000000000003C0070610100000009 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B96000000000000000000000003C00AC6101008D +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000003C00E86112 +:10B9B0000100000000000000000000000000000086 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E00000000000000000000000000000003C001B +:10B9F00024620100000000000000000000000000C0 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30003C00606201000000000000000000000007 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000003C009C62010000000000000000008B +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB000000000003C00D86201000000000000000F +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000003C00146301000000000092 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB300000000000000000003C0050630100000015 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB7000000000000000000000003C008C63010099 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000003C00C8631E +:10BBC0000100000000000000000000000000000074 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF00000000000000000000000000000003C0009 +:10BC000004640100000000000000000000000000CB +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC40003C00406401000000000000000000000013 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000003C007C640100000000000000000097 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC000000000003C00B86401000000000000001B +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000003C00F4640100000000009E +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000003C0030650100000021 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD8000000000000000000000003C006C650100A5 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000003C00A8652A +:10BDD0000100000000000000000000000000000062 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE000000000000000000000000000000003C00F6 +:10BE1000E4650100000000000000000000000000D8 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE50003C0020660100000000000000000000001F +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000003C005C6601000000000000000000A3 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED000000000003C009866010000000000000027 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000003C00D466010000000000AA +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000003C001067010000002D +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF9000000000000000000000003C004C670100B1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000003C00886736 +:10BFE0000100000000000000000000000000000050 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C0100000000000000000000000000000003C00E4 +:10C02000C4670100000000000000000000000000E4 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C060003C0000680100000000000000000000002B +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A00000003C003C6801000000000000000000AF +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E000000000003C007868010000000000000033 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C120000000000000003C00B468010000000000B6 +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000003C00F068010000003A +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000003C002C690100BD +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E0000000000000000000000000003C00686942 +:10C1F000010000000000000000000000000000003E +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C2200000000000000000000000000000003C00D2 +:10C23000A4690100000000000000000000000000F0 +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C270003C00E06901000000000000000000000038 +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B00000003C001C6A01000000000000000000BB +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000003C00586A01000000000000003F +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C330000000000000003C00946A010000000000C2 +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000003C00D06A0100000046 +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000003C000C6B0100C9 +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F0000000000000000000000000003C00486B4E +:10C40000010000000000000000000000000000002B +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000003C00C0 +:10C44000846B0100000000000000000000000000FC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C480003C00C06B01000000000000000000000044 +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C00000003C00FC6B01000000000000000000C8 +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000003C00386C01000000000000004A +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C540000000000000003C00746C010000000000CE +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000003C00B06C0100000052 +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000003C00EC6C0100D6 +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C600000000000000000000000000003C00286D59 +:10C610000100000000000000000000000000000019 +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000003C00AE +:10C65000646D010000000000000000000000000008 +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C690003C00A06D01000000000000000000000050 +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D00000003C00DC6D01000000000000000000D4 +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C71000000000003C00186E010000000000000056 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C750000000000000003C00546E010000000000DA +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C7900000000000000000003C00906E010000005E +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D000000000000000000000003C00CC6E0100E2 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000003C00086F65 +:10C820000100000000000000000000000000000007 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000003C009C +:10C86000446F010000000000000000000000000014 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0003C00806F0100000000000000000000005C +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E00000003C00BC6F01000000000000000000E0 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C92000000000003C00F86F010000000000000063 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C960000000000000003C003470010000000000E6 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A00000000000000000003C007070010000006A +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E000000000000000000000003C00AC700100EE +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000003C00E87072 +:10CA300001000000000000000000000000000000F5 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000003C008A +:10CA70002471010000000000000000000000000020 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0003C00607101000000000000000000000068 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF00000003C009C7101000000000000000000EC +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB3000000000003C00D87101000000000000006F +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB70000000000000003C001472010000000000F2 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB00000000000000000003C0050720100000076 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF000000000000000000000003C008C720100FA +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC30000000000000000000000000003C00C8727E +:10CC400001000000000000000000000000000000E3 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000003C0078 +:10CC8000047301000000000000000000000000002C +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0003C00407301000000000000000000000074 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD000000003C007C7301000000000000000000F7 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD4000000000003C00B87301000000000000007B +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD80000000000000003C00F473010000000000FF +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC00000000000000000003C0030740100000082 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE0000000000000000000000003C006C74010005 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE40000000000000000000000000003C00A8748A +:10CE500001000000000000000000000000000000D1 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000003C0066 +:10CE9000E474010000000000000000000000000039 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0003C00207501000000000000000000000080 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF100000003C005C750100000000000000000003 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF5000000000003C009875010000000000000087 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000003C00D4750100000000000B +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD00000000000000000003C001076010000008E +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D01000000000000000000000003C004C76010011 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D050000000000000000000000000003C00887696 +:10D0600001000000000000000000000000000000BF +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D0900000000000000000000000000000003C0054 +:10D0A000C476010000000000000000000000000045 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0003C0000770100000000000000000000008C +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000003C003C77010000000000000000000F +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D16000000000003C007877010000000000000093 +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A0000000000000003C00B47701000000000017 +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E00000000000000000003C00F077010000009B +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D22000000000000000000000003C002C7801001D +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D260000000000000000000000000003C006878A2 +:10D2700001000000000000000000000000000000AD +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A00000000000000000000000000000003C0042 +:10D2B000A478010000000000000000000000000051 +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F0003C00E07801000000000000000000000099 +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000003C001C79010000000000000000001B +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D37000000000003C00587901000000000000009F +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B0000000000000003C00947901000000000023 +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F00000000000000000003C00D07901000000A7 +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D43000000000000000000000003C000C7A010029 +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D470000000000000000000000000003C00487AAE +:10D48000010000000000000000000000000000009B +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B00000000000000000000000000000003C0030 +:10D4C000847A01000000000000000000000000005D +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D500003C00C07A010000000000000000000000A4 +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000003C00FC7A0100000000000000000028 +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000003C00387B0100000000000000AB +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C0000000000000003C00747B0100000000002F +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D6000000000000000000003C00B07B01000000B2 +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D64000000000000000000000003C00EC7B010036 +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D680000000000000000000000000003C00287CBA +:10D690000100000000000000000000000000000089 +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C00000000000000000000000000000003C001E +:10D6D000647C010000000000000000000000000069 +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710003C00A07C010000000000000000000000B0 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000003C00DC7C0100000000000000000034 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D79000000000003C00187D0100000000000000B7 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000003C00547D0100000000003B +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D8100000000000000000003C00907D01000000BE +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D85000000000000000000000003C00CC7D010042 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000003C00087EC6 +:10D8A0000100000000000000000000000000000077 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D00000000000000000000000000000003C000C +:10D8E000447E010000000000000000000000000075 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D920003C00807E010000000000000000000000BC +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000003C00BC7E0100000000000000000040 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A000000000003C00F87E0100000000000000C4 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000003C00347F01000000000047 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000003C00707F01000000CA +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA6000000000000000000000003C00AC7F01004E +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000003C00E87FD3 +:10DAB0000100000000000000000000000000000065 +:10DAC0000000000000000000000070B50125074EB6 +:10DAD000AD0375610A20FAF76CFF30688003C40F4C +:10DAE000B5610A20FAF765FF201C70BD00003C00FC +:10DAF000248001001000070070B501256D04002886 +:10DB0000104C01D0656100E0A56160682843606049 +:10DB1000A0682843A0600A20FAF74EFF0126B6034A +:10DB200066610A20FAF748FFA6610120FAF744FF70 +:10DB30003C0060800100A068A843A06060682843A2 +:10DB400060600A20FAF73BFF70BD1000070070B557 +:10DB50000125104C6D046561606828436060A06811 +:10DB60002843A060EE08A6610A20FAF728FF666144 +:10DB70000A203C009C800100FAF724FFA5610A20DE +:10DB8000FAF720FFA6610A20FAF71CFFA068A84355 +:10DB9000A06060682843606070BD0000100007004E +:10DBA00070B501250E4C6D04A56160682843606066 +:10DBB000A06828433C00D8800100A060EE086661A0 +:10DBC0000A20FAF702FF65610A20FAF7FEFEA66155 +:10DBD0000A20FAF7FAFEA068A843A060606828430C +:10DBE000606070BD00001000070070B5051C0024C7 +:10DBF0008026281C30403C0014810100FFF788FF7C +:10DC00006806050E0134082CF6DBFFF76DFF70BDCA +:10DC100080B5021C0B218020FBF73EFB80BD00007D +:10DC2000F8B512480025071CFF37061D0137281CD0 +:10DC3000F9F7EAFD041C17D03C005081010020696F +:10DC4000002804D0E06A002803D00020E062251CF0 +:10DC5000F0E77B68002B05D0321C211C44310120E9 +:10DC6000E8F734F9201C4430F9F737FEE2E7F8BD55 +:10DC7000000020F70100114870B53C008C810100C4 +:10DC80000068FF281DD1FF203230FAF7A7FE0E4DA5 +:10DC90006C680E48FAF7A2FE6868241A012000F0AA +:10DCA00095FD6E680948FAF799FE6868211C0A39E3 +:10DCB000301A884202D30A34A04202D93C00C881FB +:10DCC0000100002000F085FD70BDF4740100000328 +:10DCD00007009303000070B500F04DF80120EDF748 +:10DCE00034F9114D182168600020E9F7F2F9286035 +:10DCF00004688020208000260622FF21201D3C0091 +:10DD0000048201006680E8F70BFA201C0A300949FA +:10DD1000F2F72EFD201C10300749F2F729FDE682AC +:10DD200003CDE9F7F9F8024901201439886070BD84 +:10DD300090D901001261010024F701007047000032 +:10DD40003C004082010010B5064C00220220E16830 +:10DD5000F0F711FB6078022801D100F01AF910BD2C +:10DD6000000040D9010080B5A120FFF750FF80BD21 +:10DD7000000040000E21084080B5A030FFF747FFAB +:10DD800080BD3C007C82010010B5054C2068002855 +:10DD900004D0E9F787F900202060606010BD000022 +:10DDA00090D9010010B5074C0121074A21610220DA +:10DDB0001070616100F0D6FC00F0C8FB201CEDF78C +:10DDC0009FFA10BD3C00B882010020F701007CD909 +:10DDD000010070B5021C081C0225002A134E14D045 +:10DDE00000F011FC3078012108433070307828436E +:10DDF000307000207D214901B279920700D50134AD +:10DE000001308842F8DB3C00F4820100201C70BD28 +:10DE10003078A843307030784008400030700549B1 +:10DE200048680122120490434860012070BD000040 +:10DE3000880007006C000700FFB509AE002060CE27 +:10DE4000286000239C4630603C0030830100694616 +:10DE500001AA17E0DB070ED5124B1C56631C0AD033 +:10DE600001272B68A7403B432B601368DB0702D5D3 +:10DE700033683B4333600B685B080B6013685B08D7 +:10DE8000136001300B68002B01D03C006C83010053 +:10DE90002228E2D3634601332020022B9C4602A9AC +:10DEA00003AAF2DBFFBD0000B48D0100B0B5041C75 +:10DEB0000D1C1E2100220320054BF9F7B3F8211C8D +:10DEC0000320F9F7F5F8291C0320F9F73C00A88393 +:10DED0000100F1F8B0BD80380100B0B51C4C1C4DFC +:10DEE0002178022909D0032919D004291FD0052936 +:10DEF00023D1002000F017FB23E0686114481C3098 +:10DF0000C16802698918C16000F02FFBE0683C001D +:10DF1000E48301000138E06016D13220E060FFF7B1 +:10DF2000A3FE11E0002000F001FB00F02DFC012019 +:10DF3000207009E0002000F0F9FAFFF745FF03E048 +:10DF400005210B20E8F746FF68696168E7F7DDFF08 +:10DF50003C0020840100B0BD00007CD9010020F706 +:10DF60000100F7B5041C171CFFF721FE200AFFF77C +:10DF700018FF2006000EFFF762FEFFF718FEA12033 +:10DF8000FFF75DFE002516E0002000244006060E87 +:10DF9000FFF73C005C840100D1FD0006000E304319 +:10DFA0000134082CF5DB291C019A0135BD4250547F +:10DFB00001DA002000E00120FFF7D4FDBD42E6DBDE +:10DFC000FFF71EFEFEBD000080B5FFF719FE092118 +:10DFD000890300223C00988401000220F0F7E9F94F +:10DFE00080BD0921890380B500220220F0F7C9F91C +:10DFF000012109488903816142680A4342608268BD +:10E000001143816001214904816182688A438260F1 +:10E010004268114341603C00D484010080BD00008F +:10E0200010000700F0B5041CC0687B4E056830780E +:10E0300085B0012801D0022872D100212069F2F7B1 +:10E0400041F97649F2F724FC002869D0201C2030E1 +:10E05000417A082902D1724A3C0010850100002152 +:10E060005161007A226A1821F2F7C9FBE16A371C74 +:10E0700040186C49029030780E1CFF360A1D01369C +:10E080000128049207D0654A02991C32281CEDF73A +:10E09000E2FB00286BD0322120693C004C85010056 +:10E0A000F2F716F9019020690121F2F711F9011C2C +:10E0B0005E480123019AEDF707FC002804D15B4874 +:10E0C000EDF792FA0021B96056481C308168EAF7F2 +:10E0D00019FC201C143003900499F2F73C00888549 +:10E0E0000100D5FB002805D10022BA6004980399ED +:10E0F000F2F76BFB4F4928890988884203D0002238 +:10E100004C49BA60088003212069F2F7E4F800283E +:10E1100010D04649827820310B7994469A423C00CF +:10E12000C485010009D00022BA6062460A71807875 +:10E130000121F3F705F900E077E006212069F2F705 +:10E14000CDF8002808D081783A4840308288914242 +:10E1500002D00022BA6081802A212069F2F7BEF83D +:10E160003C000086010000280DD08078F169334A18 +:10E17000814208D00021B960F061101CEDF709FB65 +:10E180002F48EDF7FAFA38783B1C012817D1022006 +:10E1900018702A4F01233B61274B03CD1C33083DE8 +:10E1A000029A3C003C860100EDF7B0FA381CEDF70E +:10E1B000D7F83268002A03D000210120E7F7C4FE17 +:10E1C00000F0F4F9201CF9F7D5FB071C11D1201C35 +:10E1D000F9F788FB071C2ED001233B616889402199 +:10E1E000C85373683C0078860100002B04D0211CC2 +:10E1F0000020049AE7F7ACFE0123FB62206932217C +:10E20000F2F775F8051C20690121F2F770F80E4E3F +:10E21000011C2A1C301CEDF7C0FB00280ED1322156 +:10E220002069F2F764F83C00B4860100051C2069FF +:10E230000121F2F75FF8011C3B1C2A1C301CEDF792 +:10E24000D7FA05B0F0BD00007CD9010040F801000C +:10E2500020F70100021C081C802A80B506D0812A04 +:10E2600003D004210B20E8F73C00F0860100D9FD23 +:10E2700080BDFFF75CFE80BD000003488178FF2968 +:10E2800001D0007970470020704780F8010030B558 +:10E2900089B000930E4D131C041C2A1CECF725FDBD +:10E2A00001A906A8A268ECF7CEFE3C002C8701006D +:10E2B00001AA06A9281C636AEDF744FA041C012888 +:10E2C00004D1281CEDF72CF800F04AF8201C09B006 +:10E2D00030BD000020F7010080B5EDF72BF800F00D +:10E2E0007DF80248EDF702FA80BD00003C00688727 +:10E2F000010020F7010080B500280BD10648EDF79A +:10E30000F8F900F06EF80120EDF7EBFA034903206D +:10E31000F9F735FE80BD20F701006D870100B0B52B +:10E32000104D041C131C2A1C88B0ECF702FD3C00A5 +:10E33000A4870100211C0A310622281DE7F7A4FE4C +:10E34000694605A86269ECF787FE281CECF7EEFF2A +:10E350007F23DB43281C6A4605A9EDF7F9F900F095 +:10E360001DF808B0B0BD000020F701000A4880B5D4 +:10E370003C00E08701000178002906D0022901D085 +:10E38000052907D10321017080BD0121017000F032 +:10E390002EFA80BD03210B20E8F74FFD80BD7CD90C +:10E3A0000100094980B50878002806D0022801D06C +:10E3B00005283C001C88010005D10420087080BDA0 +:10E3C000FFF738FD80BD02210B20E8F739FD80BD45 +:10E3D0007CD9010080B502210B20044AFAF782FFA4 +:10E3E000F6F786FD0249086180BD0000DD86010068 +:10E3F0007CD901003C00588801000C4880B50178A8 +:10E4000006290ED202A35B5C5B009F44000006035A +:10E4100007070706002000F0C2F880BD0521017043 +:10E4200080BD04210B20E8F70EFD80BD00007CD9E3 +:10E430000100704700003C009488010010B50D4BAE +:10E44000041C181C1030002C08D0DB885B045B0C0B +:10E450000B80807B48800420108008E0DA8801244B +:10E46000E40322400C882243DA804988817301202A +:10E4700010BD0000300007003C00D088010070B5DE +:10E48000104E021C0023F056002A02D0087001240E +:10E4900015E00023CD56854201D1012070BD281C16 +:10E4A00000F05FF9041C0AD00748357000680028A6 +:10E4B00003D000210A20F9F728FD3C000C89010057 +:10E4C00000F016FA201C70BDF46B01003CD901006D +:10E4D000031C081C002B80B506D0042111800422E7 +:10E4E0000449E7F7E3FD02E0006800F0CFF90120FE +:10E4F00080BD0000F474010010B5FFF73C004889AE +:10E50000010097FBFFF789FC041CFFF7B8FBFFF73E +:10E5100084FC002C02D1012800D110BD002010BDC8 +:10E520000000F8B5204F041C78780E1C02282ED06D +:10E530001E4AF968916114231D49584340183C0054 +:10E5400084890100417BB878F8F714FE00F08AF95D +:10E55000002504E00021B878F8F70CFE0135787842 +:10E560001423144958434018807AA842F2DC00254D +:10E5700008E00021B878F8F7FDFD0F48006820702A +:10E580003C00C089010001340135B542F4DB094A81 +:10E59000F86850617878022806D1B868321C211CCE +:10E5A0000004000CFFF725FDB8688019B860F8BDBD +:10E5B000000040D9010010000700648D01003020E8 +:10E5C00007003C00FC89010070B5061C0C4D0024BE +:10E5D0002C70FFF739FC0A4818211C30AC60E7F7B3 +:10E5E00043FD08484461F9F763F9002E06D1064857 +:10E5F0002969F6F7A7FC0020ECF7B0FE70BD00001B +:10E600007CD901003C00388A010020F70100346306 +:10E61000010030B5124C85B0206800281CD00F488E +:10E6200014388068002801D1FFF7C1FB206800235F +:10E63000006801AA04300121ECF7D1FD0849084A1D +:10E6400008310C3100923C00748A010003C900AB10 +:10E650004518997B019A20682B1CF2F72BFE05B018 +:10E6600030BD000090D901002981010010B5134C84 +:10E67000142360705843124BC1188A88E2801858DE +:10E68000E060087AA070FF283C00B08A010012D038 +:10E69000002208210D4BF8F722FD00220220E1683C +:10E6A000EFF7BDFE0A49E06848614A6802434A60E4 +:10E6B0008A68104388606078022801D1FFF7DFFC88 +:10E6C00010BD40D90100648D01003C00EC8A0100BE +:10E6D000B80B000010000700FE300006000E0621F7 +:10E6E000154B4143585C82061448920E4271C9187A +:10E6F0004A78D206D20E027142780C231A43427035 +:10E7000042788B78920892009B079B0F3C00288BE5 +:10E7100001001A4342700278C0239A4340320270CB +:10E72000027838231A4302700278C97804239A4386 +:10E730008900194011430170012070470000D88DF5 +:10E740000100880007008FB50020029003903C0074 +:10E75000648B0100074802AA03A900910192438932 +:10E76000028903C8FFF7D4FB03980299FFF704FC62 +:10E770008FBD0000048E010008494A78002A03D1A9 +:10E78000888000208860704714235A43044BD218B5 +:10E790003C00A08B0100D2884243C88842438A6073 +:10E7A000704740D90100648D0100F8B5254E041C66 +:10E7B000307A400840003072B07A0020B0720127F1 +:10E7C000012C204D01D0FC4213D1307B38433073F3 +:10E7D00000223C00DC8B0100211C0020FFF76EFBB7 +:10E7E000631C01D13F21E973B17AA0221143B172B8 +:10E7F000317A39433172F8BD307B400840003073C4 +:10E800000122211C0120FFF759FB01200021E9739F +:10E81000B17A02223C00188C01001143B172B17A26 +:10E8200004221143B172B17A30221143B172317AAC +:10E830003943317208494A6880239A434A600A681A +:10E840001A430A60317B39433173D7E700008800EF +:10E850000700400007003C00548C01006C000700DA +:10E86000B0B50E4D0E482969F6F79EFB0D48ECF742 +:10E8700093FD0D48094C00881C34A082F1F75AFF23 +:10E880002061FAF797F8021C231C00210020ECF706 +:10E890008BFF3220E860FFF73C00908C0100A5FA66 +:10E8A000B0BD7CD9010034630100DD84010020F794 +:10E8B0000100B0B50A4D687800280ED0142308492D +:10E8C00058434018447A06E0A868E0400106090E63 +:10E8D000A878F8F776FC083CF6D53C00CC8C010013 +:10E8E000B0BD000040D90100648D0100011C144836 +:10E8F000B0B501601348027F02239A430277027F7A +:10E90000012422430277104D00290CD0012200215E +:10E910000320EFF79FFD0D49487CA0433C00088D84 +:10E9200001004874687A20436872B0BD017F2143BA +:10E930000177687A400840006872012200210320B4 +:10E94000EFF7B1FDB0BDF47401003000070088009E +:10E9500007001000070010B5074C211C00203C00E8 +:10E96000448D0100F9F756FB05480023C0560128E5 +:10E9700003DD211C0020F9F719FB10BD651A00000A +:10E98000F46B01000000020008010100021804FFFE +:10E9900082E8D78000000000008000000001000134 +:10E9A0003C00808D010000180006020305010100F3 +:10E9B00000000000000080000100FF1000FFFFFFCA +:10E9C000FFFFFF0000000000020020000100021015 +:10E9D0000006020305010100000004050607080CFB +:10E9E0000D0E3C00BC8D0100FF1415161718191BE5 +:10E9F0001C1DFF1A1113120F10FF0200FF01030963 +:10EA00000A0B0000300D02000000280E0300000079 +:10EA10001E0C00000000300D020100001E0C000161 +:10EA20000000230D3C00F88D0100020100001D0DC7 +:10EA3000020100000000FFFEFB6D000080000200EC +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA60000000000000003C00348E010000000000A7 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA00000000000000000003C00708E010000002B +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE000000000000000000000003C00AC8E0100AF +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB20000000000000000000000000003C00E88E33 +:10EB300001000000000000000000000000000000D4 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000003C0069 +:10EB7000248F0100000000000000000000000000E1 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0003C00608F01000000000000000000000029 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF00000003C009C8F01000000000000000000AD +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC3000000000003C00D88F010000000000000030 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000003C001490010000000000B3 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB00000000000000000003C0050900100000037 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF000000000000000000000003C008C900100BB +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED30000000000000000000000000003C00C8903F +:10ED400001000000000000000000000000000000C2 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED700000000000000000000000000000003C0057 +:10ED800004910100000000000000000000000000ED +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0003C00409101000000000000000000000035 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE000000003C007C9101000000000000000000B8 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE4000000000003C00B89101000000000000003C +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000003C00F491010000000000C0 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC00000000000000000003C0030920100000043 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF0000000000000000000000003C006C920100C6 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF40000000000000000000000000003C00A8924B +:10EF500001000000000000000000000000000000B0 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF800000000000000000000000000000003C0045 +:10EF9000E4920100000000000000000000000000FA +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0003C00209301000000000000000000000041 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000003C005C9301000000000000000000C4 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F05000000000003C009893010000000000000048 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000003C00D493010000000000CC +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D00000000000000000003C001094010000004F +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F11000000000000000000000003C004C940100D2 +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F150000000000000000000000000003C00889457 +:10F16000010000000000000000000000000000009E +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F1900000000000000000000000000000003C0033 +:10F1A000C494010000000000000000000000000006 +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E0003C0000950100000000000000000000004D +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000003C003C9501000000000000000000D0 +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000003C007895010000000000000054 +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A0000000000000003C00B495010000000000D8 +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E00000000000000000003C00F095010000005C +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F32000000000000000000000003C002C960100DE +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F360000000000000000000000000003C00689663 +:10F37000010000000000000000000000000000008C +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A00000000000000000000000000000003C0021 +:10F3B000A496010000000000000000000000000012 +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F0003C00E0960100000000000000000000005A +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000003C001C9701000000000000000000DC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000003C005897010000000000000060 +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B0000000000000003C009497010000000000E4 +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F00000000000000000003C00D0970100000068 +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F53000000000000000000000003C000C980100EA +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F570000000000000000000000000003C0048986F +:10F58000010000000000000000000000000000007A +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B00000000000000000000000000000003C000F +:10F5C000849801000000000000000000000000001E +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F600003C00C09801000000000000000000000065 +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000003C00FC9801000000000000000000E9 +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000003C00389901000000000000006C +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C0000000000000003C007499010000000000F0 +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000003C00B0990100000073 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F74000000000000000000000003C00EC990100F7 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000003C00289A7B +:10F790000100000000000000000000000000000068 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C00000000000000000000000000000003C00FD +:10F7D000649A01000000000000000000000000002A +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F810003C00A09A01000000000000000000000071 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000003C00DC9A01000000000000000000F5 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F89000000000003C00189B010000000000000078 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000003C00549B010000000000FC +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000003C00909B010000007F +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F95000000000000000000000003C00CC9B010003 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000003C00089C87 +:10F9A0000100000000000000000000000000000056 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D00000000000000000000000000000003C00EB +:10F9E000449C010000000000000000000000000036 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA20003C00809C0100000000000000000000007D +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA600000003C00BC9C0100000000000000000001 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA000000000003C00F89C010000000000000085 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000003C00349D01000000000008 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000003C00709D010000008B +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB6000000000000000000000003C00AC9D01000F +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000003C00E89D94 +:10FBB0000100000000000000000000000000000044 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE00000000000000000000000000000003C00D9 +:10FBF000249E010000000000000000000000000042 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC30003C00609E01000000000000000000000089 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC700000003C009C9E010000000000000000000D +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB000000000003C00D89E010000000000000091 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000003C00149F01000000000014 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000003C00509F0100000097 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD7000000000000000000000003C008C9F01001B +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000003C00C89FA0 +:10FDC0000100000000000000000000000000000032 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF00000000000000000000000000000003C00C7 +:10FE000004A001000000000000000000000000004D +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE40003C0040A001000000000000000000000095 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE800000003C007CA00100000000000000000019 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC000000000003C00B8A001000000000000009D +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF00000000000000003C00F4A001000000000020 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000003C0030A101000000A3 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF8000000000000000000000003C006CA1010027 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000003C00A8A1AC +:10FFD0000100000000000000000000000000000020 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:02000004800278 +:1000000000000000000000000000000000003C00B4 +:10001000E4A101000000000000000000000000005A +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:100050003C0020A2010000000000000000000000A1 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:1000900000003C005CA20100000000000000000025 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D000000000003C0098A20100000000000000A9 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:100110000000000000003C00D4A20100000000002C +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:1001500000000000000000003C0010A301000000AF +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000003C004CA3010033 +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D0000000000000000000000000003C0088A3B8 +:1001E000010000000000000000000000000000000E +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000003C00A2 +:10022000C4A3010000000000000000000000000066 +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:100260003C0000A4010000000000000000000000AD +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A00000003C003CA40100000000000000000031 +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000003C0078A40100000000000000B5 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:100320000000000000003C00B4A401000000000038 +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:1003600000000000000000003C00F0A401000000BC +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000003C002CA501003F +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E0000000000000000000000000003C0068A5C4 +:1003F00001000000000000000000000000000000FC +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000003C0090 +:10043000A4A5010000000000000000000000000072 +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:100470003C00E0A5010000000000000000000000BA +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B00000003C001CA6010000000000000000003D +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F000000000003C0058A60100000000000000C1 +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:100530000000000000003C0094A601000000000044 +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:1005700000000000000000003C00D0A601000000C8 +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000003C000CA701004B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F0000000000000000000000000003C0048A7D0 +:1006000001000000000000000000000000000000E9 +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000003C007E +:1006400084A701000000000000000000000000007E +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:100680003C00C0A7010000000000000000000000C6 +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C00000003C00FCA7010000000000000000004A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:10070000000000003C0038A80100000000000000CC +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:100740000000000000003C0074A801000000000050 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:1007800000000000000000003C00B0A801000000D4 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C000000000000000000000003C00ECA8010058 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:100800000000000000000000000000003C0028A9DB +:1008100001000000000000000000000000000000D7 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000003C006C +:1008500064A901000000000000000000000000008A +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890003C00A0A9010000000000000000000000D2 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D00000003C00DCA90100000000000000000056 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:10091000000000003C0018AA0100000000000000D8 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000003C0054AA0100000000005C +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:1009900000000000000000003C0090AA01000000E0 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D000000000000000000000003C00CCAA010064 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A10000000000000000000000000003C0008ABE7 +:100A200001000000000000000000000000000000C5 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A500000000000000000000000000000003C005A +:100A600044AB010000000000000000000000000096 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0003C0080AB010000000000000000000000DE +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE00000003C00BCAB0100000000000000000062 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B2000000000003C00F8AB0100000000000000E5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000003C0034AC01000000000068 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA00000000000000000003C0070AC01000000EC +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE000000000000000000000003C00ACAC010070 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C20000000000000000000000000003C00E8ACF4 +:100C300001000000000000000000000000000000B3 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C600000000000000000000000000000003C0048 +:100C700024AD0100000000000000000000000000A2 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0003C0060AD010000000000000000000000EA +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000003C009CAD010000000000000000006E +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D3000000000003C00D8AD0100000000000000F1 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000003C0014AE01000000000074 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB00000000000000000003C0050AE01000000F8 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF000000000000000000000003C008CAE01007C +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E30000000000000000000000000003C00C8AE00 +:100E400001000000000000000000000000000000A1 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E700000000000000000000000000000003C0036 +:100E800004AF0100000000000000000000000000AE +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0003C0040AF010000000000000000000000F6 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000003C007CAF0100000000000000000079 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F4000000000003C00B8AF0100000000000000FD +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000003C00F4AF01000000000081 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC00000000000000000003C0030B00100000004 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:10100000000000000000000000003C006CB0010087 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:101040000000000000000000000000003C00A8B00C +:10105000010000000000000000000000000000008F +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:1010800000000000000000000000000000003C0024 +:10109000E4B00100000000000000000000000000BB +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0003C0020B101000000000000000000000002 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000003C005CB10100000000000000000085 +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000003C0098B1010000000000000009 +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:101190000000000000003C00D4B10100000000008D +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D00000000000000000003C0010B20100000010 +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:10121000000000000000000000003C004CB2010093 +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:101250000000000000000000000000003C0088B218 +:10126000010000000000000000000000000000007D +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:1012900000000000000000000000000000003C0012 +:1012A000C4B20100000000000000000000000000C7 +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E0003C0000B30100000000000000000000000E +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000003C003CB30100000000000000000091 +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000003C0078B3010000000000000015 +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A0000000000000003C00B4B301000000000099 +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000003C00F0B3010000001D +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:10142000000000000000000000003C002CB401009F +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:101460000000000000000000000000003C0068B424 +:10147000010000000000000000000000000000006B +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A00000000000000000000000000000003C0000 +:1014B000A4B40100000000000000000000000000D3 +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F0003C00E0B40100000000000000000000001B +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000003C001CB5010000000000000000009D +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000003C0058B5010000000000000021 +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B0000000000000003C0094B5010000000000A5 +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000003C00D0B50100000029 +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:10163000000000000000000000003C000CB60100AB +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:101670000000000000000000000000003C0048B630 +:101680000100000000000000000000000000000059 +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B00000000000000000000000000000003C00EE +:1016C00084B60100000000000000000000000000DF +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:101700003C00C0B601000000000000000000000026 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:1017400000003C00FCB601000000000000000000AA +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:10178000000000003C0038B701000000000000002D +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000003C0074B7010000000000B1 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000003C00B0B70100000034 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:10184000000000000000000000003C00ECB70100B8 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000003C0028B83C +:101890000100000000000000000000000000000047 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C00000000000000000000000000000003C00DC +:1018D00064B80100000000000000000000000000EB +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:101910003C00A0B801000000000000000000000032 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:1019500000003C00DCB801000000000000000000B6 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:10199000000000003C0018B9010000000000000039 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000003C0054B9010000000000BD +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000003C0090B90100000040 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A5000000000000000000000003C00CCB90100C4 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000003C0008BA48 +:101AA0000100000000000000000000000000000035 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD00000000000000000000000000000003C00CA +:101AE00044BA0100000000000000000000000000F7 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B20003C0080BA0100000000000000000000003E +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B600000003C00BCBA01000000000000000000C2 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA000000000003C00F8BA010000000000000046 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE0000000000000003C0034BB010000000000C9 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000003C0070BB010000004C +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C6000000000000000000000003C00ACBB0100D0 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000003C00E8BB55 +:101CB0000100000000000000000000000000000023 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000003C00B8 +:101CF00024BC010000000000000000000000000003 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D30003C0060BC0100000000000000000000004A +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D700000003C009CBC01000000000000000000CE +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB000000000003C00D8BC010000000000000052 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF0000000000000003C0014BD010000000000D5 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000003C0050BD0100000058 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E7000000000000000000000003C008CBD0100DC +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000003C00C8BD61 +:101EC0000100000000000000000000000000000011 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000003C00A6 +:101F000004BE01000000000000000000000000000E +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40003C0040BE01000000000000000000000056 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F800000003C007CBE01000000000000000000DA +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC000000000003C00B8BE01000000000000005E +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:102000000000000000003C00F4BE010000000000E1 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:1020400000000000000000003C0030BF0100000064 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:10208000000000000000000000003C006CBF0100E8 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000003C00A8BF6D +:1020D00001000000000000000000000000000000FF +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000003C0093 +:10211000E4BF01000000000000000000000000001B +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:102150003C0020C001000000000000000000000062 +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:1021900000003C005CC001000000000000000000E6 +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D000000000003C0098C001000000000000006A +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:102210000000000000003C00D4C0010000000000ED +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:1022500000000000000000003C0010C10100000070 +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000003C004CC10100F4 +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D0000000000000000000000000003C0088C179 +:1022E00001000000000000000000000000000000ED +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000003C0081 +:10232000C4C1010000000000000000000000000027 +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:102360003C0000C20100000000000000000000006E +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A00000003C003CC201000000000000000000F2 +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E000000000003C0078C2010000000000000076 +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:102420000000000000003C00B4C2010000000000F9 +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:1024600000000000000000003C00F0C2010000007D +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000003C002CC3010000 +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E0000000000000000000000000003C0068C385 +:1024F00001000000000000000000000000000000DB +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000003C006F +:10253000A4C3010000000000000000000000000033 +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:102570003C00E0C30100000000000000000000007B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B00000003C001CC401000000000000000000FE +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F000000000003C0058C4010000000000000082 +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:102630000000000000003C0094C401000000000005 +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:1026700000000000000000003C00D0C40100000089 +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000003C000CC501000C +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F0000000000000000000000000003C0048C591 +:1027000001000000000000000000000000000000C8 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:1027300000000000000000000000000000003C005D +:1027400084C501000000000000000000000000003F +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780003C00C0C501000000000000000000000087 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C00000003C00FCC5010000000000000000000B +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:10280000000000003C0038C601000000000000008D +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000003C0074C601000000000011 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:1028800000000000000000003C00B0C60100000095 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C000000000000000000000003C00ECC6010019 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:102900000000000000000000000000003C0028C79C +:1029100001000000000000000000000000000000B6 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:1029400000000000000000000000000000003C004B +:1029500064C701000000000000000000000000004B +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990003C00A0C701000000000000000000000093 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000003C00DCC70100000000000000000017 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A1000000000003C0018C8010000000000000099 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000003C0054C80100000000001D +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A900000000000000000003C0090C801000000A1 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD000000000000000000000003C00CCC8010025 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B10000000000000000000000000003C0008C9A8 +:102B200001000000000000000000000000000000A4 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B500000000000000000000000000000003C0039 +:102B600044C9010000000000000000000000000057 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0003C0080C90100000000000000000000009F +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000003C00BCC90100000000000000000023 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C2000000000003C00F8C90100000000000000A6 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000003C0034CA01000000000029 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA00000000000000000003C0070CA01000000AD +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE000000000000000000000003C00ACCA010031 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D20000000000000000000000000003C00E8CAB5 +:102D30000100000000000000000000000000000092 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D600000000000000000000000000000003C0027 +:102D700024CB010000000000000000000000000063 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0003C0060CB010000000000000000000000AB +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000003C009CCB010000000000000000002F +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E3000000000003C00D8CB0100000000000000B2 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000003C0014CC01000000000035 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB00000000000000000003C0050CC01000000B9 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF000000000000000000000003C008CCC01003D +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000003C00C8CCC1 +:102F40000100000000000000000000000000000080 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F700000000000000000000000000000003C0015 +:102F800004CD01000000000000000000000000006F +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0003C0040CD010000000000000000000000B7 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000003C007CCD010000000000000000003A +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:10304000000000003C00B8CD0100000000000000BE +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000003C00F4CD01000000000042 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C00000000000000000003C0030CE01000000C5 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:10310000000000000000000000003C006CCE010048 +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:103140000000000000000000000000003C00A8CECD +:10315000010000000000000000000000000000006E +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:1031800000000000000000000000000000003C0003 +:10319000E4CE01000000000000000000000000007C +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D0003C0020CF010000000000000000000000C3 +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000003C005CCF0100000000000000000046 +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000003C0098CF0100000000000000CA +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:103290000000000000003C00D4CF0100000000004E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000003C0010D001000000D1 +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:10331000000000000000000000003C004CD0010054 +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:103350000000000000000000000000003C0088D0D9 +:10336000010000000000000000000000000000005C +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:1033900000000000000000000000000000003C00F1 +:1033A000C4D0010000000000000000000000000088 +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E0003C0000D1010000000000000000000000CF +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:1034200000003C003CD10100000000000000000052 +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000003C0078D10100000000000000D6 +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A0000000000000003C00B4D10100000000005A +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000003C00F0D101000000DE +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000003C002CD2010060 +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:103560000000000000000000000000003C0068D2E5 +:10357000010000000000000000000000000000004A +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A00000000000000000000000000000003C00DF +:1035B000A4D2010000000000000000000000000094 +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F0003C00E0D2010000000000000000000000DC +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:1036300000003C001CD3010000000000000000005E +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000003C0058D30100000000000000E2 +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B0000000000000003C0094D301000000000066 +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000003C00D0D301000000EA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:10373000000000000000000000003C000CD401006C +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000003C0048D4F1 +:103780000100000000000000000000000000000038 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B00000000000000000000000000000003C00CD +:1037C00084D40100000000000000000000000000A0 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:103800003C00C0D4010000000000000000000000E7 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:1038400000003C00FCD4010000000000000000006B +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:10388000000000003C0038D50100000000000000EE +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C0000000000000003C0074D501000000000072 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000003C00B0D501000000F5 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:10394000000000000000000000003C00ECD5010079 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000003C0028D6FD +:103990000100000000000000000000000000000026 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000003C00BB +:1039D00064D60100000000000000000000000000AC +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A10003C00A0D6010000000000000000000000F3 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A500000003C00DCD60100000000000000000077 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A9000000000003C0018D70100000000000000FA +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD0000000000000003C0054D70100000000007E +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000003C0090D70100000001 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B5000000000000000000000003C00CCD7010085 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000003C0008D809 +:103BA0000100000000000000000000000000000014 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000003C00A9 +:103BE00044D80100000000000000000000000000B8 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20003C0080D8010000000000000000000000FF +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C600000003C00BCD80100000000000000000083 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA000000000003C00F8D8010000000000000007 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE0000000000000003C0034D90100000000008A +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D200000000000000000003C0070D9010000000D +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D6000000000000000000000003C00ACD9010091 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000003C00E8D916 +:103DB0000100000000000000000000000000000002 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000003C0097 +:103DF00024DA0100000000000000000000000000C4 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30003C0060DA0100000000000000000000000B +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E700000003C009CDA010000000000000000008F +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB000000000003C00D8DA010000000000000013 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF0000000000000003C0014DB01000000000096 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F300000000000000000003C0050DB0100000019 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F7000000000000000000000003C008CDB01009D +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000003C00C8DB22 +:103FC00001000000000000000000000000000000F0 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000003C0085 +:1040000004DC0100000000000000000000000000CF +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040003C0040DC01000000000000000000000017 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:1040800000003C007CDC010000000000000000009B +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C000000000003C00B8DC01000000000000001F +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:104100000000000000003C00F4DC010000000000A2 +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:1041400000000000000000003C0030DD0100000025 +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000003C006CDD0100A9 +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C0000000000000000000000000003C00A8DD2E +:1041D00001000000000000000000000000000000DE +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000003C0072 +:10421000E4DD0100000000000000000000000000DC +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:104250003C0020DE01000000000000000000000023 +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:1042900000003C005CDE01000000000000000000A7 +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D000000000003C0098DE01000000000000002B +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:104310000000000000003C00D4DE010000000000AE +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:1043500000000000000000003C0010DF0100000031 +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000003C004CDF0100B5 +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D0000000000000000000000000003C0088DF3A +:1043E00001000000000000000000000000000000CC +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:1044100000000000000000000000000000003C0060 +:10442000C4DF0100000000000000000000000000E8 +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:104460003C0000E00100000000000000000000002F +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A00000003C003CE001000000000000000000B3 +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E000000000003C0078E0010000000000000037 +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:104520000000000000003C00B4E0010000000000BA +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:1045600000000000000000003C00F0E0010000003E +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000003C002CE10100C1 +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E0000000000000000000000000003C0068E146 +:1045F00001000000000000000000000000000000BA +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:1046200000000000000000000000000000003C004E +:10463000A4E10100000000000000000000000000F4 +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:104670003C00E0E10100000000000000000000003C +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000003C001CE201000000000000000000BF +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F000000000003C0058E2010000000000000043 +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000003C0094E2010000000000C6 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:1047700000000000000000003C00D0E2010000004A +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B000000000000000000000003C000CE30100CD +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F0000000000000000000000000003C0048E352 +:1048000001000000000000000000000000000000A7 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:1048300000000000000000000000000000003C003C +:1048400084E3010000000000000000000000000000 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880003C00C0E301000000000000000000000048 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000003C00FCE301000000000000000000CC +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:10490000000000003C0038E401000000000000004E +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000003C0074E4010000000000D2 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:1049800000000000000000003C00B0E40100000056 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C000000000000000000000003C00ECE40100DA +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A00000000000000000000000000003C0028E55D +:104A10000100000000000000000000000000000095 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A400000000000000000000000000000003C002A +:104A500064E501000000000000000000000000000C +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90003C00A0E501000000000000000000000054 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000003C00DCE501000000000000000000D8 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B1000000000003C0018E601000000000000005A +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000003C0054E6010000000000DE +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B900000000000000000003C0090E60100000062 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD000000000000000000000003C00CCE60100E6 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000003C0008E769 +:104C20000100000000000000000000000000000083 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C500000000000000000000000000000003C0018 +:104C600044E7010000000000000000000000000018 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0003C0080E701000000000000000000000060 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000003C00BCE701000000000000000000E4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D2000000000003C00F8E7010000000000000067 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000003C0034E8010000000000EA +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA00000000000000000003C0070E8010000006E +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE000000000000000000000003C00ACE80100F2 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000003C00E8E876 +:104E30000100000000000000000000000000000071 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E600000000000000000000000000000003C0006 +:104E700024E9010000000000000000000000000024 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB0003C0060E90100000000000000000000006C +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000003C009CE901000000000000000000F0 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F3000000000003C00D8E9010000000000000073 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000003C0014EA010000000000F6 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000003C0050EA010000007A +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF000000000000000000000003C008CEA0100FE +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000003C00C8EA82 +:10504000010000000000000000000000000000005F +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:1050700000000000000000000000000000003C00F4 +:1050800004EB010000000000000000000000000030 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C0003C0040EB01000000000000000000000078 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:1051000000003C007CEB01000000000000000000FB +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000003C00B8EB01000000000000007F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:105180000000000000003C00F4EB01000000000003 +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000003C0030EC0100000086 +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000003C006CEC010009 +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:105240000000000000000000000000003C00A8EC8E +:10525000010000000000000000000000000000004D +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:1052800000000000000000000000000000003C00E2 +:10529000E4EC01000000000000000000000000003D +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D0003C0020ED01000000000000000000000084 +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:1053100000003C005CED0100000000000000000007 +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000003C0098ED01000000000000008B +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:105390000000000000003C00D4ED0100000000000F +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000003C0010EE0100000092 +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000003C004CEE010015 +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:105450000000000000000000000000003C0088EE9A +:10546000010000000000000000000000000000003B +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:1054900000000000000000000000000000003C00D0 +:1054A000C4EE010000000000000000000000000049 +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E0003C0000EF01000000000000000000000090 +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:1055200000003C003CEF0100000000000000000013 +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000003C0078EF010000000000000097 +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A0000000000000003C00B4EF0100000000001B +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000003C00F0EF010000009F +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000003C002CF0010021 +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:105660000000000000000000000000003C0068F0A6 +:105670000100000000000000000000000000000029 +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000003C00BE +:1056B000A4F0010000000000000000000000000055 +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F0003C00E0F00100000000000000000000009D +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:1057300000003C001CF1010000000000000000001F +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:10577000000000003C0058F10100000000000000A3 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B0000000000000003C0094F101000000000027 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000003C00D0F101000000AB +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:10583000000000000000000000003C000CF201002D +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000003C0048F2B2 +:105880000100000000000000000000000000000017 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000003C00AC +:1058C00084F2010000000000000000000000000061 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900003C00C0F2010000000000000000000000A8 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:1059400000003C00FCF2010000000000000000002C +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:10598000000000003C0038F30100000000000000AF +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C0000000000000003C0074F301000000000033 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A000000000000000000003C00B0F301000000B6 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A4000000000000000000000003C00ECF301003A +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000003C0028F4BE +:105A90000100000000000000000000000000000005 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000003C009A +:105AD00064F401000000000000000000000000006D +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10003C00A0F4010000000000000000000000B4 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B500000003C00DCF40100000000000000000038 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B9000000000003C0018F50100000000000000BB +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD0000000000000003C0054F50100000000003F +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C100000000000000000003C0090F501000000C2 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C5000000000000000000000003C00CCF5010046 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000003C0008F6CA +:105CA00001000000000000000000000000000000F3 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000003C0088 +:105CE00044F6010000000000000000000000000079 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20003C0080F6010000000000000000000000C0 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D600000003C00BCF60100000000000000000044 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA000000000003C00F8F60100000000000000C8 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE0000000000000003C0034F70100000000004B +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E200000000000000000003C0070F701000000CE +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E6000000000000000000000003C00ACF7010052 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA0000000000000000000000000003C00E8F7D7 +:105EB00001000000000000000000000000000000E1 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000003C0076 +:105EF00024F8010000000000000000000000000085 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30003C0060F8010000000000000000000000CC +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F700000003C009CF80100000000000000000050 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB000000000003C00D8F80100000000000000D4 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF0000000000000003C0014F901000000000057 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:1060300000000000000000003C0050F901000000DA +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:10607000000000000000000000003C008CF901005E +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B0000000000000000000000000003C00C8F9E3 +:1060C00001000000000000000000000000000000CF +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000003C0064 +:1061000004FA010000000000000000000000000090 +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:106140003C0040FA010000000000000000000000D8 +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:1061800000003C007CFA010000000000000000005C +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C000000000003C00B8FA0100000000000000E0 +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:106200000000000000003C00F4FA01000000000063 +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:1062400000000000000000003C0030FB01000000E6 +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000003C006CFB01006A +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C0000000000000000000000000003C00A8FBEF +:1062D00001000000000000000000000000000000BD +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:1063000000000000000000000000000000003C0051 +:10631000E4FB01000000000000000000000000009D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:106350003C0020FC010000000000000000000000E4 +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000003C005CFC0100000000000000000068 +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D000000000003C0098FC0100000000000000EC +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:106410000000000000003C00D4FC0100000000006F +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:1064500000000000000000003C0010FD01000000F2 +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:10649000000000000000000000003C004CFD010076 +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D0000000000000000000000000003C0088FDFB +:1064E00001000000000000000000000000000000AB +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:1065100000000000000000000000000000003C003F +:10652000C4FD0100000000000000000000000000A9 +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:106560003C0000FE010000000000000000000000F0 +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000003C003CFE0100000000000000000074 +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E000000000003C0078FE0100000000000000F8 +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:106620000000000000003C00B4FE0100000000007B +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:1066600000000000000000003C00F0FE01000000FF +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A000000000000000000000003C002CFF010082 +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E0000000000000000000000000000C0068FF37 +:1066F00001000000000000000000000000003C005D +:106700000010040070B52B4806218175C175017E0B +:10671000490849000176017E02229143017626490B +:106720000B785B085B000B7004238B700C234376A3 +:10673000202303751A244475242484761024C476F7 +:106740003C003C1004002A254D70057A3026B543E4 +:1067500020350572857A6D086D008572857A9543BE +:106760008572857A042635438572857A08263543F5 +:106770008572857AA5438572057B2C430473047B5F +:106780001C433C00781004000473047B40252C4318 +:106790000473847A23438372837AAB438372037BCB +:1067A00080242343037308789043087008780122FB +:1067B00010430870087804229043087070BD0000F0 +:1067C0000C8007003C00B4100400808007000149E1 +:1067D00004204873704740800700034980B50020BB +:1067E000088000F00AFB80BD0000FC6B01007047D0 +:1067F000000080B500F067FB80BD80B50A49182015 +:10680000C1F73BFA09493C00F01004000220C1F72F +:1068100037FA08491F20C1F733FA07491C20C1F78E +:106820002FFA06490320C1F72BFA80BD992A0000F0 +:1068300041250000552500005D2500003925000098 +:1068400080B5BFF791FD80BD3C002C11040080B5E0 +:10685000054A05490A20BFF74EFF0120044980027E +:106860000860486080BDB4740100B164000000108D +:10687000070080B500F091FE80BD80B5054A05494E +:106880001B20BFF738FF012004493C0068110400B9 +:10689000C0060860486080BDB87401002D6E00001D +:1068A0000010070080B5044800F080FE0349002076 +:1068B0004860886080BD0000414B0000BC7401004E +:1068C00080B5C5F7D5FECEF7D9F803493C00A41131 +:1068D0000400086003490A20D1F7EFF880BDBC74BA +:1068E0000100496E000080B5012220210620C8F772 +:1068F00056FCBFF770FE03490020086020210248C3 +:10690000BFF763F980BDCC5C0100646D01003C0001 +:10691000E0110400084880B50068002805D006484A +:106920005430426A0021BFF7F3F8044A04490320B7 +:10693000BFF7ACFD80BD0000506D010089980000DC +:106940009198000080B500F003F800F019F880BDC0 +:106950003C001C12040010B5094C6021201CBFF73C +:106960003AF90020C043A0602060FF200230E0849C +:106970002022201C40300249BFF75BF910BD0010F7 +:1069800007007052010000200A49C0438860094B8B +:106990000A493C0058120400002082000130000621 +:1069A000000E20289950F8D30649044A081C1030DC +:1069B000083A03C27047000000100700E07E0100A3 +:1069C0007575000000A00700044800210022002384 +:1069D0000EC00C383C009412040001214160704745 +:1069E0000000707801007047000003480021002279 +:1069F00000230EC008C070470000885A01000449F7 +:106A000080B500204861024840211C30BFF7E9F8FA +:106A100080BDFC5A01003C00D012040080B5CEF7C6 +:106A20003FF80349886103490320D1F755F880BD39 +:106A3000FC5A01000D17010080B5C0F7A5F980BD13 +:106A4000FEB56C4900200090C8786B4C6B4F430733 +:106A5000C006C017DB0EE3583C000C1304000130E5 +:106A600038623B61081C8078664E03224107A036DD +:106A70000296490F3172890061583C1C6161019195 +:106A8000C006C00F7862201C002787610020211CEF +:106A9000C86159485949007809793C0048130400F5 +:106AA0005A4C4E07760F711C8C46B1008E465649E3 +:106AB0008031002824D0524F01287F781AD0022834 +:106AC00071D14F48002F0CD0012F6CD140794D4D22 +:106AD0004007400F8200AA584B4D01303C00841300 +:106AE0000400EA61A07304224B48484DC8614A483B +:106AF000002F00D04A482F1C11E04248002F55D1EA +:106B00000770022747703F484078002810D00128BE +:106B100001D002284AD13F483D4FC8613F483C0060 +:106B2000C013040088613A4970460858351CB861A2 +:106B30006046607304E03C48022288613B48C861BB +:106B40000020324906E00E18B6787607760F042E3C +:106B50002FD801309042F6D3C8792E4FC007C00F0E +:106B60003C00FC130400F86033484168194341605D +:106B7000816819438160019AB9698C461143FA69A9 +:106B8000866811438E4386604668314341600199AF +:106B90000B43181C614608431043011C00220220CD +:106BA000C7F73C003814040003FA1E4E403E7078CC +:106BB000C008C00028437070701C017800E029E014 +:106BC0000825A94301700120C043B08000210120A5 +:106BD000CFF76CFC301C8030817809090901817085 +:106BE0000F2101703C0074140400164A69041160FE +:106BF0005160029E1021327A7B6A002B00D1002165 +:106C000011432173817829438170E0780121084381 +:106C1000E070D2F7F2F9012000900098FEBDC05755 +:106C200001006C4301003C00B0140400A46C01009E +:106C300040900700C91D0000811D0000A51D000037 +:106C4000991D0000F11D0000100007000010070052 +:106C50000349002088620870487008710862704714 +:106C6000AC7E010080B501213C00EC140400002042 +:106C7000CDF769FF80BDB0B50F48C0F718FC0E4DC9 +:106C8000032028700D490D480C3948600D480A4C06 +:106C9000886040211834201CBEF7C1FFFF216868BE +:106CA000090608432060FF2106223C002815040045 +:106CB000201DBFF779F80120E060B0BDC0A8130A1D +:106CC000206E0100C0A81301FFFFFF0080B502493C +:106CD0000120C8F745FF80BD9D1C000098B50C4CF5 +:106CE00000206060E0600B4B0B4982003C006415A3 +:106CF0000400013020289950FADB6A460949052032 +:106D0000BFF72FFD0020C043206006492020086007 +:106D1000486098BD00000040070030740100A9756C +:106D20000000B59F000000100700054900203C004E +:106D3000A0150400086005488178282291438170DD +:106D40008178114381707047786E01000000070060 +:106D500070470000414810B50068022188433F4950 +:106D60000860081C0068022108433C4908603C4850 +:106D70003C00DC1504004068802188433A494860A3 +:106D8000081C006880210843374908603748017AA9 +:106D9000012421430172017A022211430172017A16 +:106DA000042291430172017A082211430172017B8E +:106DB00021433C00181604000173017B0222114399 +:106DC0000173017B042211430173017B08221143EB +:106DD00001732E214173817B3822914328318173C5 +:106DE00020214174817BC908C900033181732221AC +:106DF000C17320493C0054160400097A41721E49AF +:106E0000497A01743C220277011C10314A735023E5 +:106E10008B735A23CB730D23011C20310B70174B3E +:106E200043840E234B7000214182302101700521E3 +:106E30004170042141713C00901604008471C471BA +:106E40000C210171F82141800F49CA728A72032214 +:106E50000A7209224A7208220A73027A40231A43EC +:106E600002724C73FFF7A2FC0848017821430170BD +:106E700010BD0000F00007003C00CC160400F40038 +:106E800007000C800700764601002409000080807E +:106E90000700A080070080B518210948BEF7D7FE7B +:106EA000084800213C3841608160C1600161416156 +:106EB000816101210162FFF75CFF3C0008170400BB +:106EC000C0F76CFF80BD0000247E0100B0B52148F2 +:106ED000006840081F4940000860081C0068012144 +:106EE00008431C4908601C4A1079012108431071AD +:106EF000107902218843107100F06CF83C004417AF +:106F00000400107A012108431072107AFE21884390 +:106F10000A301072282090725A20D072114D14201D +:106F200028772C1C1034A0731620A8751820E8753B +:106F3000FFF7A1FC0C486886E07B4006400E3C0051 +:106F4000801704000E210843E073E07B8021084392 +:106F5000E07307484179042211434171B0BD00003C +:106F6000F00007000080070030800700FF010000EC +:106F70005000070080B5FFF7AFFF00201449C04361 +:106F80003C00BC1704008860C1F70BF913490020CE +:106F90004862C860486108618861C8610F4B086237 +:106FA0000F4A086338331A8001225A710B4A403263 +:106FB000D0601360082313815060094A8A62FF225F +:106FC0000A703C00F81704004870054800210022B0 +:106FD000503000230EC0C1F7FFF880BD003007001D +:106FE000046C0100BEBA0000857500000348102142 +:106FF00081710221C1713021417270470080070008 +:10700000704700003C003418040000B5C1F7DBFBFA +:1070100000BD7047000080B5CDF787FD014988604D +:1070200080BD50D9010080B506210548BEF7FDFDA1 +:10703000044900200439086000F067F800F003F804 +:1070400080BDEC6701003C007018040010B5074CCF +:107050002C21201CBEF710FE0120207003490020C7 +:107060001C39C8600861886110BD000078690100A2 +:1070700080B5CDF75DFD0949886009490820D0F742 +:1070800073FD08490920D0F73C00AC1804006FFDDF +:1070900007491120D0F76BFD0648C2F774F980BD8F +:1070A00000007869010021350000A1380000453456 +:1070B0000000BD26010080B586B00F48C4F745F931 +:1070C00000F045F8FFF7D7FFFFF73C00E818040091 +:1070D000ABFF0C490320D0F74DFD0B4869460090EB +:1070E0000020019009480490094802900948039043 +:1070F000094805900020C4F7CFF806B080BD000015 +:10710000F467010045350000953200003C00241969 +:107110000400A07D0100FD320000CD310000457D5E +:10712000010010B5CDF7D5FC0948094C302160614C +:1071300008487430BEF7A9FD0020A062064920610E +:10714000E1636064A06414212165606210BD3C00AD +:1071500060190400B9750000447D0100701700003B +:1071600080B502210920044AD1F7E8FECDF7ECFCF6 +:107170000249086380BD000039390000447D0100E8 +:1071800080B5AC210348BEF783FD00F051F800F054 +:107190003C009C19040049F880BDA46C010008B5AE +:1071A00000F04DF800F045F800211620184AD1F7FC +:1071B000C8FE174A0421101C403001700021817064 +:1071C0001121C18014490181101C8030C17808222E +:1071D00091433C00D8190400C170C1781143C170BB +:1071E0006A460F491420BFF7F5FA0E490720D0F779 +:1071F000CDFC0D490F20D0F7C9FCCDF7ABFC0B49F6 +:1072000008600A4844388068002802D00020C6F789 +:107210006FF908BD3C00141A0400B53B0000009053 +:107220000700E7FD00008D410000CD480000D9496E +:107230000000A46C010080B500F06FFC80BD7047B9 +:10724000000080B500F061FC80BD70470000B0B563 +:1072500030210C48BEF73C00501A040025FD0B4CB1 +:1072600000250A48843C3822032170386560BEF747 +:10727000DDFD0648382201213838BEF7D7FD0E2043 +:10728000A5606070207000F01DF8B0BD946701002B +:10729000044900B5012048603C008C1A0400886055 +:1072A000C860C3F7F8FF00BD0000D467010080B5D7 +:1072B00002210A20024AD1F750FE80BD00001D5A6B +:1072C000000080B500F005F880BD80B500F0FDFB42 +:1072D00080BD80B502490420D0F73C00C81A0400E4 +:1072E00061FC80BD651F000000211748C94380B5BF +:1072F000164B0170181C102220300271002210332E +:107300009A73427904231A434271427918239A43AB +:1073100008324271081CD7F759F800283C00041BBA +:10732000040003D101219A20BFF7CBFB502009496B +:1073300050220A60C8608860486008610120486186 +:107340000020D7F7D8F80449FF20086080BDF46B0F +:1073500001003000070004020700F47401003C0043 +:10736000401B040080B5D7F7FBF880BD10B5FFF7D0 +:10737000ABFBBFF7DDFB8148CDF798FA0024231C57 +:1073800004220421002001F039FA002801D0BFF7BF +:10739000C9FB231C0022FF21002001F02FFA002846 +:1073A0003C007C1B040001D0BFF7BFFB231C002264 +:1073B000FF21002001F025FA002801D0BFF7B5FB1E +:1073C000C4F727FF704884706F497F2088706E492A +:1073D0000C60032008606B4844706C480480694866 +:1073E000C0783C00B81B0400082108436749C870F6 +:1073F000081CC078042108436449C87001F07EFA73 +:10740000FFF77EFFFFF72CFE01F046FBFFF718FBAE +:1074100001F052FAFFF782FB5F48C16810229143E6 +:10742000C16001693C00F41B04005D4A1143016125 +:107430000169D20A91430161C1685A4A1143C1608E +:10744000816A594A1143816200F077F901F01FF80F +:1074500000F093FA01F099FB00F0F1FF00F099FCC5 +:1074600000F0DDFC00F03C00301C040083FCFFF762 +:10747000B3FC01F031FA01F071FAFFF787FAFFF778 +:107480009BFA012101204B4AD1F77CFD012102200A +:10749000494AD1F777FD02210320484AD1F772FD0E +:1074A00002210420464AD1F73C006C1C04006DFD0B +:1074B00002210520454AD1F768FD02210620434AF2 +:1074C000D1F763FD01210720424AD1F75EFD022179 +:1074D0001720404AD1F759FD022108203F4AD1F731 +:1074E00054FDFFF7C8FD3D4804603C00A81C0400A3 +:1074F0004460FFF717FAFFF709FAFFF74FFC00F0B7 +:1075000043F9FFF733FAFFF7FBFA01F085F801F0D2 +:10751000EBF901F023FA01F071F900F0E3FFFFF756 +:107520006FFA00F0AFF900F0BDF900F03C00E41C88 +:107530000400ADFC00F09BFEFFF7CDFAFFF7ABFEB9 +:1075400000F0C3F9FFF7ABFD00F08DFF00F021FF65 +:1075500000F065F900F097F900F0FDFE00F0E5FE9F +:1075600000F03FF900F073F9FFF737FE00F03C0040 +:10757000201D040021F900F073FBFFF7E5FB00F08C +:10758000D3FBFFF7A9FE00F0BBFB00F009FF00F002 +:10759000DBF91848C9F756F81748C9F72BF8002245 +:1075A0000121F020D1F72EFD002010BDA9690000B7 +:1075B0003C005C1D040000000700F00007002C00E8 +:1075C0000700001007003C000800C03F7438FCDFD3 +:1075D0007F3855690000E5130000610C00006D0C58 +:1075E00000003D0C0000F10D0000C53300003D0F10 +:1075F00000003C00981D0400ADD80000800007008A +:10760000505701000440010080B501F0A9F900F0D5 +:10761000C9F8FFF7C5FE01F003FB01F093FAFFF78D +:10762000CBF92C48FFF7E8F900F0AAF800F058FF72 +:10763000FFF734FD3C00D41D0400FFF7F2FBFFF719 +:107640007AFAFFF700FA00F034F900F03CF901F0A3 +:10765000E2F8FFF77AF9FFF772F9FFF79AF901F00C +:1076600066F901F08EF901F0E0F800F006FF00F095 +:10767000F0FB00F046FB3C00101E040000F0BCFFD5 +:1076800000F0E4FC00F020FEFFF740FAFFF746FEB2 +:10769000FFF756FD00F02CF900F0FAFE00F08AFE2C +:1076A00000F0D4F800F0B4F800F078FE00F04EFEE0 +:1076B00000F0DEF8FFF7ACFD3C004C1E040000F0CB +:1076C0008CF800F0F8FAFFF776FBFFF720FE01F0E8 +:1076D000A6FA00F048FB00F07CFE00F05CF9BEF773 +:1076E00057FD002080BD803801000149002008605E +:1076F0007047A87E010010B5041C3C00881E0400E1 +:1077000001D1BFF739FA0F487D21C900846001809B +:107710000D490161802141800021C16001620B4857 +:1077200041801421818007214181064A4623043289 +:107730000524137054700A21917081763C00C41E98 +:1077400004000376048110BD0000C87401000087A6 +:10775000930330000700094880B50169426911436D +:107760008269C0691143014300220320C6F7BFFCB0 +:10777000CCF71BFA0020C2F792F980BD00003C0054 +:10778000001F0400A46C0100054880B50021816041 +:107790000221C16003394160C7F73AFF80BD000094 +:1077A0004020070008B56A4604491520BFF754F881 +:1077B0000120034940050860486008BDA52101007B +:1077C0003C003C1F04000010070070470000064802 +:1077D00080B58068C001800F05D10322C143C6F780 +:1077E000BAFCD6F700FE80BD00001000070070470D +:1077F000000080B502212A20064AD1F7EAFB0022C8 +:1078000007203C00781F04000449BEF7EDFE044841 +:10781000C7F758FC80BD00008D890000D59B000093 +:107820001046010002480021002200230EC07047CC +:10783000806E010080B502212C20064AD1F7CCFBD6 +:10784000002200203C00B41F04000449BEF7CFFE14 +:1078500004490220C8F70BFA80BD058A0000E99BA5 +:107860000000B18B000002480021002200230EC05E +:1078700070471075010080B502212B20044AD1F712 +:10788000AEFB002202203C00F01F04000249BEF7BC +:10789000B1FE80BD2D8A00008D8C00007047000075 +:1078A00080B502212D20074AD1F79CFB0022012040 +:1078B0000549BEF79FFE0548CBF756FA0448CCF7BA +:1078C000F7F880BDAD8A00003C002C20040021E2C6 +:1078D0000000F9DF00002044010070470000024969 +:1078E00000200860012048607047AC79010080B535 +:1078F00002490D20D0F79BF980BD619800007047C8 +:10790000000080B5CDF777F903493C0068200400FA +:107910000860011C0248CDF797F980BDA8790100E5 +:10792000C460010080B500F029F880BD80B586B044 +:107930000C48C3F76DFDD6F7D3FB0B480D490090FB +:107940000A48049101900A48694602903C00A4202C +:1079500004000020039005900120C3F700FD0749B3 +:107960000320D0F76AF906B080BD20F70100118727 +:107970000100958701005587010098D901006D87A6 +:10798000010080B50120D6F790FC034900203C009F +:10799000E02004000860486002481439486080BD57 +:1079A00090D901003D82010070B50026094C094DB7 +:1079B0002660666044215035281CA661BEF7C8F9D0 +:1079C0001420E060E8632820E861A06028642E703D +:1079D0003C001C21040070BD0000A46E010080B5B5 +:1079E00002211820044AD1F70CFB03490820D0F7E4 +:1079F0002AF980BD0000159C0000699C0000FEB5BE +:107A0000264D2878C0070CD425490020087028701E +:107A100024483C00582104008178490849008170BD +:107A200081780122114381700024FF261F4F013607 +:107A3000211C01A8C6F732F800AB187901281FD025 +:107A4000022819D003281ED1B8680021B043B860BD +:107A5000786830433C009421040078603A683240F2 +:107A6000A02005E03B683340934201D0012101E0B2 +:107A70000138F7D27868B0437860002903D001A8B4 +:107A800000F027FF02E001A800F045FF01342406C2 +:107A90002416062CCFDB3C00D0210400044902222E +:107AA0000878104308702870FEBD0000040007002D +:107AB000E06001000000070010000700B0B50020E2 +:107AC00015231449012542008D54521801300E2807 +:107AD0005370F8D30F481C223C000C2204001C38C1 +:107AE000BEF773F90D480E212A38BEF71CF90B4971 +:107AF000002008600B4C2A21201CBEF714F92570C9 +:107B00000E2060701720A070074853210170452196 +:107B1000417020218170B0BD00003C00482204006B +:107B2000E6780100E4620100EB620100E862010016 +:107B30000C490D48002241600C4981600C49C1602C +:107B40000C4901610C4941610C498261C1610C49D8 +:107B500001620C4941620C4981620C493C0084225B +:107B60000400C162C26370470000C9750000287A32 +:107B70000100C17500008175000099750000CD7588 +:107B800000008975000091750000B57500008D75C5 +:107B90000000C5750000B0B50E480E4908603C00F5 +:107BA000C02204000831C0F743FE0C49002548609C +:107BB0000B480A4C05600B48803C05601020207182 +:107BC000E070A07160712720C043C3F7F7FB282045 +:107BD000C3F7FCFB2572B0BDFF3F00002C7D010008 +:107BE0003C00FC2204001C6701002067010080B5F6 +:107BF0002C210148BEF7C7F880BD3C7E010080B54E +:107C000038210148BEF7BFF880BD687E010080B50D +:107C100002210E20024AD1F70CFA80BD000021E0BB +:107C200000003C003823040070470000F0B585B028 +:107C3000002700AB2F4E1F8100250024281CD6F7FB +:107C4000A1FB022D03D1D6F7F5FA00280CD00124B0 +:107C5000012D03D1072000AB187101E000AB1F71AB +:107C600000AB18793C0074230400D6F708FC002C04 +:107C700039D0082103A8D6F7F2FA00AB187BFE280A +:107C800031D1587B01282AD1022102A8D6F7E7FA80 +:107C900000AB1889002826D018891849884222D0BC +:107CA00019890020BFF73C00B023040013F9041C1D +:107CB000006900AB1989D6F7D5FA206800AB1A899C +:107CC000011C0831083ACBF7A1F9002806D0022898 +:107CD00004D0022194203760BEF762FF201CBFF75A +:107CE000C7F8D4E7012194203C00EC230400BEF740 +:107CF0005AFFD5F726FF01352D062D0E042DA5D3ED +:107D000005B0F0BD000058570100FFFF00000A4811 +:107D10000021021C183280B5094B02E0016083800B +:107D200008308242FAD104486C213C002824040027 +:107D30006C38BEF737F804490220C7F7D1FF80BD81 +:107D40007C790100FC0500009D75000080B50221D2 +:107D500026200D4AD1F77CF90C48C8F773FF0C4870 +:107D6000C8F776FF0B491020CFF794FF3C0064243E +:107D700004000A490C20CFF790FF09490020C7F7FB +:107D8000B2FFCCF76EFF0749086080BD00009DA6DA +:107D90000000A9A4000081A4000031A70000B96D73 +:107DA0000000BDA600000C790100024908783C00E3 +:107DB000A0240400400840000870704758000700E5 +:107DC0000021084880B541618161017041704160C6 +:107DD00081601422C26001614262C161FFF704F850 +:107DE00080BD00001C75010080B502211D20044AE1 +:107DF0003C00DC240400D1F734F903490820CFF714 +:107E000052FF80BD000011E3000009E4000080B5CE +:107E1000012125200A4AD1F724F9CCF728FF084987 +:107E2000086208490120CFF73EFF07490220CFF73B +:107E30003AFF3C0018250400FEF7E6FF0548C1F7AD +:107E4000E1F980BD29A900001C750100A1AA00006C +:107E50002D19000045A8000010B5064C0C22227018 +:107E6000A0180549BDF7D8FF0020C8F785FB012001 +:107E7000A06010BD3C0054250400A4690100905787 +:107E80000100B0B51F4C00256580012020700A203C +:107E9000A0809020E08030202081902060813020E0 +:107EA000A0811748042207211230BEF74CF814486D +:107EB0000422052116303C0090250400BEF746F848 +:107EC0001248114AE08120827032157055700020EE +:107ED0003C23410143438918F4319B1801300428A5 +:107EE0005960F5DB084806221A300949BDF79AFFA8 +:107EF0000748054C0C300FC83C00CC25040020344A +:107F00000FC42021201CBDF762FFB0BD0000F86047 +:107F100001002C090000584001007047000007488C +:107F200010B50068002808D00648BEF79CFE041C67 +:107F3000FFF79DFE201CBEF796FE3C0008260400BD +:107F400010BD000058570100B5AD0000044980B5D0 +:107F50000020887002212020024AD1F791F880BDCC +:107F6000B479010025B5000080B5CCF78FFE01493A +:107F7000486180BDB479010080B518213C004426D9 +:107F800004001448BDF729FF1448012101700021A5 +:107F9000C1604170016100F002F900F0AAF800F040 +:107FA0001EF800F0BAF900F0CCF900F020F900F06A +:107FB00064F900F0CEF900F0FCF800F082F93C0022 +:107FC0008026040000F028F800F06EF800F04AF86F +:107FD000FFF7C2FF00F072F980BD0000407C010095 +:107FE00018630100B0B5084C0025084825772060CB +:107FF000CEF7F0FD0020E562D0F7D0FA211F08800F +:108000003C00BC260400D0F76CFBB0BD0000D47966 +:1080100001009575000080B5CCF7C1FC80BD054915 +:1080200080B500200870487003480449034A0830AE +:10803000CCF727FE80BD2C630100EDBC00004DBDD8 +:1080400000003C00F826040080B5CCF72BFE054963 +:108050004860011C0448CCF74BFE04490320CFF7CD +:108060003DFE80BD2C630100C4600100C1BC000066 +:1080700004480021002200230EC008C00249103825 +:10808000016070473C0034270400047A01001CE6BC +:10809000010080B5CCF709FE0549054A4860022178 +:1080A0002420D0F7FCFF0348C9F76BFD80BD047A9C +:1080B000010069BE000071EB000010B5044C1421F2 +:1080C000201CBDF796FE3C0070270400024820608B +:1080D00010BD0000147A0100ECE5010080B5CCF77A +:1080E000E7FD0749074A486002211F20D0F7DAFF61 +:1080F00005490120086005490C20CFF7F5FD80BD3A +:10810000147A0100D5BF00003C00AC270400805A5F +:10811000010085FF000080B5FFF74FFD0121212000 +:10812000024AD0F7C2FF80BD0000C9C1000080B57F +:10813000CCF7C1FD02490863C9F757FD80BD287A15 +:10814000010010B5CCF7B7FD164C3C00E827040041 +:108150002061CCF7B3FD60611448154908601649E9 +:1081600014480860CCF7AAFD1449086000F034F800 +:10817000FFF7E0FFFFF75EFF00F004F900F08EF874 +:10818000FFF76EFFFFF7B0FFFFF78CFF3C002428DE +:108190000400FFF704FF00F0AAF80A48BFF7BDFF8C +:1081A000C9F7BBFD09490020CFF7A7FD10BD407CF2 +:1081B00001007DB70000187E0100BDB800001C7EE4 +:1081C0000100207E0100B9BA0000812401003C00BA +:1081D0006028040080B538210148BDF719FE80BD34 +:1081E000905C010070470000B0B50C4C0B4D0020B6 +:1081F0000C3460602560E0600A202081281CC8F7EC +:108200003FFD281CC8F73AFD083D68600448C9F7DF +:108210003C009C2804001BFD201CC0F76EFA28803F +:10822000B0BDB87A0100D5330100F8B51F4E1D4C22 +:1082300000200C2141438200013009190831000659 +:10824000000E0428B150F4D318480C383061CEF732 +:10825000F4F93C00D8280400144CA078000900016F +:10826000A0700027E77067700024A50070590770A0 +:10827000201CBEF753F9715908710021201CCEF75C +:108280007DF901342406240E042CEED3074C20780B +:10829000000900013C00142904000A3020702078F5 +:1082A000F021884330302070A0780F210843A0705F +:1082B000F8BD00500700107B010080B5CCF79FFB94 +:1082C00080BDB0B50C4C0B4D00200C3460602560B7 +:1082D000E0600A2020813C0050290400281CC8F7D7 +:1082E000E1FC281CC8F7D4FC083D6860201CC0F7DE +:1082F0000DFA28800248C9F79BFCB0BD2C7B010019 +:108300004900010080B5CAF72FF880BD7047000012 +:10831000B0B5124D3C21281C3C008C290400BDF74F +:1083200086FD0F4828213C30BDF781FD0D48002116 +:1083300014380161C160FF21017041700A490A4A85 +:10834000416001210C20D0F7C8FE2C1C30340C3DBC +:108350000020D0F74AF920800C3C3C00C8290400DA +:10836000AC42F8D1B0BD0000607B010020A1070045 +:1083700035CD0000084900200C22424352181071EC +:1083800001300528F8DB04480021083801704160FD +:10839000FF21417070470000747A01003C00042AFC +:1083A000040080B578210148BDF747FD80BDC47B3E +:1083B000010080B5CAF797FA80BD7047000010B57C +:1083C0000B4CFF210531201CBDF737FD0948F0217A +:1083D0000851201C4030C5F78EF96C2106483C003E +:1083E000402A0400BDF72CFD0448C0216C30BDF7C5 +:1083F00027FD10BDC4690100B0D90100C86A0100A1 +:10840000B0B50B4D00241C20604340196C30C3F7FD +:108410000FFE0134042CF6DBCCF76EFCA863C7F723 +:108420003C007C2A040075F90448C9F71CFC034889 +:10843000CFF703FAB0BDC4690100FD800000E1225E +:10844000010010B5054C00202080034806210830AB +:10845000BDF7D5FC1420606010BD987C010010B5FC +:10846000084C3C00B82A04000020208060800648A8 +:1084700006210C30BDF7C6FC034806211230BDF7BB +:10848000C1FC1420A06010BD587C010070470000A2 +:1084900080B502210D20054AD0F72EFE0448C8F70A +:1084A0001FFC04483C00F42A0400CAF744FC80BDC9 +:1084B000000031D4000051B1000009B100000849AA +:1084C00080B500200860FFF7D0FFFFF7C0FFFFF77F +:1084D00004FC00F04AF8FFF70AFC00F03CF880BD0D +:1084E0000000E46501003C00302B040080B500F082 +:1084F00029F800F01BF800F051F800F031F880BDC9 +:10850000704700007047000080B5FF2189310248A4 +:10851000BDF7A2FC80BD0000DC71010080B50249FE +:108520000820CFF711FC80BD3C006C2B040059D90A +:10853000000080B50348CFF74CF90249488080BD60 +:1085400000008D1F0000987C010080B50348CFF724 +:1085500040F90249888080BD0000D5230000587C86 +:1085600001007047000080B502483C00A82B0400C1 +:10857000CAF7E4FB80BD000071E0000080B5CCF7D5 +:10858000A5FB02210F20064AD0F7C2FD14210548A1 +:10859000BDF768FC034878211430BDF763FC80BD4B +:1085A00035E200008466010080B5CCF73C00E42B86 +:1085B0000400B7FB0549086105490E20CFF7CDFB44 +:1085C00004490820CFF7C9FB80BDEC65010001021A +:1085D0000100C12E0000014900200870704740D9F9 +:1085E00001007047000001490020087070473C00FE +:1085F000202C0400A079010080B50748C8F7F2FFDD +:10860000064948600648C0F707FB0648C0F786FBE6 +:108610000548C9F7A3FA80BDA9E40000A0790100CC +:10862000B9E40000852E000081E40000074880B511 +:108630003C005C2C04000021002200230EC008C076 +:108640001038C821016000210C38024ACCF761FBC8 +:1086500080BDD0600100FDE5000080B5CCF767FB70 +:1086600004490860011C02480430CCF786FB80BD39 +:1086700000003C00982C0400C0600100094880B54F +:108680000A21017041700849084A81600021C160D7 +:10869000527982700161416128211830BDF7EEFBEB +:1086A00080BD00007C780100A08601000C5A01000A +:1086B000F8B50F493C00D42C04000F480D884F88B2 +:1086C00006790024301B684368230C49584341183D +:1086D0007D20C000BDF70FFD6100094AA64250523F +:1086E00000D13D1C01342406240E102CEAD3054988 +:1086F00001200861F8BD3C00102D0400F65901006E +:108700000C5A010034440F00125A01007C78010019 +:1087100080B500F0E7FA02490120086180BD000041 +:108720007C78010010B5041C081C0F494979002908 +:1087300001D10E4B00E00E4B3C004C2D0400002CF0 +:1087400007D0042111800A1C0124191CBDF7CDFBA0 +:108750000AE00124011C181C1288BDF7C6FB00F0BA +:10876000C4FA054901200861201C10BD00000C5A04 +:108770000100FE590100FA5901003C00882D040057 +:108780007C7801000D488CB5C18800AB0C4A9980FB +:1087900001890420D980188002211320D0F7D0FC51 +:1087A00000F0A6FA074901200861FFF78DFF6A462D +:1087B00001A90020FFF7BCFF8CBD00003C00C42DC8 +:1087C0000400F459010095F900007C780100F8B527 +:1087D000134E0125B5700520F070114910480EC9DF +:1087E0002C300EC0002070610F480F49104F00243C +:1087F0004860A0003958201CD1F7D7F801343C005C +:10880000002E0400102CF7D3064C0B4A2034201CF9 +:108810000A49B560CCF792FACCF79EFA3061206035 +:10882000F8BD000064730100B05801000418020094 +:1088300060000700D444010045FA000071FA00000E +:108840003C003C2E04000C4930B50023CC560B4BA9 +:108850000020F0251A5C1107090F09190F2901DD05 +:108860000F2102E0002900DA00212A405118195492 +:1088700001300E28EEDB30BD000064730100C058EB +:1088800001003C00782E0400B0B50D1C002808D073 +:10889000012414800520CCF7B5F88003C00F2870A0 +:1088A00007E028780122410452040520D0F7AEFDEC +:1088B0000124201CB0BD000098B5054C6068CCF7C1 +:1088C000F5FD00903C00B42E040000AB1888E08059 +:1088D000CEF7FBFF98BDA058010038B5031C081C5B +:1088E0000024002B174D07D00E2111800A1C0124F3 +:1088F000291CBDF70CFB22E01188042917D1011CAB +:1089000068461288BDF73C00F02E040003FB009877 +:10891000002801DB323000E032380090011C642076 +:10892000BDF798FB0106091600900E22281CBDF722 +:1089300085FB06E00E2905D10A1C011C281CBDF789 +:10894000E9FA0124201C38BD3C002C2F0400DA5920 +:10895000010038B5031C081C0024002B174D07D05C +:108960000E2111800A1C0124291CBDF7D6FA22E031 +:108970001188042917D1011C68461288BDF7CDFA69 +:108980000098002801DB323000E03C00682F040032 +:1089900032380090011C6420BDF762FB0106091605 +:1089A00000900E22281CBDF74FFB06E00E2905D1D2 +:1089B0000A1C011C281CBDF7B3FA0124201C38BD79 +:1089C000CC590100034880B5017800203C00A42F59 +:1089D0000400CCF7B4FB80BD0000A658010070472E +:1089E00000000249032008700020487070479C7303 +:1089F000010080B502211120024AD0F7BCFB80BDE6 +:108A00000000A1FE0000F0B50B4F1C1C00233C0031 +:108A1000E02F0400FD562B1C062D01D10120F0BDD6 +:108A2000064E051CD80034363554801941708270CA +:108A30004460581C38700020F0BD0000985A0100B6 +:108A400010B5041C0C4800F021F96078FF2804D010 +:108A50003C001C3004000123E056062100F0CDF854 +:108A6000084A012110780843074908702023184359 +:108A70000870802318431070087010BD0000919B8F +:108A80000000E06001000400070010B50A49041C62 +:108A900008783C005830040040084000087008493D +:108AA0000870084800F0F8F86078FF2804D0012327 +:108AB000E056052100F0A4F810BD0000E0600100C0 +:108AC00004000700919B00000348002100220023BE +:108AD0000EC008C03C009430040070470000E860FD +:108AE00001007047000010B5074C00206060208036 +:108AF000E06002211420044AD0F749FB02481030FC +:108B0000A06010BD000058750100051D01007047F0 +:108B1000000010B548213C00D03004000A48BDF7E1 +:108B2000E3F9094CE0214834201CBDF7DDF90020B1 +:108B3000C10009190A1C083201301B284A60F7D30A +:108B400001480438046010BD685B010080B5022153 +:108B50002320024AD0F71EFB3C000C31040080BDEC +:108B600000004523010080B5FFF76BF880BD70471A +:108B70000000F8B501201D49C00748601D49FF20CD +:108B800008731C4E10203060050135601B4C80219D +:108B9000201CBDF7ACF90021194A3C004831040003 +:108BA000154F00200B011B195A60CB00DB191874FC +:108BB00001310829F6DB0F4CFA212180124961802E +:108BC000A0606A4611490420BDF730FF6A4610498B +:108BD0000820BDF72BFF1020706075603C008431C9 +:108BE000040060680221084360600B49064A081CC3 +:108BF0001030083A03C2F8BD000000010700006011 +:108C0000070000100700AC730100D1750000204E72 +:108C10000000052C0100112C010000A007003C0001 +:108C2000C031040070B50E1C0024C4F75BFE0028A0 +:108C30003BD04568FF2D38D00C2E28D201A39B5D78 +:108C40005B009F440507090B0D101316181B1E210E +:108C5000182420E030241EE060241CE0C0241AE028 +:108C60003C00FC310400FF24813417E00924A401F6 +:108C700014E00924E40111E00F4C0FE00924240260 +:108C80000CE00924640209E00324E40206E009245C +:108C9000A40203E009219E20BEF739F86000001904 +:108CA00040083C0038320400054980044018054A59 +:108CB000A900891848606420604370BDDC0700008B +:108CC0008038010004000700024980B50860D0F731 +:108CD00097F880BD5C5B0100F8B50026174C174B78 +:108CE000194926703C0074320400002014330D88AA +:108CF000154E154A04E0C100CF187A605E5001306D +:108D0000A842F8DBC6F72BFDFF21114DA531281C29 +:108D1000BDF7FFF80021281C021C1432C260101C91 +:108D200001311429F8DB3C00B03204000026C66093 +:108D300005480C3060C009481821BDF7EDF8012046 +:108D4000043441C40020F8BD705D010009A000009A +:108D500030D9010056570100045F0100A8600100EE +:108D600080B50020CFF7B6FC3C00EC32040001498E +:108D7000088080BD00002C7401001148F8B54179CD +:108D8000002902D105780F4E01E045780F4E0223ED +:108D9000F75E0024601B784364230C495843411854 +:108DA0007D20C000BDF7F5F961003C0028330400C8 +:108DB000094AAC42505201D10023F75E0134240627 +:108DC000240E102CE9D3F8BD0C5A0100FE59010005 +:108DD000FA59010034440F00325A010038B5104CE2 +:108DE000BE252573207A1821884320723C00643305 +:108DF00004006A460D490D20BDF733FE01200B49E2 +:108E000040030860486025732D20C003206025734F +:108E1000207A102108432072064806490860002085 +:108E2000486038BD0000000307008D3E01002400AB +:108E3000A0330400001007000087930304790100A9 +:108E400080B502211520024AD0F7C8F980BD000084 +:108E50000D3E010070470000040000600400440063 +:108E60000000040040200700FFFFFFFF4D656D6F0D +:108E7000727920636865636B2E2E2E00204F4B0A9B +:108E800000000000204641494C0A000057726974F6 +:108E9000696E67206669726D7761726520646174BE +:108EA0006120746F20666C6173680A005665726990 +:108EB0006679696E67206669726D77617265206494 +:108EC0006174610A00000000566572696679206667 +:108ED00061696C6564206174206279746520256421 +:108EE0002C2030782530327820213D2030782530F4 +:108EF00032780A004669726D776172652073756316 +:108F00006365737366756C6C792073746F726564D6 +:108F100020696E20666C617368210A0005000600F6 +:108F200000000001000001480000000B0000014C9F +:108F300000000009000001780000000F0000019C03 +:108F400000000001000001D800000001000001DC69 +:108F50000000000100000108000000010000010CF9 +:108F600000000001000001100000000100000114D9 +:108F70000000000100000118000000010000011CB9 +:108F80000000000100000120000000010000012499 +:108F9000000000030000012800000001000001346F +:108FA0000000000100000138000000010000013C49 +:108FB0000000000100000140000000010000014429 +:040000058000000077 +:00000001FF diff --git a/hardware/arduino/avr/firmwares/wifishield/wifiHD/src/owl_os.c b/hardware/arduino/avr/firmwares/wifishield/wifiHD/src/owl_os.c index d17d8cec7c6..9fdf9a8e0cd 100644 --- a/hardware/arduino/avr/firmwares/wifishield/wifiHD/src/owl_os.c +++ b/hardware/arduino/avr/firmwares/wifishield/wifiHD/src/owl_os.c @@ -1,140 +1,140 @@ -#include -#include -#include -#include - -#include - -void *owl_os_alloc(size_t size) -{ - return malloc(size); -} - -void *owl_os_realloc(void *ptr, size_t size) -{ - return realloc(ptr, size); -} - -void owl_os_free(void *p) -{ - free(p); -} - -void *owl_os_memcpy(void *dst, const void *src, size_t n) -{ - return memcpy(dst, src, n); -} - -void *owl_os_memset(void *s, int c, size_t n) -{ - return memset(s, c, n); -} - -void *owl_os_memmove(void *dst, const void *src, size_t n) -{ - return memmove(dst, src, n); -} - -size_t owl_os_strlen(char *s) -{ - return strlen(s); -} - -char *owl_os_strncpy(char *dst, const char *src, size_t n) -{ - return strncpy(dst, src, n); -} - -int owl_os_strncmp(const char *s1, const char *s2, size_t n) -{ - return strncmp(s1, s2, n); -} - -int owl_os_strcmp(const char *s1, const char *s2) -{ - return strcmp(s1, s2); -} - -char *owl_os_strcpy(char *dst, const char *src) -{ - return strcpy(dst, src); -} - -char *owl_os_strdup(const char *s) -{ - return strdup(s); -} - -char *owl_os_strndup(const char *s, size_t n) -{ - return strndup(s, n); -} - -int owl_os_memcmp(const void *s1, const void *s2, size_t n) -{ - return memcmp(s1, s2, n); -} - -long int owl_os_strtol(const char *nptr, char **endptr, int base) -{ - return strtol(nptr, endptr, base); -} - -char *owl_os_strchr(const char *s, int c) -{ - return strchr(s, c); -} - -char *owl_os_strrchr(const char *s, int c) -{ - return strrchr(s, c); -} - -int owl_os_strcasecmp(const char *s1, const char *s2) -{ - return strcasecmp(s1, s2); -} - -char *owl_os_strstr(const char *haystack, const char *needle) -{ - return strstr(haystack, needle); -} - -int owl_os_snprintf(char *str, size_t size, const char *format, ...) -{ - int ret; - va_list ap; - va_start(ap, format); - ret = vsniprintf(str, size, format, ap); - va_end(ap); - return ret; -} - -/* for debugging only, never called if wl_api was built without debug */ -#ifdef CONFIG_OWL -#include "owl_env.h" -int owl_os_printf(const char *fmt, ...) -{ - char *str = NULL; - va_list args; - int len; - char *iter; - - va_start(args, fmt); - - if ((str = malloc(160)) == NULL) - return -1; - - if ((len = vsniprintf(str, 160, fmt, args)) < 0) { - free(str); - return -1; - } - - iter = str; - while (*iter) - owl_putc(*iter++); - - free(str); - return len; -} -#endif +#include +#include +#include +#include + +#include + +void *owl_os_alloc(size_t size) +{ + return malloc(size); +} + +void *owl_os_realloc(void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +void owl_os_free(void *p) +{ + free(p); +} + +void *owl_os_memcpy(void *dst, const void *src, size_t n) +{ + return memcpy(dst, src, n); +} + +void *owl_os_memset(void *s, int c, size_t n) +{ + return memset(s, c, n); +} + +void *owl_os_memmove(void *dst, const void *src, size_t n) +{ + return memmove(dst, src, n); +} + +size_t owl_os_strlen(char *s) +{ + return strlen(s); +} + +char *owl_os_strncpy(char *dst, const char *src, size_t n) +{ + return strncpy(dst, src, n); +} + +int owl_os_strncmp(const char *s1, const char *s2, size_t n) +{ + return strncmp(s1, s2, n); +} + +int owl_os_strcmp(const char *s1, const char *s2) +{ + return strcmp(s1, s2); +} + +char *owl_os_strcpy(char *dst, const char *src) +{ + return strcpy(dst, src); +} + +char *owl_os_strdup(const char *s) +{ + return strdup(s); +} + +char *owl_os_strndup(const char *s, size_t n) +{ + return strndup(s, n); +} + +int owl_os_memcmp(const void *s1, const void *s2, size_t n) +{ + return memcmp(s1, s2, n); +} + +long int owl_os_strtol(const char *nptr, char **endptr, int base) +{ + return strtol(nptr, endptr, base); +} + +char *owl_os_strchr(const char *s, int c) +{ + return strchr(s, c); +} + +char *owl_os_strrchr(const char *s, int c) +{ + return strrchr(s, c); +} + +int owl_os_strcasecmp(const char *s1, const char *s2) +{ + return strcasecmp(s1, s2); +} + +char *owl_os_strstr(const char *haystack, const char *needle) +{ + return strstr(haystack, needle); +} + +int owl_os_snprintf(char *str, size_t size, const char *format, ...) +{ + int ret; + va_list ap; + va_start(ap, format); + ret = vsniprintf(str, size, format, ap); + va_end(ap); + return ret; +} + +/* for debugging only, never called if wl_api was built without debug */ +#ifdef CONFIG_OWL +#include "owl_env.h" +int owl_os_printf(const char *fmt, ...) +{ + char *str = NULL; + va_list args; + int len; + char *iter; + + va_start(args, fmt); + + if ((str = malloc(160)) == NULL) + return -1; + + if ((len = vsniprintf(str, 160, fmt, args)) < 0) { + free(str); + return -1; + } + + iter = str; + while (*iter) + owl_putc(*iter++); + + free(str); + return len; +} +#endif diff --git a/hardware/arduino/avr/libraries/Ethernet/Dhcp.cpp b/hardware/arduino/avr/libraries/Ethernet/Dhcp.cpp index 56d5b69516e..9e5262c3d31 100644 --- a/hardware/arduino/avr/libraries/Ethernet/Dhcp.cpp +++ b/hardware/arduino/avr/libraries/Ethernet/Dhcp.cpp @@ -1,480 +1,480 @@ -// DHCP Library v0.3 - April 25, 2009 -// Author: Jordan Terrell - blog.jordanterrell.com - -#include "w5100.h" - -#include -#include -#include "Dhcp.h" -#include "Arduino.h" -#include "util.h" - -int DhcpClass::beginWithDHCP(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) -{ - _dhcpLeaseTime=0; - _dhcpT1=0; - _dhcpT2=0; - _lastCheck=0; - _timeout = timeout; - _responseTimeout = responseTimeout; - - // zero out _dhcpMacAddr - memset(_dhcpMacAddr, 0, 6); - reset_DHCP_lease(); - - memcpy((void*)_dhcpMacAddr, (void*)mac, 6); - _dhcp_state = STATE_DHCP_START; - return request_DHCP_lease(); -} - -void DhcpClass::reset_DHCP_lease(){ - // zero out _dhcpSubnetMask, _dhcpGatewayIp, _dhcpLocalIp, _dhcpDhcpServerIp, _dhcpDnsServerIp - memset(_dhcpLocalIp, 0, 20); -} - -//return:0 on error, 1 if request is sent and response is received -int DhcpClass::request_DHCP_lease(){ - - uint8_t messageType = 0; - - - - // Pick an initial transaction ID - _dhcpTransactionId = random(1UL, 2000UL); - _dhcpInitialTransactionId = _dhcpTransactionId; - - _dhcpUdpSocket.stop(); - if (_dhcpUdpSocket.begin(DHCP_CLIENT_PORT) == 0) - { - // Couldn't get a socket - return 0; - } - - presend_DHCP(); - - int result = 0; - - unsigned long startTime = millis(); - - while(_dhcp_state != STATE_DHCP_LEASED) - { - if(_dhcp_state == STATE_DHCP_START) - { - _dhcpTransactionId++; - - send_DHCP_MESSAGE(DHCP_DISCOVER, ((millis() - startTime) / 1000)); - _dhcp_state = STATE_DHCP_DISCOVER; - } - else if(_dhcp_state == STATE_DHCP_REREQUEST){ - _dhcpTransactionId++; - send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime)/1000)); - _dhcp_state = STATE_DHCP_REQUEST; - } - else if(_dhcp_state == STATE_DHCP_DISCOVER) - { - uint32_t respId; - messageType = parseDHCPResponse(_responseTimeout, respId); - if(messageType == DHCP_OFFER) - { - // We'll use the transaction ID that the offer came with, - // rather than the one we were up to - _dhcpTransactionId = respId; - send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime) / 1000)); - _dhcp_state = STATE_DHCP_REQUEST; - } - } - else if(_dhcp_state == STATE_DHCP_REQUEST) - { - uint32_t respId; - messageType = parseDHCPResponse(_responseTimeout, respId); - if(messageType == DHCP_ACK) - { - _dhcp_state = STATE_DHCP_LEASED; - result = 1; - //use default lease time if we didn't get it - if(_dhcpLeaseTime == 0){ - _dhcpLeaseTime = DEFAULT_LEASE; - } - //calculate T1 & T2 if we didn't get it - if(_dhcpT1 == 0){ - //T1 should be 50% of _dhcpLeaseTime - _dhcpT1 = _dhcpLeaseTime >> 1; - } - if(_dhcpT2 == 0){ - //T2 should be 87.5% (7/8ths) of _dhcpLeaseTime - _dhcpT2 = _dhcpT1 << 1; - } - _renewInSec = _dhcpT1; - _rebindInSec = _dhcpT2; - } - else if(messageType == DHCP_NAK) - _dhcp_state = STATE_DHCP_START; - } - - if(messageType == 255) - { - messageType = 0; - _dhcp_state = STATE_DHCP_START; - } - - if(result != 1 && ((millis() - startTime) > _timeout)) - break; - } - - // We're done with the socket now - _dhcpUdpSocket.stop(); - _dhcpTransactionId++; - - return result; -} - -void DhcpClass::presend_DHCP() -{ -} - -void DhcpClass::send_DHCP_MESSAGE(uint8_t messageType, uint16_t secondsElapsed) -{ - uint8_t buffer[32]; - memset(buffer, 0, 32); - IPAddress dest_addr( 255, 255, 255, 255 ); // Broadcast address - - if (-1 == _dhcpUdpSocket.beginPacket(dest_addr, DHCP_SERVER_PORT)) - { - // FIXME Need to return errors - return; - } - - buffer[0] = DHCP_BOOTREQUEST; // op - buffer[1] = DHCP_HTYPE10MB; // htype - buffer[2] = DHCP_HLENETHERNET; // hlen - buffer[3] = DHCP_HOPS; // hops - - // xid - unsigned long xid = htonl(_dhcpTransactionId); - memcpy(buffer + 4, &(xid), 4); - - // 8, 9 - seconds elapsed - buffer[8] = ((secondsElapsed & 0xff00) >> 8); - buffer[9] = (secondsElapsed & 0x00ff); - - // flags - unsigned short flags = htons(DHCP_FLAGSBROADCAST); - memcpy(buffer + 10, &(flags), 2); - - // ciaddr: already zeroed - // yiaddr: already zeroed - // siaddr: already zeroed - // giaddr: already zeroed - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 28); - - memset(buffer, 0, 32); // clear local buffer - - memcpy(buffer, _dhcpMacAddr, 6); // chaddr - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 16); - - memset(buffer, 0, 32); // clear local buffer - - // leave zeroed out for sname && file - // put in W5100 transmit buffer x 6 (192 bytes) - - for(int i = 0; i < 6; i++) { - _dhcpUdpSocket.write(buffer, 32); - } - - // OPT - Magic Cookie - buffer[0] = (uint8_t)((MAGIC_COOKIE >> 24)& 0xFF); - buffer[1] = (uint8_t)((MAGIC_COOKIE >> 16)& 0xFF); - buffer[2] = (uint8_t)((MAGIC_COOKIE >> 8)& 0xFF); - buffer[3] = (uint8_t)(MAGIC_COOKIE& 0xFF); - - // OPT - message type - buffer[4] = dhcpMessageType; - buffer[5] = 0x01; - buffer[6] = messageType; //DHCP_REQUEST; - - // OPT - client identifier - buffer[7] = dhcpClientIdentifier; - buffer[8] = 0x07; - buffer[9] = 0x01; - memcpy(buffer + 10, _dhcpMacAddr, 6); - - // OPT - host name - buffer[16] = hostName; - buffer[17] = strlen(HOST_NAME) + 6; // length of hostname + last 3 bytes of mac address - strcpy((char*)&(buffer[18]), HOST_NAME); - - printByte((char*)&(buffer[24]), _dhcpMacAddr[3]); - printByte((char*)&(buffer[26]), _dhcpMacAddr[4]); - printByte((char*)&(buffer[28]), _dhcpMacAddr[5]); - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 30); - - if(messageType == DHCP_REQUEST) - { - buffer[0] = dhcpRequestedIPaddr; - buffer[1] = 0x04; - buffer[2] = _dhcpLocalIp[0]; - buffer[3] = _dhcpLocalIp[1]; - buffer[4] = _dhcpLocalIp[2]; - buffer[5] = _dhcpLocalIp[3]; - - buffer[6] = dhcpServerIdentifier; - buffer[7] = 0x04; - buffer[8] = _dhcpDhcpServerIp[0]; - buffer[9] = _dhcpDhcpServerIp[1]; - buffer[10] = _dhcpDhcpServerIp[2]; - buffer[11] = _dhcpDhcpServerIp[3]; - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 12); - } - - buffer[0] = dhcpParamRequest; - buffer[1] = 0x06; - buffer[2] = subnetMask; - buffer[3] = routersOnSubnet; - buffer[4] = dns; - buffer[5] = domainName; - buffer[6] = dhcpT1value; - buffer[7] = dhcpT2value; - buffer[8] = endOption; - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 9); - - _dhcpUdpSocket.endPacket(); -} - -uint8_t DhcpClass::parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId) -{ - uint8_t type = 0; - uint8_t opt_len = 0; - - unsigned long startTime = millis(); - - while(_dhcpUdpSocket.parsePacket() <= 0) - { - if((millis() - startTime) > responseTimeout) - { - return 255; - } - delay(50); - } - // start reading in the packet - RIP_MSG_FIXED fixedMsg; - _dhcpUdpSocket.read((uint8_t*)&fixedMsg, sizeof(RIP_MSG_FIXED)); - - if(fixedMsg.op == DHCP_BOOTREPLY && _dhcpUdpSocket.remotePort() == DHCP_SERVER_PORT) - { - transactionId = ntohl(fixedMsg.xid); - if(memcmp(fixedMsg.chaddr, _dhcpMacAddr, 6) != 0 || (transactionId < _dhcpInitialTransactionId) || (transactionId > _dhcpTransactionId)) - { - // Need to read the rest of the packet here regardless - _dhcpUdpSocket.flush(); - return 0; - } - - memcpy(_dhcpLocalIp, fixedMsg.yiaddr, 4); - - // Skip to the option part - // Doing this a byte at a time so we don't have to put a big buffer - // on the stack (as we don't have lots of memory lying around) - for (int i =0; i < (240 - (int)sizeof(RIP_MSG_FIXED)); i++) - { - _dhcpUdpSocket.read(); // we don't care about the returned byte - } - - while (_dhcpUdpSocket.available() > 0) - { - switch (_dhcpUdpSocket.read()) - { - case endOption : - break; - - case padOption : - break; - - case dhcpMessageType : - opt_len = _dhcpUdpSocket.read(); - type = _dhcpUdpSocket.read(); - break; - - case subnetMask : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read(_dhcpSubnetMask, 4); - break; - - case routersOnSubnet : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read(_dhcpGatewayIp, 4); - for (int i = 0; i < opt_len-4; i++) - { - _dhcpUdpSocket.read(); - } - break; - - case dns : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read(_dhcpDnsServerIp, 4); - for (int i = 0; i < opt_len-4; i++) - { - _dhcpUdpSocket.read(); - } - break; - - case dhcpServerIdentifier : - opt_len = _dhcpUdpSocket.read(); - if( *((uint32_t*)_dhcpDhcpServerIp) == 0 || - IPAddress(_dhcpDhcpServerIp) == _dhcpUdpSocket.remoteIP() ) - { - _dhcpUdpSocket.read(_dhcpDhcpServerIp, sizeof(_dhcpDhcpServerIp)); - } - else - { - // Skip over the rest of this option - while (opt_len--) - { - _dhcpUdpSocket.read(); - } - } - break; - - case dhcpT1value : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read((uint8_t*)&_dhcpT1, sizeof(_dhcpT1)); - _dhcpT1 = ntohl(_dhcpT1); - break; - - case dhcpT2value : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read((uint8_t*)&_dhcpT2, sizeof(_dhcpT2)); - _dhcpT2 = ntohl(_dhcpT2); - break; - - case dhcpIPaddrLeaseTime : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read((uint8_t*)&_dhcpLeaseTime, sizeof(_dhcpLeaseTime)); - _dhcpLeaseTime = ntohl(_dhcpLeaseTime); - _renewInSec = _dhcpLeaseTime; - break; - - default : - opt_len = _dhcpUdpSocket.read(); - // Skip over the rest of this option - while (opt_len--) - { - _dhcpUdpSocket.read(); - } - break; - } - } - } - - // Need to skip to end of the packet regardless here - _dhcpUdpSocket.flush(); - - return type; -} - - -/* - returns: - 0/DHCP_CHECK_NONE: nothing happened - 1/DHCP_CHECK_RENEW_FAIL: renew failed - 2/DHCP_CHECK_RENEW_OK: renew success - 3/DHCP_CHECK_REBIND_FAIL: rebind fail - 4/DHCP_CHECK_REBIND_OK: rebind success -*/ -int DhcpClass::checkLease(){ - //this uses a signed / unsigned trick to deal with millis overflow - unsigned long now = millis(); - signed long snow = (long)now; - int rc=DHCP_CHECK_NONE; - if (_lastCheck != 0){ - signed long factor; - //calc how many ms past the timeout we are - factor = snow - (long)_secTimeout; - //if on or passed the timeout, reduce the counters - if ( factor >= 0 ){ - //next timeout should be now plus 1000 ms minus parts of second in factor - _secTimeout = snow + 1000 - factor % 1000; - //how many seconds late are we, minimum 1 - factor = factor / 1000 +1; - - //reduce the counters by that mouch - //if we can assume that the cycle time (factor) is fairly constant - //and if the remainder is less than cycle time * 2 - //do it early instead of late - if(_renewInSec < factor*2 ) - _renewInSec = 0; - else - _renewInSec -= factor; - - if(_rebindInSec < factor*2 ) - _rebindInSec = 0; - else - _rebindInSec -= factor; - } - - //if we have a lease but should renew, do it - if (_dhcp_state == STATE_DHCP_LEASED && _renewInSec <=0){ - _dhcp_state = STATE_DHCP_REREQUEST; - rc = 1 + request_DHCP_lease(); - } - - //if we have a lease or is renewing but should bind, do it - if( (_dhcp_state == STATE_DHCP_LEASED || _dhcp_state == STATE_DHCP_START) && _rebindInSec <=0){ - //this should basically restart completely - _dhcp_state = STATE_DHCP_START; - reset_DHCP_lease(); - rc = 3 + request_DHCP_lease(); - } - } - else{ - _secTimeout = snow + 1000; - } - - _lastCheck = now; - return rc; -} - -IPAddress DhcpClass::getLocalIp() -{ - return IPAddress(_dhcpLocalIp); -} - -IPAddress DhcpClass::getSubnetMask() -{ - return IPAddress(_dhcpSubnetMask); -} - -IPAddress DhcpClass::getGatewayIp() -{ - return IPAddress(_dhcpGatewayIp); -} - -IPAddress DhcpClass::getDhcpServerIp() -{ - return IPAddress(_dhcpDhcpServerIp); -} - -IPAddress DhcpClass::getDnsServerIp() -{ - return IPAddress(_dhcpDnsServerIp); -} - -void DhcpClass::printByte(char * buf, uint8_t n ) { - char *str = &buf[1]; - buf[0]='0'; - do { - unsigned long m = n; - n /= 16; - char c = m - 16 * n; - *str-- = c < 10 ? c + '0' : c + 'A' - 10; - } while(n); -} +// DHCP Library v0.3 - April 25, 2009 +// Author: Jordan Terrell - blog.jordanterrell.com + +#include "w5100.h" + +#include +#include +#include "Dhcp.h" +#include "Arduino.h" +#include "util.h" + +int DhcpClass::beginWithDHCP(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) +{ + _dhcpLeaseTime=0; + _dhcpT1=0; + _dhcpT2=0; + _lastCheck=0; + _timeout = timeout; + _responseTimeout = responseTimeout; + + // zero out _dhcpMacAddr + memset(_dhcpMacAddr, 0, 6); + reset_DHCP_lease(); + + memcpy((void*)_dhcpMacAddr, (void*)mac, 6); + _dhcp_state = STATE_DHCP_START; + return request_DHCP_lease(); +} + +void DhcpClass::reset_DHCP_lease(){ + // zero out _dhcpSubnetMask, _dhcpGatewayIp, _dhcpLocalIp, _dhcpDhcpServerIp, _dhcpDnsServerIp + memset(_dhcpLocalIp, 0, 20); +} + +//return:0 on error, 1 if request is sent and response is received +int DhcpClass::request_DHCP_lease(){ + + uint8_t messageType = 0; + + + + // Pick an initial transaction ID + _dhcpTransactionId = random(1UL, 2000UL); + _dhcpInitialTransactionId = _dhcpTransactionId; + + _dhcpUdpSocket.stop(); + if (_dhcpUdpSocket.begin(DHCP_CLIENT_PORT) == 0) + { + // Couldn't get a socket + return 0; + } + + presend_DHCP(); + + int result = 0; + + unsigned long startTime = millis(); + + while(_dhcp_state != STATE_DHCP_LEASED) + { + if(_dhcp_state == STATE_DHCP_START) + { + _dhcpTransactionId++; + + send_DHCP_MESSAGE(DHCP_DISCOVER, ((millis() - startTime) / 1000)); + _dhcp_state = STATE_DHCP_DISCOVER; + } + else if(_dhcp_state == STATE_DHCP_REREQUEST){ + _dhcpTransactionId++; + send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime)/1000)); + _dhcp_state = STATE_DHCP_REQUEST; + } + else if(_dhcp_state == STATE_DHCP_DISCOVER) + { + uint32_t respId; + messageType = parseDHCPResponse(_responseTimeout, respId); + if(messageType == DHCP_OFFER) + { + // We'll use the transaction ID that the offer came with, + // rather than the one we were up to + _dhcpTransactionId = respId; + send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime) / 1000)); + _dhcp_state = STATE_DHCP_REQUEST; + } + } + else if(_dhcp_state == STATE_DHCP_REQUEST) + { + uint32_t respId; + messageType = parseDHCPResponse(_responseTimeout, respId); + if(messageType == DHCP_ACK) + { + _dhcp_state = STATE_DHCP_LEASED; + result = 1; + //use default lease time if we didn't get it + if(_dhcpLeaseTime == 0){ + _dhcpLeaseTime = DEFAULT_LEASE; + } + //calculate T1 & T2 if we didn't get it + if(_dhcpT1 == 0){ + //T1 should be 50% of _dhcpLeaseTime + _dhcpT1 = _dhcpLeaseTime >> 1; + } + if(_dhcpT2 == 0){ + //T2 should be 87.5% (7/8ths) of _dhcpLeaseTime + _dhcpT2 = _dhcpT1 << 1; + } + _renewInSec = _dhcpT1; + _rebindInSec = _dhcpT2; + } + else if(messageType == DHCP_NAK) + _dhcp_state = STATE_DHCP_START; + } + + if(messageType == 255) + { + messageType = 0; + _dhcp_state = STATE_DHCP_START; + } + + if(result != 1 && ((millis() - startTime) > _timeout)) + break; + } + + // We're done with the socket now + _dhcpUdpSocket.stop(); + _dhcpTransactionId++; + + return result; +} + +void DhcpClass::presend_DHCP() +{ +} + +void DhcpClass::send_DHCP_MESSAGE(uint8_t messageType, uint16_t secondsElapsed) +{ + uint8_t buffer[32]; + memset(buffer, 0, 32); + IPAddress dest_addr( 255, 255, 255, 255 ); // Broadcast address + + if (-1 == _dhcpUdpSocket.beginPacket(dest_addr, DHCP_SERVER_PORT)) + { + // FIXME Need to return errors + return; + } + + buffer[0] = DHCP_BOOTREQUEST; // op + buffer[1] = DHCP_HTYPE10MB; // htype + buffer[2] = DHCP_HLENETHERNET; // hlen + buffer[3] = DHCP_HOPS; // hops + + // xid + unsigned long xid = htonl(_dhcpTransactionId); + memcpy(buffer + 4, &(xid), 4); + + // 8, 9 - seconds elapsed + buffer[8] = ((secondsElapsed & 0xff00) >> 8); + buffer[9] = (secondsElapsed & 0x00ff); + + // flags + unsigned short flags = htons(DHCP_FLAGSBROADCAST); + memcpy(buffer + 10, &(flags), 2); + + // ciaddr: already zeroed + // yiaddr: already zeroed + // siaddr: already zeroed + // giaddr: already zeroed + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 28); + + memset(buffer, 0, 32); // clear local buffer + + memcpy(buffer, _dhcpMacAddr, 6); // chaddr + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 16); + + memset(buffer, 0, 32); // clear local buffer + + // leave zeroed out for sname && file + // put in W5100 transmit buffer x 6 (192 bytes) + + for(int i = 0; i < 6; i++) { + _dhcpUdpSocket.write(buffer, 32); + } + + // OPT - Magic Cookie + buffer[0] = (uint8_t)((MAGIC_COOKIE >> 24)& 0xFF); + buffer[1] = (uint8_t)((MAGIC_COOKIE >> 16)& 0xFF); + buffer[2] = (uint8_t)((MAGIC_COOKIE >> 8)& 0xFF); + buffer[3] = (uint8_t)(MAGIC_COOKIE& 0xFF); + + // OPT - message type + buffer[4] = dhcpMessageType; + buffer[5] = 0x01; + buffer[6] = messageType; //DHCP_REQUEST; + + // OPT - client identifier + buffer[7] = dhcpClientIdentifier; + buffer[8] = 0x07; + buffer[9] = 0x01; + memcpy(buffer + 10, _dhcpMacAddr, 6); + + // OPT - host name + buffer[16] = hostName; + buffer[17] = strlen(HOST_NAME) + 6; // length of hostname + last 3 bytes of mac address + strcpy((char*)&(buffer[18]), HOST_NAME); + + printByte((char*)&(buffer[24]), _dhcpMacAddr[3]); + printByte((char*)&(buffer[26]), _dhcpMacAddr[4]); + printByte((char*)&(buffer[28]), _dhcpMacAddr[5]); + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 30); + + if(messageType == DHCP_REQUEST) + { + buffer[0] = dhcpRequestedIPaddr; + buffer[1] = 0x04; + buffer[2] = _dhcpLocalIp[0]; + buffer[3] = _dhcpLocalIp[1]; + buffer[4] = _dhcpLocalIp[2]; + buffer[5] = _dhcpLocalIp[3]; + + buffer[6] = dhcpServerIdentifier; + buffer[7] = 0x04; + buffer[8] = _dhcpDhcpServerIp[0]; + buffer[9] = _dhcpDhcpServerIp[1]; + buffer[10] = _dhcpDhcpServerIp[2]; + buffer[11] = _dhcpDhcpServerIp[3]; + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 12); + } + + buffer[0] = dhcpParamRequest; + buffer[1] = 0x06; + buffer[2] = subnetMask; + buffer[3] = routersOnSubnet; + buffer[4] = dns; + buffer[5] = domainName; + buffer[6] = dhcpT1value; + buffer[7] = dhcpT2value; + buffer[8] = endOption; + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 9); + + _dhcpUdpSocket.endPacket(); +} + +uint8_t DhcpClass::parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId) +{ + uint8_t type = 0; + uint8_t opt_len = 0; + + unsigned long startTime = millis(); + + while(_dhcpUdpSocket.parsePacket() <= 0) + { + if((millis() - startTime) > responseTimeout) + { + return 255; + } + delay(50); + } + // start reading in the packet + RIP_MSG_FIXED fixedMsg; + _dhcpUdpSocket.read((uint8_t*)&fixedMsg, sizeof(RIP_MSG_FIXED)); + + if(fixedMsg.op == DHCP_BOOTREPLY && _dhcpUdpSocket.remotePort() == DHCP_SERVER_PORT) + { + transactionId = ntohl(fixedMsg.xid); + if(memcmp(fixedMsg.chaddr, _dhcpMacAddr, 6) != 0 || (transactionId < _dhcpInitialTransactionId) || (transactionId > _dhcpTransactionId)) + { + // Need to read the rest of the packet here regardless + _dhcpUdpSocket.flush(); + return 0; + } + + memcpy(_dhcpLocalIp, fixedMsg.yiaddr, 4); + + // Skip to the option part + // Doing this a byte at a time so we don't have to put a big buffer + // on the stack (as we don't have lots of memory lying around) + for (int i =0; i < (240 - (int)sizeof(RIP_MSG_FIXED)); i++) + { + _dhcpUdpSocket.read(); // we don't care about the returned byte + } + + while (_dhcpUdpSocket.available() > 0) + { + switch (_dhcpUdpSocket.read()) + { + case endOption : + break; + + case padOption : + break; + + case dhcpMessageType : + opt_len = _dhcpUdpSocket.read(); + type = _dhcpUdpSocket.read(); + break; + + case subnetMask : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpSubnetMask, 4); + break; + + case routersOnSubnet : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpGatewayIp, 4); + for (int i = 0; i < opt_len-4; i++) + { + _dhcpUdpSocket.read(); + } + break; + + case dns : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpDnsServerIp, 4); + for (int i = 0; i < opt_len-4; i++) + { + _dhcpUdpSocket.read(); + } + break; + + case dhcpServerIdentifier : + opt_len = _dhcpUdpSocket.read(); + if( *((uint32_t*)_dhcpDhcpServerIp) == 0 || + IPAddress(_dhcpDhcpServerIp) == _dhcpUdpSocket.remoteIP() ) + { + _dhcpUdpSocket.read(_dhcpDhcpServerIp, sizeof(_dhcpDhcpServerIp)); + } + else + { + // Skip over the rest of this option + while (opt_len--) + { + _dhcpUdpSocket.read(); + } + } + break; + + case dhcpT1value : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpT1, sizeof(_dhcpT1)); + _dhcpT1 = ntohl(_dhcpT1); + break; + + case dhcpT2value : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpT2, sizeof(_dhcpT2)); + _dhcpT2 = ntohl(_dhcpT2); + break; + + case dhcpIPaddrLeaseTime : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpLeaseTime, sizeof(_dhcpLeaseTime)); + _dhcpLeaseTime = ntohl(_dhcpLeaseTime); + _renewInSec = _dhcpLeaseTime; + break; + + default : + opt_len = _dhcpUdpSocket.read(); + // Skip over the rest of this option + while (opt_len--) + { + _dhcpUdpSocket.read(); + } + break; + } + } + } + + // Need to skip to end of the packet regardless here + _dhcpUdpSocket.flush(); + + return type; +} + + +/* + returns: + 0/DHCP_CHECK_NONE: nothing happened + 1/DHCP_CHECK_RENEW_FAIL: renew failed + 2/DHCP_CHECK_RENEW_OK: renew success + 3/DHCP_CHECK_REBIND_FAIL: rebind fail + 4/DHCP_CHECK_REBIND_OK: rebind success +*/ +int DhcpClass::checkLease(){ + //this uses a signed / unsigned trick to deal with millis overflow + unsigned long now = millis(); + signed long snow = (long)now; + int rc=DHCP_CHECK_NONE; + if (_lastCheck != 0){ + signed long factor; + //calc how many ms past the timeout we are + factor = snow - (long)_secTimeout; + //if on or passed the timeout, reduce the counters + if ( factor >= 0 ){ + //next timeout should be now plus 1000 ms minus parts of second in factor + _secTimeout = snow + 1000 - factor % 1000; + //how many seconds late are we, minimum 1 + factor = factor / 1000 +1; + + //reduce the counters by that mouch + //if we can assume that the cycle time (factor) is fairly constant + //and if the remainder is less than cycle time * 2 + //do it early instead of late + if(_renewInSec < factor*2 ) + _renewInSec = 0; + else + _renewInSec -= factor; + + if(_rebindInSec < factor*2 ) + _rebindInSec = 0; + else + _rebindInSec -= factor; + } + + //if we have a lease but should renew, do it + if (_dhcp_state == STATE_DHCP_LEASED && _renewInSec <=0){ + _dhcp_state = STATE_DHCP_REREQUEST; + rc = 1 + request_DHCP_lease(); + } + + //if we have a lease or is renewing but should bind, do it + if( (_dhcp_state == STATE_DHCP_LEASED || _dhcp_state == STATE_DHCP_START) && _rebindInSec <=0){ + //this should basically restart completely + _dhcp_state = STATE_DHCP_START; + reset_DHCP_lease(); + rc = 3 + request_DHCP_lease(); + } + } + else{ + _secTimeout = snow + 1000; + } + + _lastCheck = now; + return rc; +} + +IPAddress DhcpClass::getLocalIp() +{ + return IPAddress(_dhcpLocalIp); +} + +IPAddress DhcpClass::getSubnetMask() +{ + return IPAddress(_dhcpSubnetMask); +} + +IPAddress DhcpClass::getGatewayIp() +{ + return IPAddress(_dhcpGatewayIp); +} + +IPAddress DhcpClass::getDhcpServerIp() +{ + return IPAddress(_dhcpDhcpServerIp); +} + +IPAddress DhcpClass::getDnsServerIp() +{ + return IPAddress(_dhcpDnsServerIp); +} + +void DhcpClass::printByte(char * buf, uint8_t n ) { + char *str = &buf[1]; + buf[0]='0'; + do { + unsigned long m = n; + n /= 16; + char c = m - 16 * n; + *str-- = c < 10 ? c + '0' : c + 'A' - 10; + } while(n); +} diff --git a/hardware/arduino/avr/libraries/Ethernet/Dhcp.h b/hardware/arduino/avr/libraries/Ethernet/Dhcp.h index 4a47936f0f2..6f9c632c74e 100644 --- a/hardware/arduino/avr/libraries/Ethernet/Dhcp.h +++ b/hardware/arduino/avr/libraries/Ethernet/Dhcp.h @@ -1,178 +1,178 @@ -// DHCP Library v0.3 - April 25, 2009 -// Author: Jordan Terrell - blog.jordanterrell.com - -#ifndef Dhcp_h -#define Dhcp_h - -#include "EthernetUdp.h" - -/* DHCP state machine. */ -#define STATE_DHCP_START 0 -#define STATE_DHCP_DISCOVER 1 -#define STATE_DHCP_REQUEST 2 -#define STATE_DHCP_LEASED 3 -#define STATE_DHCP_REREQUEST 4 -#define STATE_DHCP_RELEASE 5 - -#define DHCP_FLAGSBROADCAST 0x8000 - -/* UDP port numbers for DHCP */ -#define DHCP_SERVER_PORT 67 /* from server to client */ -#define DHCP_CLIENT_PORT 68 /* from client to server */ - -/* DHCP message OP code */ -#define DHCP_BOOTREQUEST 1 -#define DHCP_BOOTREPLY 2 - -/* DHCP message type */ -#define DHCP_DISCOVER 1 -#define DHCP_OFFER 2 -#define DHCP_REQUEST 3 -#define DHCP_DECLINE 4 -#define DHCP_ACK 5 -#define DHCP_NAK 6 -#define DHCP_RELEASE 7 -#define DHCP_INFORM 8 - -#define DHCP_HTYPE10MB 1 -#define DHCP_HTYPE100MB 2 - -#define DHCP_HLENETHERNET 6 -#define DHCP_HOPS 0 -#define DHCP_SECS 0 - -#define MAGIC_COOKIE 0x63825363 -#define MAX_DHCP_OPT 16 - -#define HOST_NAME "WIZnet" -#define DEFAULT_LEASE (900) //default lease time in seconds - -#define DHCP_CHECK_NONE (0) -#define DHCP_CHECK_RENEW_FAIL (1) -#define DHCP_CHECK_RENEW_OK (2) -#define DHCP_CHECK_REBIND_FAIL (3) -#define DHCP_CHECK_REBIND_OK (4) - -enum -{ - padOption = 0, - subnetMask = 1, - timerOffset = 2, - routersOnSubnet = 3, - /* timeServer = 4, - nameServer = 5,*/ - dns = 6, - /*logServer = 7, - cookieServer = 8, - lprServer = 9, - impressServer = 10, - resourceLocationServer = 11,*/ - hostName = 12, - /*bootFileSize = 13, - meritDumpFile = 14,*/ - domainName = 15, - /*swapServer = 16, - rootPath = 17, - extentionsPath = 18, - IPforwarding = 19, - nonLocalSourceRouting = 20, - policyFilter = 21, - maxDgramReasmSize = 22, - defaultIPTTL = 23, - pathMTUagingTimeout = 24, - pathMTUplateauTable = 25, - ifMTU = 26, - allSubnetsLocal = 27, - broadcastAddr = 28, - performMaskDiscovery = 29, - maskSupplier = 30, - performRouterDiscovery = 31, - routerSolicitationAddr = 32, - staticRoute = 33, - trailerEncapsulation = 34, - arpCacheTimeout = 35, - ethernetEncapsulation = 36, - tcpDefaultTTL = 37, - tcpKeepaliveInterval = 38, - tcpKeepaliveGarbage = 39, - nisDomainName = 40, - nisServers = 41, - ntpServers = 42, - vendorSpecificInfo = 43, - netBIOSnameServer = 44, - netBIOSdgramDistServer = 45, - netBIOSnodeType = 46, - netBIOSscope = 47, - xFontServer = 48, - xDisplayManager = 49,*/ - dhcpRequestedIPaddr = 50, - dhcpIPaddrLeaseTime = 51, - /*dhcpOptionOverload = 52,*/ - dhcpMessageType = 53, - dhcpServerIdentifier = 54, - dhcpParamRequest = 55, - /*dhcpMsg = 56, - dhcpMaxMsgSize = 57,*/ - dhcpT1value = 58, - dhcpT2value = 59, - /*dhcpClassIdentifier = 60,*/ - dhcpClientIdentifier = 61, - endOption = 255 -}; - -typedef struct _RIP_MSG_FIXED -{ - uint8_t op; - uint8_t htype; - uint8_t hlen; - uint8_t hops; - uint32_t xid; - uint16_t secs; - uint16_t flags; - uint8_t ciaddr[4]; - uint8_t yiaddr[4]; - uint8_t siaddr[4]; - uint8_t giaddr[4]; - uint8_t chaddr[6]; -}RIP_MSG_FIXED; - -class DhcpClass { -private: - uint32_t _dhcpInitialTransactionId; - uint32_t _dhcpTransactionId; - uint8_t _dhcpMacAddr[6]; - uint8_t _dhcpLocalIp[4]; - uint8_t _dhcpSubnetMask[4]; - uint8_t _dhcpGatewayIp[4]; - uint8_t _dhcpDhcpServerIp[4]; - uint8_t _dhcpDnsServerIp[4]; - uint32_t _dhcpLeaseTime; - uint32_t _dhcpT1, _dhcpT2; - signed long _renewInSec; - signed long _rebindInSec; - signed long _lastCheck; - unsigned long _timeout; - unsigned long _responseTimeout; - unsigned long _secTimeout; - uint8_t _dhcp_state; - EthernetUDP _dhcpUdpSocket; - - int request_DHCP_lease(); - void reset_DHCP_lease(); - void presend_DHCP(); - void send_DHCP_MESSAGE(uint8_t, uint16_t); - void printByte(char *, uint8_t); - - uint8_t parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId); -public: - IPAddress getLocalIp(); - IPAddress getSubnetMask(); - IPAddress getGatewayIp(); - IPAddress getDhcpServerIp(); - IPAddress getDnsServerIp(); - - int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000); - int checkLease(); -}; - -#endif +// DHCP Library v0.3 - April 25, 2009 +// Author: Jordan Terrell - blog.jordanterrell.com + +#ifndef Dhcp_h +#define Dhcp_h + +#include "EthernetUdp.h" + +/* DHCP state machine. */ +#define STATE_DHCP_START 0 +#define STATE_DHCP_DISCOVER 1 +#define STATE_DHCP_REQUEST 2 +#define STATE_DHCP_LEASED 3 +#define STATE_DHCP_REREQUEST 4 +#define STATE_DHCP_RELEASE 5 + +#define DHCP_FLAGSBROADCAST 0x8000 + +/* UDP port numbers for DHCP */ +#define DHCP_SERVER_PORT 67 /* from server to client */ +#define DHCP_CLIENT_PORT 68 /* from client to server */ + +/* DHCP message OP code */ +#define DHCP_BOOTREQUEST 1 +#define DHCP_BOOTREPLY 2 + +/* DHCP message type */ +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +#define DHCP_HTYPE10MB 1 +#define DHCP_HTYPE100MB 2 + +#define DHCP_HLENETHERNET 6 +#define DHCP_HOPS 0 +#define DHCP_SECS 0 + +#define MAGIC_COOKIE 0x63825363 +#define MAX_DHCP_OPT 16 + +#define HOST_NAME "WIZnet" +#define DEFAULT_LEASE (900) //default lease time in seconds + +#define DHCP_CHECK_NONE (0) +#define DHCP_CHECK_RENEW_FAIL (1) +#define DHCP_CHECK_RENEW_OK (2) +#define DHCP_CHECK_REBIND_FAIL (3) +#define DHCP_CHECK_REBIND_OK (4) + +enum +{ + padOption = 0, + subnetMask = 1, + timerOffset = 2, + routersOnSubnet = 3, + /* timeServer = 4, + nameServer = 5,*/ + dns = 6, + /*logServer = 7, + cookieServer = 8, + lprServer = 9, + impressServer = 10, + resourceLocationServer = 11,*/ + hostName = 12, + /*bootFileSize = 13, + meritDumpFile = 14,*/ + domainName = 15, + /*swapServer = 16, + rootPath = 17, + extentionsPath = 18, + IPforwarding = 19, + nonLocalSourceRouting = 20, + policyFilter = 21, + maxDgramReasmSize = 22, + defaultIPTTL = 23, + pathMTUagingTimeout = 24, + pathMTUplateauTable = 25, + ifMTU = 26, + allSubnetsLocal = 27, + broadcastAddr = 28, + performMaskDiscovery = 29, + maskSupplier = 30, + performRouterDiscovery = 31, + routerSolicitationAddr = 32, + staticRoute = 33, + trailerEncapsulation = 34, + arpCacheTimeout = 35, + ethernetEncapsulation = 36, + tcpDefaultTTL = 37, + tcpKeepaliveInterval = 38, + tcpKeepaliveGarbage = 39, + nisDomainName = 40, + nisServers = 41, + ntpServers = 42, + vendorSpecificInfo = 43, + netBIOSnameServer = 44, + netBIOSdgramDistServer = 45, + netBIOSnodeType = 46, + netBIOSscope = 47, + xFontServer = 48, + xDisplayManager = 49,*/ + dhcpRequestedIPaddr = 50, + dhcpIPaddrLeaseTime = 51, + /*dhcpOptionOverload = 52,*/ + dhcpMessageType = 53, + dhcpServerIdentifier = 54, + dhcpParamRequest = 55, + /*dhcpMsg = 56, + dhcpMaxMsgSize = 57,*/ + dhcpT1value = 58, + dhcpT2value = 59, + /*dhcpClassIdentifier = 60,*/ + dhcpClientIdentifier = 61, + endOption = 255 +}; + +typedef struct _RIP_MSG_FIXED +{ + uint8_t op; + uint8_t htype; + uint8_t hlen; + uint8_t hops; + uint32_t xid; + uint16_t secs; + uint16_t flags; + uint8_t ciaddr[4]; + uint8_t yiaddr[4]; + uint8_t siaddr[4]; + uint8_t giaddr[4]; + uint8_t chaddr[6]; +}RIP_MSG_FIXED; + +class DhcpClass { +private: + uint32_t _dhcpInitialTransactionId; + uint32_t _dhcpTransactionId; + uint8_t _dhcpMacAddr[6]; + uint8_t _dhcpLocalIp[4]; + uint8_t _dhcpSubnetMask[4]; + uint8_t _dhcpGatewayIp[4]; + uint8_t _dhcpDhcpServerIp[4]; + uint8_t _dhcpDnsServerIp[4]; + uint32_t _dhcpLeaseTime; + uint32_t _dhcpT1, _dhcpT2; + signed long _renewInSec; + signed long _rebindInSec; + signed long _lastCheck; + unsigned long _timeout; + unsigned long _responseTimeout; + unsigned long _secTimeout; + uint8_t _dhcp_state; + EthernetUDP _dhcpUdpSocket; + + int request_DHCP_lease(); + void reset_DHCP_lease(); + void presend_DHCP(); + void send_DHCP_MESSAGE(uint8_t, uint16_t); + void printByte(char *, uint8_t); + + uint8_t parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId); +public: + IPAddress getLocalIp(); + IPAddress getSubnetMask(); + IPAddress getGatewayIp(); + IPAddress getDhcpServerIp(); + IPAddress getDnsServerIp(); + + int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000); + int checkLease(); +}; + +#endif diff --git a/hardware/arduino/avr/libraries/Ethernet/Dns.h b/hardware/arduino/avr/libraries/Ethernet/Dns.h index 6bcb98ab9eb..c99f5c3769c 100644 --- a/hardware/arduino/avr/libraries/Ethernet/Dns.h +++ b/hardware/arduino/avr/libraries/Ethernet/Dns.h @@ -1,41 +1,41 @@ -// Arduino DNS client for WizNet5100-based Ethernet shield -// (c) Copyright 2009-2010 MCQN Ltd. -// Released under Apache License, version 2.0 - -#ifndef DNSClient_h -#define DNSClient_h - -#include - -class DNSClient -{ -public: - // ctor - void begin(const IPAddress& aDNSServer); - - /** Convert a numeric IP address string into a four-byte IP address. - @param aIPAddrString IP address to convert - @param aResult IPAddress structure to store the returned IP address - @result 1 if aIPAddrString was successfully converted to an IP address, - else error code - */ - int inet_aton(const char *aIPAddrString, IPAddress& aResult); - - /** Resolve the given hostname to an IP address. - @param aHostname Name to be resolved - @param aResult IPAddress structure to store the returned IP address - @result 1 if aIPAddrString was successfully converted to an IP address, - else error code - */ - int getHostByName(const char* aHostname, IPAddress& aResult); - -protected: - uint16_t BuildRequest(const char* aName); - uint16_t ProcessResponse(uint16_t aTimeout, IPAddress& aAddress); - - IPAddress iDNSServer; - uint16_t iRequestId; - EthernetUDP iUdp; -}; - -#endif +// Arduino DNS client for WizNet5100-based Ethernet shield +// (c) Copyright 2009-2010 MCQN Ltd. +// Released under Apache License, version 2.0 + +#ifndef DNSClient_h +#define DNSClient_h + +#include + +class DNSClient +{ +public: + // ctor + void begin(const IPAddress& aDNSServer); + + /** Convert a numeric IP address string into a four-byte IP address. + @param aIPAddrString IP address to convert + @param aResult IPAddress structure to store the returned IP address + @result 1 if aIPAddrString was successfully converted to an IP address, + else error code + */ + int inet_aton(const char *aIPAddrString, IPAddress& aResult); + + /** Resolve the given hostname to an IP address. + @param aHostname Name to be resolved + @param aResult IPAddress structure to store the returned IP address + @result 1 if aIPAddrString was successfully converted to an IP address, + else error code + */ + int getHostByName(const char* aHostname, IPAddress& aResult); + +protected: + uint16_t BuildRequest(const char* aName); + uint16_t ProcessResponse(uint16_t aTimeout, IPAddress& aAddress); + + IPAddress iDNSServer; + uint16_t iRequestId; + EthernetUDP iUdp; +}; + +#endif diff --git a/hardware/arduino/avr/libraries/GSM/GSM3CircularBuffer.cpp b/hardware/arduino/avr/libraries/GSM/GSM3CircularBuffer.cpp index e64c571203f..ea6f7d86548 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3CircularBuffer.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3CircularBuffer.cpp @@ -1,319 +1,319 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include "GSM3CircularBuffer.h" -#include - -GSM3CircularBuffer::GSM3CircularBuffer(GSM3CircularBufferManager* mgr) -{ - head=0; - tail=0; - cbm=mgr; -} - -int GSM3CircularBuffer::write(char c) -{ - byte aux=(tail+1)& __BUFFERMASK__; - if(aux!=head) - { - theBuffer[tail]=c; - // Lets put an extra zero at the end, so we can - // read chains as we like. - // This is not exactly perfect, we are always 1+ behind the head - theBuffer[aux]=0; - tail=aux; - return 1; - } - return 0; -} - -char GSM3CircularBuffer::read() -{ - char res; - if(head!=tail) - { - res=theBuffer[head]; - head=(head+1)& __BUFFERMASK__; - //if(cbm) - // cbm->spaceAvailable(); - return res; - } - else - { - return 0; - } -} - -char GSM3CircularBuffer::peek(int increment) -{ - char res; - byte num_aux; - - if (tail>head) num_aux = tail-head; - else num_aux = 128 - head + tail; - - if(increment < num_aux) - { - res=theBuffer[head]; - return res; - } - else - { - return 0; - } -} - -void GSM3CircularBufferManager::spaceAvailable(){return;}; - -void GSM3CircularBuffer::flush() -{ - head=tail; -} - -char* GSM3CircularBuffer::nextString() -{ - while(head!=tail) - { - head=(head+1) & __BUFFERMASK__; - if(theBuffer[head]==0) - { - head=(head+1) & __BUFFERMASK__; - return (char*)theBuffer+head; - } - } - return 0; -} - - -bool GSM3CircularBuffer::locate(const char* reference) -{ - - return locate(reference, head, tail, 0, 0); -} - -bool GSM3CircularBuffer::chopUntil(const char* reference, bool movetotheend, bool usehead) -{ - byte from, to; - - if(locate(reference, head, tail, &from, &to)) - { - if(usehead) - { - if(movetotheend) - head=(to+1) & __BUFFERMASK__; - else - head=from; - } - else - { - if(movetotheend) - tail=(to+1) & __BUFFERMASK__; - else - tail=from; - } - return true; - } - else - { - return false; - } -} - -bool GSM3CircularBuffer::locate(const char* reference, byte thishead, byte thistail, byte* from, byte* to) -{ - int refcursor=0; - bool into=false; - byte b2, binit; - bool possible=1; - - if(reference[0]==0) - return true; - - for(byte b1=thishead; b1!=thistail;b1=(b1+1)& __BUFFERMASK__) - { - possible = 1; - b2 = b1; - while (possible&&(b2!=thistail)) - { - if(theBuffer[b2]==reference[refcursor]) - { - if(!into) - binit=b2; - into=true; - refcursor++; - if(reference[refcursor]==0) - { - if(from) - *from=binit; - if(to) - *to=b2; - return true; - } - } - else if (into==true) - { - possible = 0; - into=false; - refcursor=0; - } - b2=(b2+1)& __BUFFERMASK__; - } - } - return false; -} - -bool GSM3CircularBuffer::extractSubstring(const char* from, const char* to, char* buffer, int bufsize) -{ - byte t1; - byte h2; - byte b; - int i; - -//DEBUG -//Serial.println("Beginning extractSubstring"); -//Serial.print("head,tail=");Serial.print(int(head));Serial.print(",");Serial.println(int(tail)); - - if(!locate(from, head, tail, 0, &t1)) - return false; - -//DEBUG -//Serial.println("Located chain from."); - - t1++; //To point the next. - if(!locate(to, t1, tail, &h2, 0)) - return false; - -//DEBUG -//Serial.println("Located chain to."); -/*Serial.print("t1=");Serial.println(int(t1)); -Serial.print("h2=");Serial.println(int(h2));*/ - - - for(i=0,b=t1;i='0')&&(c<='9')) - { - anyfound=true; - res=(res*10)+(int)c-48; - } - else - { - if(negative) - res=(-1)*res; - return res; - } - } - if(negative) - res=(-1)*res; - return res; -} - -void GSM3CircularBuffer::debugBuffer() -{ - byte h1=head; - byte t1=tail; - Serial.println(); - Serial.print(h1); - Serial.print(" "); - Serial.print(t1); - Serial.print('>'); - for(byte b=h1; b!=t1; b=(b+1)& __BUFFERMASK__) - printCharDebug(theBuffer[b]); - Serial.println(); -} - -void GSM3CircularBuffer::printCharDebug(uint8_t c) -{ - if((c>31)&&(c<127)) - Serial.print((char)c); - else - { - Serial.print('%'); - Serial.print(c); - Serial.print('%'); - } -} - -bool GSM3CircularBuffer::retrieveBuffer(char* buffer, int bufsize, int& SizeWritten) -{ - byte b; - int i; - - /*for(i=0,b=head;i + +GSM3CircularBuffer::GSM3CircularBuffer(GSM3CircularBufferManager* mgr) +{ + head=0; + tail=0; + cbm=mgr; +} + +int GSM3CircularBuffer::write(char c) +{ + byte aux=(tail+1)& __BUFFERMASK__; + if(aux!=head) + { + theBuffer[tail]=c; + // Lets put an extra zero at the end, so we can + // read chains as we like. + // This is not exactly perfect, we are always 1+ behind the head + theBuffer[aux]=0; + tail=aux; + return 1; + } + return 0; +} + +char GSM3CircularBuffer::read() +{ + char res; + if(head!=tail) + { + res=theBuffer[head]; + head=(head+1)& __BUFFERMASK__; + //if(cbm) + // cbm->spaceAvailable(); + return res; + } + else + { + return 0; + } +} + +char GSM3CircularBuffer::peek(int increment) +{ + char res; + byte num_aux; + + if (tail>head) num_aux = tail-head; + else num_aux = 128 - head + tail; + + if(increment < num_aux) + { + res=theBuffer[head]; + return res; + } + else + { + return 0; + } +} + +void GSM3CircularBufferManager::spaceAvailable(){return;}; + +void GSM3CircularBuffer::flush() +{ + head=tail; +} + +char* GSM3CircularBuffer::nextString() +{ + while(head!=tail) + { + head=(head+1) & __BUFFERMASK__; + if(theBuffer[head]==0) + { + head=(head+1) & __BUFFERMASK__; + return (char*)theBuffer+head; + } + } + return 0; +} + + +bool GSM3CircularBuffer::locate(const char* reference) +{ + + return locate(reference, head, tail, 0, 0); +} + +bool GSM3CircularBuffer::chopUntil(const char* reference, bool movetotheend, bool usehead) +{ + byte from, to; + + if(locate(reference, head, tail, &from, &to)) + { + if(usehead) + { + if(movetotheend) + head=(to+1) & __BUFFERMASK__; + else + head=from; + } + else + { + if(movetotheend) + tail=(to+1) & __BUFFERMASK__; + else + tail=from; + } + return true; + } + else + { + return false; + } +} + +bool GSM3CircularBuffer::locate(const char* reference, byte thishead, byte thistail, byte* from, byte* to) +{ + int refcursor=0; + bool into=false; + byte b2, binit; + bool possible=1; + + if(reference[0]==0) + return true; + + for(byte b1=thishead; b1!=thistail;b1=(b1+1)& __BUFFERMASK__) + { + possible = 1; + b2 = b1; + while (possible&&(b2!=thistail)) + { + if(theBuffer[b2]==reference[refcursor]) + { + if(!into) + binit=b2; + into=true; + refcursor++; + if(reference[refcursor]==0) + { + if(from) + *from=binit; + if(to) + *to=b2; + return true; + } + } + else if (into==true) + { + possible = 0; + into=false; + refcursor=0; + } + b2=(b2+1)& __BUFFERMASK__; + } + } + return false; +} + +bool GSM3CircularBuffer::extractSubstring(const char* from, const char* to, char* buffer, int bufsize) +{ + byte t1; + byte h2; + byte b; + int i; + +//DEBUG +//Serial.println("Beginning extractSubstring"); +//Serial.print("head,tail=");Serial.print(int(head));Serial.print(",");Serial.println(int(tail)); + + if(!locate(from, head, tail, 0, &t1)) + return false; + +//DEBUG +//Serial.println("Located chain from."); + + t1++; //To point the next. + if(!locate(to, t1, tail, &h2, 0)) + return false; + +//DEBUG +//Serial.println("Located chain to."); +/*Serial.print("t1=");Serial.println(int(t1)); +Serial.print("h2=");Serial.println(int(h2));*/ + + + for(i=0,b=t1;i='0')&&(c<='9')) + { + anyfound=true; + res=(res*10)+(int)c-48; + } + else + { + if(negative) + res=(-1)*res; + return res; + } + } + if(negative) + res=(-1)*res; + return res; +} + +void GSM3CircularBuffer::debugBuffer() +{ + byte h1=head; + byte t1=tail; + Serial.println(); + Serial.print(h1); + Serial.print(" "); + Serial.print(t1); + Serial.print('>'); + for(byte b=h1; b!=t1; b=(b+1)& __BUFFERMASK__) + printCharDebug(theBuffer[b]); + Serial.println(); +} + +void GSM3CircularBuffer::printCharDebug(uint8_t c) +{ + if((c>31)&&(c<127)) + Serial.print((char)c); + else + { + Serial.print('%'); + Serial.print(c); + Serial.print('%'); + } +} + +bool GSM3CircularBuffer::retrieveBuffer(char* buffer, int bufsize, int& SizeWritten) +{ + byte b; + int i; + + /*for(i=0,b=head;i -#include - -#ifndef byte -#define byte uint8_t -#endif - -// These values have to be interrelated -// To-Do: may we have just one? (BUFFERMASK) -#define __BUFFERSIZE__ 128 -#define __BUFFERMASK__ 0x7F - -class GSM3CircularBufferManager -{ - public: - - /** If there is spaceAvailable in the buffer, lets send a XON - */ - virtual void spaceAvailable(); -}; - -class GSM3CircularBuffer -{ - private: - // Buffer pointers. - // head=tail means buffer empty - // tail=head-1 means buffer full - // tail=head+1 means just one char (pointed by head) - // REMEMBER. head can be moved only by the main program - // REMEMBER. tail can be moved only by the other thread (interrupts) - // REMEMBER. head and tail can move only FORWARD - volatile byte head; // First written one - volatile byte tail; // Last written one. - - GSM3CircularBufferManager* cbm; // Circular buffer manager - - // The buffer - volatile byte theBuffer[__BUFFERSIZE__]; - - /** Checks if a substring exists in the buffer - @param reference Substring - @param thishead Head - @param thistail Tail - @param from Initial byte position - @param to Final byte position - @return true if exists, in otherwise return false - */ - bool locate(const char* reference, byte thishead, byte thistail, byte* from=0, byte* to=0); - - public: - - /** Constructor - @param mgr Circular buffer manager - */ - GSM3CircularBuffer(GSM3CircularBufferManager* mgr=0); - - // TO-DO.Check if this formule runs too at the buffer limit - - /** Get available bytes in circular buffer - @return available bytes - */ - inline byte availableBytes(){ return ((head-(tail+1))&__BUFFERMASK__);}; - - /** Stored bytes in circular buffer - @return stored bytes - */ - inline byte storedBytes(){ return ((tail-head)&__BUFFERMASK__);}; - - /** Write a character in circular buffer - @param c Character - @return 1 if successful - */ - int write(char c); - - /** Returns a character and moves the pointer - @return character - */ - char read(); - - /** Returns a character but does not move the pointer. - @param increment Increment - @return character - */ - char peek(int increment); - - /** Returns a pointer to the head of the buffer - @return buffer with pointer in head - */ - inline char* firstString(){return (char*)theBuffer+head;}; - - /** Go forward one string - @return buffer with one string advance - */ - char* nextString(); - - /** Flush circular buffer - */ - void flush(); - - /** Get tail - @return tail - */ - inline byte getTail(){return tail;}; - - /** Get head - @return head - */ - inline byte getHead(){return head;}; - - // Only can be executed from the interrupt! - /** Delete circular buffer to the end - @param from Initial byte position - */ - inline void deleteToTheEnd(byte from){tail=from;}; - - /** Checks if a substring exists in the buffer - move=0, dont move, =1,put head at the beginning of the string, =2, put head at the end - @param reference - @return true if exists, in otherwise return false - */ - bool locate(const char* reference); - - /** Locates reference. If found, moves head (or tail) to the beginning (or end) - @param reference - @param movetotheend - @param head - @return true if successful - */ - bool chopUntil(const char* reference, bool movetotheend, bool head=true); - - /** Reads an integer from the head. Stops with first non blank, non number character - @return integer from the head - */ - int readInt(); - - // Caveat: copies the first bytes until buffer is full - - /** Extract a substring from circular buffer - @param from Initial byte position - @param to Final byte position - @param buffer Buffer for copy substring - @param bufsize Buffer size - @return true if successful, false if substring does not exists - */ - bool extractSubstring(const char* from, const char* to, char* buffer, int bufsize); - - /** Retrieve all the contents of buffer from head to tail - @param buffer - @param bufsize - @param SizeWritten - @return true if successful - */ - bool retrieveBuffer(char* buffer, int bufsize, int& SizeWritten); - - /** Debug function to print the buffer after receiving data from the modem. - */ - void debugBuffer(); - - /** Utility: dump character if printable, else, put in %x% - @param c Character - */ - static void printCharDebug(uint8_t c); - - -}; - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef __GSM3_CIRCULARBUFFER__ +#define __GSM3_CIRCULARBUFFER__ + + +#include +#include + +#ifndef byte +#define byte uint8_t +#endif + +// These values have to be interrelated +// To-Do: may we have just one? (BUFFERMASK) +#define __BUFFERSIZE__ 128 +#define __BUFFERMASK__ 0x7F + +class GSM3CircularBufferManager +{ + public: + + /** If there is spaceAvailable in the buffer, lets send a XON + */ + virtual void spaceAvailable(); +}; + +class GSM3CircularBuffer +{ + private: + // Buffer pointers. + // head=tail means buffer empty + // tail=head-1 means buffer full + // tail=head+1 means just one char (pointed by head) + // REMEMBER. head can be moved only by the main program + // REMEMBER. tail can be moved only by the other thread (interrupts) + // REMEMBER. head and tail can move only FORWARD + volatile byte head; // First written one + volatile byte tail; // Last written one. + + GSM3CircularBufferManager* cbm; // Circular buffer manager + + // The buffer + volatile byte theBuffer[__BUFFERSIZE__]; + + /** Checks if a substring exists in the buffer + @param reference Substring + @param thishead Head + @param thistail Tail + @param from Initial byte position + @param to Final byte position + @return true if exists, in otherwise return false + */ + bool locate(const char* reference, byte thishead, byte thistail, byte* from=0, byte* to=0); + + public: + + /** Constructor + @param mgr Circular buffer manager + */ + GSM3CircularBuffer(GSM3CircularBufferManager* mgr=0); + + // TO-DO.Check if this formule runs too at the buffer limit + + /** Get available bytes in circular buffer + @return available bytes + */ + inline byte availableBytes(){ return ((head-(tail+1))&__BUFFERMASK__);}; + + /** Stored bytes in circular buffer + @return stored bytes + */ + inline byte storedBytes(){ return ((tail-head)&__BUFFERMASK__);}; + + /** Write a character in circular buffer + @param c Character + @return 1 if successful + */ + int write(char c); + + /** Returns a character and moves the pointer + @return character + */ + char read(); + + /** Returns a character but does not move the pointer. + @param increment Increment + @return character + */ + char peek(int increment); + + /** Returns a pointer to the head of the buffer + @return buffer with pointer in head + */ + inline char* firstString(){return (char*)theBuffer+head;}; + + /** Go forward one string + @return buffer with one string advance + */ + char* nextString(); + + /** Flush circular buffer + */ + void flush(); + + /** Get tail + @return tail + */ + inline byte getTail(){return tail;}; + + /** Get head + @return head + */ + inline byte getHead(){return head;}; + + // Only can be executed from the interrupt! + /** Delete circular buffer to the end + @param from Initial byte position + */ + inline void deleteToTheEnd(byte from){tail=from;}; + + /** Checks if a substring exists in the buffer + move=0, dont move, =1,put head at the beginning of the string, =2, put head at the end + @param reference + @return true if exists, in otherwise return false + */ + bool locate(const char* reference); + + /** Locates reference. If found, moves head (or tail) to the beginning (or end) + @param reference + @param movetotheend + @param head + @return true if successful + */ + bool chopUntil(const char* reference, bool movetotheend, bool head=true); + + /** Reads an integer from the head. Stops with first non blank, non number character + @return integer from the head + */ + int readInt(); + + // Caveat: copies the first bytes until buffer is full + + /** Extract a substring from circular buffer + @param from Initial byte position + @param to Final byte position + @param buffer Buffer for copy substring + @param bufsize Buffer size + @return true if successful, false if substring does not exists + */ + bool extractSubstring(const char* from, const char* to, char* buffer, int bufsize); + + /** Retrieve all the contents of buffer from head to tail + @param buffer + @param bufsize + @param SizeWritten + @return true if successful + */ + bool retrieveBuffer(char* buffer, int bufsize, int& SizeWritten); + + /** Debug function to print the buffer after receiving data from the modem. + */ + void debugBuffer(); + + /** Utility: dump character if printable, else, put in %x% + @param c Character + */ + static void printCharDebug(uint8_t c); + + +}; + + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.cpp b/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.cpp index a913f54bae3..15874a134bf 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.cpp @@ -1,260 +1,260 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include -#include -#include - -// While there is only a shield (ShieldV1) we will include it by default -#include -GSM3ShieldV1ClientProvider theShieldV1ClientProvider; - - -#define GSM3MOBILECLIENTSERVICE_CLIENT 0x01 // 1: This side is Client. 0: This side is Server -#define GSM3MOBILECLIENTSERVICE_WRITING 0x02 // 1: TRUE 0: FALSE -#define GSM3MOBILECLIENTSERVICE_SYNCH 0x04 // 1: TRUE, compatible with other clients 0: FALSE - -#define __TOUTBEGINWRITE__ 10000 - - -GSM3MobileClientService::GSM3MobileClientService(bool synch) -{ - flags = GSM3MOBILECLIENTSERVICE_CLIENT; - if(synch) - flags |= GSM3MOBILECLIENTSERVICE_SYNCH; - mySocket=255; -} - -GSM3MobileClientService::GSM3MobileClientService(int socket, bool synch) -{ - // We are creating a socket on an existing, occupied one. - flags=0; - if(synch) - flags |= GSM3MOBILECLIENTSERVICE_SYNCH; - mySocket=socket; - theGSM3MobileClientProvider->getSocket(socket); - -} - -// Returns 0 if last command is still executing -// 1 if success -// >1 if error -int GSM3MobileClientService::ready() -{ - return theGSM3MobileClientProvider->ready(); -} - -int GSM3MobileClientService::connect(IPAddress add, uint16_t port) -{ - if(theGSM3MobileClientProvider==0) - return 2; - - // TODO: ask for the socket id - mySocket=theGSM3MobileClientProvider->getSocket(); - - if(mySocket<0) - return 2; - - int res=theGSM3MobileClientProvider->connectTCPClient(add, port, mySocket); - if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) - res=waitForAnswer(); - - return res; -}; - -int GSM3MobileClientService::connect(const char *host, uint16_t port) -{ - - if(theGSM3MobileClientProvider==0) - return 2; - // TODO: ask for the socket id - mySocket=theGSM3MobileClientProvider->getSocket(); - - if(mySocket<0) - return 2; - - int res=theGSM3MobileClientProvider->connectTCPClient(host, port, mySocket); - if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) - res=waitForAnswer(); - - return res; -} - -int GSM3MobileClientService::waitForAnswer() -{ - unsigned long m; - m=millis(); - int res; - - while(((millis()-m)< __TOUTBEGINWRITE__ )&&(ready()==0)) - delay(100); - - res=ready(); - - // If we get something different from a 1, we are having a problem - if(res!=1) - res=0; - - return res; -} - -void GSM3MobileClientService::beginWrite(bool sync) -{ - flags |= GSM3MOBILECLIENTSERVICE_WRITING; - theGSM3MobileClientProvider->beginWriteSocket(flags & GSM3MOBILECLIENTSERVICE_CLIENT, mySocket); - if(sync) - waitForAnswer(); -} - -size_t GSM3MobileClientService::write(uint8_t c) -{ - if(!(flags & GSM3MOBILECLIENTSERVICE_WRITING)) - beginWrite(true); - theGSM3MobileClientProvider->writeSocket(c); - return 1; -} - -size_t GSM3MobileClientService::write(const uint8_t* buf) -{ - if(!(flags & GSM3MOBILECLIENTSERVICE_WRITING)) - beginWrite(true); - theGSM3MobileClientProvider->writeSocket((const char*)(buf)); - return strlen((const char*)buf); -} - -size_t GSM3MobileClientService::write(const uint8_t* buf, size_t sz) -{ - if(!(flags & GSM3MOBILECLIENTSERVICE_WRITING)) - beginWrite(true); - for(int i=0;iwriteSocket(buf[i]); - return sz; -} - -void GSM3MobileClientService::endWrite(bool sync) -{ - flags ^= GSM3MOBILECLIENTSERVICE_WRITING; - theGSM3MobileClientProvider->endWriteSocket(); - if(sync) - waitForAnswer(); -} - -uint8_t GSM3MobileClientService::connected() -{ - if(mySocket==255) - return 0; - return theGSM3MobileClientProvider->getStatusSocketClient(mySocket); -} - -GSM3MobileClientService::operator bool() -{ - return connected()==1; -}; - -int GSM3MobileClientService::available() -{ - int res; - - // Even if not connected, we are looking for available data - - if(flags & GSM3MOBILECLIENTSERVICE_WRITING) - endWrite(true); - - res=theGSM3MobileClientProvider->availableSocket(flags & GSM3MOBILECLIENTSERVICE_CLIENT,mySocket); - if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) - res=waitForAnswer(); - - return res; -} - -int GSM3MobileClientService::read(uint8_t *buf, size_t size) -{ - int i; - uint8_t c; - - for(i=0;ireadSocket(flags & GSM3MOBILECLIENTSERVICE_CLIENT, (char *)(buf), size, mySocket); - - return res; -*/ -} - -int GSM3MobileClientService::read() -{ - if(flags & GSM3MOBILECLIENTSERVICE_WRITING) - endWrite(true); - int c=theGSM3MobileClientProvider->readSocket(); - return c; -} - -int GSM3MobileClientService::peek() -{ - if(flags & GSM3MOBILECLIENTSERVICE_WRITING) - endWrite(true); - return theGSM3MobileClientProvider->peekSocket(/*mySocket, false*/); -} - -void GSM3MobileClientService::flush() -{ - if(flags & GSM3MOBILECLIENTSERVICE_WRITING) - endWrite(true); - theGSM3MobileClientProvider->flushSocket(/*mySocket*/); - if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) - waitForAnswer(); - -} - -void GSM3MobileClientService::stop() -{ - if(flags & GSM3MOBILECLIENTSERVICE_WRITING) - endWrite(true); - theGSM3MobileClientProvider->disconnectTCP(flags & GSM3MOBILECLIENTSERVICE_CLIENT, mySocket); - theGSM3MobileClientProvider->releaseSocket(mySocket); - mySocket = 0; - if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) - waitForAnswer(); -} - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include +#include +#include + +// While there is only a shield (ShieldV1) we will include it by default +#include +GSM3ShieldV1ClientProvider theShieldV1ClientProvider; + + +#define GSM3MOBILECLIENTSERVICE_CLIENT 0x01 // 1: This side is Client. 0: This side is Server +#define GSM3MOBILECLIENTSERVICE_WRITING 0x02 // 1: TRUE 0: FALSE +#define GSM3MOBILECLIENTSERVICE_SYNCH 0x04 // 1: TRUE, compatible with other clients 0: FALSE + +#define __TOUTBEGINWRITE__ 10000 + + +GSM3MobileClientService::GSM3MobileClientService(bool synch) +{ + flags = GSM3MOBILECLIENTSERVICE_CLIENT; + if(synch) + flags |= GSM3MOBILECLIENTSERVICE_SYNCH; + mySocket=255; +} + +GSM3MobileClientService::GSM3MobileClientService(int socket, bool synch) +{ + // We are creating a socket on an existing, occupied one. + flags=0; + if(synch) + flags |= GSM3MOBILECLIENTSERVICE_SYNCH; + mySocket=socket; + theGSM3MobileClientProvider->getSocket(socket); + +} + +// Returns 0 if last command is still executing +// 1 if success +// >1 if error +int GSM3MobileClientService::ready() +{ + return theGSM3MobileClientProvider->ready(); +} + +int GSM3MobileClientService::connect(IPAddress add, uint16_t port) +{ + if(theGSM3MobileClientProvider==0) + return 2; + + // TODO: ask for the socket id + mySocket=theGSM3MobileClientProvider->getSocket(); + + if(mySocket<0) + return 2; + + int res=theGSM3MobileClientProvider->connectTCPClient(add, port, mySocket); + if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) + res=waitForAnswer(); + + return res; +}; + +int GSM3MobileClientService::connect(const char *host, uint16_t port) +{ + + if(theGSM3MobileClientProvider==0) + return 2; + // TODO: ask for the socket id + mySocket=theGSM3MobileClientProvider->getSocket(); + + if(mySocket<0) + return 2; + + int res=theGSM3MobileClientProvider->connectTCPClient(host, port, mySocket); + if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) + res=waitForAnswer(); + + return res; +} + +int GSM3MobileClientService::waitForAnswer() +{ + unsigned long m; + m=millis(); + int res; + + while(((millis()-m)< __TOUTBEGINWRITE__ )&&(ready()==0)) + delay(100); + + res=ready(); + + // If we get something different from a 1, we are having a problem + if(res!=1) + res=0; + + return res; +} + +void GSM3MobileClientService::beginWrite(bool sync) +{ + flags |= GSM3MOBILECLIENTSERVICE_WRITING; + theGSM3MobileClientProvider->beginWriteSocket(flags & GSM3MOBILECLIENTSERVICE_CLIENT, mySocket); + if(sync) + waitForAnswer(); +} + +size_t GSM3MobileClientService::write(uint8_t c) +{ + if(!(flags & GSM3MOBILECLIENTSERVICE_WRITING)) + beginWrite(true); + theGSM3MobileClientProvider->writeSocket(c); + return 1; +} + +size_t GSM3MobileClientService::write(const uint8_t* buf) +{ + if(!(flags & GSM3MOBILECLIENTSERVICE_WRITING)) + beginWrite(true); + theGSM3MobileClientProvider->writeSocket((const char*)(buf)); + return strlen((const char*)buf); +} + +size_t GSM3MobileClientService::write(const uint8_t* buf, size_t sz) +{ + if(!(flags & GSM3MOBILECLIENTSERVICE_WRITING)) + beginWrite(true); + for(int i=0;iwriteSocket(buf[i]); + return sz; +} + +void GSM3MobileClientService::endWrite(bool sync) +{ + flags ^= GSM3MOBILECLIENTSERVICE_WRITING; + theGSM3MobileClientProvider->endWriteSocket(); + if(sync) + waitForAnswer(); +} + +uint8_t GSM3MobileClientService::connected() +{ + if(mySocket==255) + return 0; + return theGSM3MobileClientProvider->getStatusSocketClient(mySocket); +} + +GSM3MobileClientService::operator bool() +{ + return connected()==1; +}; + +int GSM3MobileClientService::available() +{ + int res; + + // Even if not connected, we are looking for available data + + if(flags & GSM3MOBILECLIENTSERVICE_WRITING) + endWrite(true); + + res=theGSM3MobileClientProvider->availableSocket(flags & GSM3MOBILECLIENTSERVICE_CLIENT,mySocket); + if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) + res=waitForAnswer(); + + return res; +} + +int GSM3MobileClientService::read(uint8_t *buf, size_t size) +{ + int i; + uint8_t c; + + for(i=0;ireadSocket(flags & GSM3MOBILECLIENTSERVICE_CLIENT, (char *)(buf), size, mySocket); + + return res; +*/ +} + +int GSM3MobileClientService::read() +{ + if(flags & GSM3MOBILECLIENTSERVICE_WRITING) + endWrite(true); + int c=theGSM3MobileClientProvider->readSocket(); + return c; +} + +int GSM3MobileClientService::peek() +{ + if(flags & GSM3MOBILECLIENTSERVICE_WRITING) + endWrite(true); + return theGSM3MobileClientProvider->peekSocket(/*mySocket, false*/); +} + +void GSM3MobileClientService::flush() +{ + if(flags & GSM3MOBILECLIENTSERVICE_WRITING) + endWrite(true); + theGSM3MobileClientProvider->flushSocket(/*mySocket*/); + if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) + waitForAnswer(); + +} + +void GSM3MobileClientService::stop() +{ + if(flags & GSM3MOBILECLIENTSERVICE_WRITING) + endWrite(true); + theGSM3MobileClientProvider->disconnectTCP(flags & GSM3MOBILECLIENTSERVICE_CLIENT, mySocket); + theGSM3MobileClientProvider->releaseSocket(mySocket); + mySocket = 0; + if(flags & GSM3MOBILECLIENTSERVICE_SYNCH) + waitForAnswer(); +} + diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.h b/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.h index 5a36a975c97..304a5196fc8 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileClientService.h @@ -1,162 +1,162 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef _GSM3MOBILECLIENTSERVICE_ -#define _GSM3MOBILECLIENTSERVICE_ - -#include -#include - - -class GSM3MobileClientService : public Client -{ - private: - - uint8_t mySocket; - uint8_t flags; - - /** Blocks waiting for an answer - @return returns 0 if last command is still executing, 1 success, >1 error - */ - int waitForAnswer(); - - public: - - /** Constructor - @param synch Sync mode - */ - GSM3MobileClientService(bool synch=true); - - /** Constructor - @param socket Socket - @param synch Sync mode - */ - GSM3MobileClientService(int socket, bool synch); - - /** Get last command status - @return returns 0 if last command is still executing, 1 success, >1 error - */ - int ready(); - - // we take this function out as IPAddress is complex to bring to - // version 1. - /** Connect to server by IP address - @param (IPAddress) - @param (uint16_t) - @return returns 0 if last command is still executing, 1 success, 2 if there are no resources - */ - inline int connect(IPAddress, uint16_t); - - /** Connect to server by hostname - @param host Hostname - @param port Port - @return returns 0 if last command is still executing, 1 success, 2 if there are no resources - */ - int connect(const char *host, uint16_t port); - - /** Initialize write in request - @param sync Sync mode - */ - void beginWrite(bool sync=false); - - /** Write a character in request - @param c Character - @return size - */ - size_t write(uint8_t c); - - /** Write a characters buffer in request - @param buf Buffer - @return buffer size - */ - size_t write(const uint8_t *buf); - - /** Write a characters buffer with size in request - @param (uint8_t*) Buffer - @param (size_t) Buffer size - @return buffer size - */ - size_t write(const uint8_t*, size_t); - - /** Finish write request - @param sync Sync mode - */ - void endWrite(bool sync=false); - - /** Check if connected to server - @return 1 if connected - */ - uint8_t connected(); - - operator bool(); - - /** Read from response buffer and copy size specified to buffer - @param buf Buffer - @param size Buffer size - @return bytes read - */ - int read(uint8_t *buf, size_t size); - - /** Read a character from response buffer - @return character - */ - int read(); - - /** Check if exists a response available - @return 1 if exists, 0 if not exists - */ - int available(); - - /** Read a character from response buffer but does not move the pointer. - @return character - */ - int peek(); - - /** Flush response buffer - */ - void flush(); - - /** Stop client - */ - void stop(); - - /** Get socket - @return socket - */ - inline int getSocket(){return (int)mySocket;}; - - -}; - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef _GSM3MOBILECLIENTSERVICE_ +#define _GSM3MOBILECLIENTSERVICE_ + +#include +#include + + +class GSM3MobileClientService : public Client +{ + private: + + uint8_t mySocket; + uint8_t flags; + + /** Blocks waiting for an answer + @return returns 0 if last command is still executing, 1 success, >1 error + */ + int waitForAnswer(); + + public: + + /** Constructor + @param synch Sync mode + */ + GSM3MobileClientService(bool synch=true); + + /** Constructor + @param socket Socket + @param synch Sync mode + */ + GSM3MobileClientService(int socket, bool synch); + + /** Get last command status + @return returns 0 if last command is still executing, 1 success, >1 error + */ + int ready(); + + // we take this function out as IPAddress is complex to bring to + // version 1. + /** Connect to server by IP address + @param (IPAddress) + @param (uint16_t) + @return returns 0 if last command is still executing, 1 success, 2 if there are no resources + */ + inline int connect(IPAddress, uint16_t); + + /** Connect to server by hostname + @param host Hostname + @param port Port + @return returns 0 if last command is still executing, 1 success, 2 if there are no resources + */ + int connect(const char *host, uint16_t port); + + /** Initialize write in request + @param sync Sync mode + */ + void beginWrite(bool sync=false); + + /** Write a character in request + @param c Character + @return size + */ + size_t write(uint8_t c); + + /** Write a characters buffer in request + @param buf Buffer + @return buffer size + */ + size_t write(const uint8_t *buf); + + /** Write a characters buffer with size in request + @param (uint8_t*) Buffer + @param (size_t) Buffer size + @return buffer size + */ + size_t write(const uint8_t*, size_t); + + /** Finish write request + @param sync Sync mode + */ + void endWrite(bool sync=false); + + /** Check if connected to server + @return 1 if connected + */ + uint8_t connected(); + + operator bool(); + + /** Read from response buffer and copy size specified to buffer + @param buf Buffer + @param size Buffer size + @return bytes read + */ + int read(uint8_t *buf, size_t size); + + /** Read a character from response buffer + @return character + */ + int read(); + + /** Check if exists a response available + @return 1 if exists, 0 if not exists + */ + int available(); + + /** Read a character from response buffer but does not move the pointer. + @return character + */ + int peek(); + + /** Flush response buffer + */ + void flush(); + + /** Stop client + */ + void stop(); + + /** Get socket + @return socket + */ + inline int getSocket(){return (int)mySocket;}; + + +}; + + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.cpp b/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.cpp index b39ee26f5a5..673285b5403 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.cpp @@ -1,191 +1,191 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include -#include -#include -#include - - -GSM3MobileMockupProvider::GSM3MobileMockupProvider() -{ - lineStatus=IDLE; - msgExample="Hello#World"; - msgIndex=0; -}; - -int GSM3MobileMockupProvider::begin(char* pin) -{ - Serial.println("GSM3MobileMockupProvider::begin()"); - return 0; -}; - -int GSM3MobileMockupProvider::ready() -{ - Serial.println("GSM3MobileMockupProvider::ready()"); - return 1; -}; - -int GSM3MobileMockupProvider::beginSMS(const char* number) -{ - Serial.println("SM3MobileMockupProvider::beginSMS()"); - return 0; -}; - -void GSM3MobileMockupProvider::writeSMS(char c) -{ - Serial.print(c); -}; - -int GSM3MobileMockupProvider::endSMS() -{ - Serial.println("GSM3MobileMockupProvider::endSMS()"); -}; - -int GSM3MobileMockupProvider::availableSMS() -{ - Serial.println("GSM3MobileMockupProvider::availableSMS()"); - return 120; -}; - -int GSM3MobileMockupProvider::peek() -{ - return (int)'H'; -}; - -int GSM3MobileMockupProvider::remoteSMSNumber(char* number, int nlength) -{ - if(nlength>=13) - strcpy(number, "+34630538546"); - return 12; -}; - - -void GSM3MobileMockupProvider::flushSMS() -{ - Serial.println("GSM3MobileMockupProvider::flushSMS()"); -}; - -int GSM3MobileMockupProvider::readSMS() -{ - if(msgExample[msgIndex]==0) - { - msgIndex=0; - return 0; - } - else - { - msgIndex++; - return msgExample[msgIndex-1]; - }; -}; - -int GSM3MobileMockupProvider::connectTCPClient(const char* server, int port, int id_socket) -{ - Serial.println("GSM3MobileMockupProvider::connectTCPClient()"); - Serial.print(server);Serial.print(":");Serial.print(port);Serial.print("-");Serial.println(id_socket); -} - -void GSM3MobileMockupProvider::writeSocket(const uint8_t *buf, size_t size, int id_socket) -{ - int i; - for(i=0;i=minSocket())&&(socket<=maxSocket())) - return 1; - else - return 0; -}; -*/ - -int GSM3MobileMockupProvider::readSocket(uint8_t *buf, size_t size, int idsocket) -{ - int i; - int l=strlen(msgExample); - for(i=0;(i12)) - strcpy("192.168.1.1", localIP); - return 1; -}; - -bool GSM3MobileMockupProvider::getSocketModemStatus(uint8_t s) -{ - // Feeling lazy - return true; -} - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include +#include +#include +#include + + +GSM3MobileMockupProvider::GSM3MobileMockupProvider() +{ + lineStatus=IDLE; + msgExample="Hello#World"; + msgIndex=0; +}; + +int GSM3MobileMockupProvider::begin(char* pin) +{ + Serial.println("GSM3MobileMockupProvider::begin()"); + return 0; +}; + +int GSM3MobileMockupProvider::ready() +{ + Serial.println("GSM3MobileMockupProvider::ready()"); + return 1; +}; + +int GSM3MobileMockupProvider::beginSMS(const char* number) +{ + Serial.println("SM3MobileMockupProvider::beginSMS()"); + return 0; +}; + +void GSM3MobileMockupProvider::writeSMS(char c) +{ + Serial.print(c); +}; + +int GSM3MobileMockupProvider::endSMS() +{ + Serial.println("GSM3MobileMockupProvider::endSMS()"); +}; + +int GSM3MobileMockupProvider::availableSMS() +{ + Serial.println("GSM3MobileMockupProvider::availableSMS()"); + return 120; +}; + +int GSM3MobileMockupProvider::peek() +{ + return (int)'H'; +}; + +int GSM3MobileMockupProvider::remoteSMSNumber(char* number, int nlength) +{ + if(nlength>=13) + strcpy(number, "+34630538546"); + return 12; +}; + + +void GSM3MobileMockupProvider::flushSMS() +{ + Serial.println("GSM3MobileMockupProvider::flushSMS()"); +}; + +int GSM3MobileMockupProvider::readSMS() +{ + if(msgExample[msgIndex]==0) + { + msgIndex=0; + return 0; + } + else + { + msgIndex++; + return msgExample[msgIndex-1]; + }; +}; + +int GSM3MobileMockupProvider::connectTCPClient(const char* server, int port, int id_socket) +{ + Serial.println("GSM3MobileMockupProvider::connectTCPClient()"); + Serial.print(server);Serial.print(":");Serial.print(port);Serial.print("-");Serial.println(id_socket); +} + +void GSM3MobileMockupProvider::writeSocket(const uint8_t *buf, size_t size, int id_socket) +{ + int i; + for(i=0;i=minSocket())&&(socket<=maxSocket())) + return 1; + else + return 0; +}; +*/ + +int GSM3MobileMockupProvider::readSocket(uint8_t *buf, size_t size, int idsocket) +{ + int i; + int l=strlen(msgExample); + for(i=0;(i12)) + strcpy("192.168.1.1", localIP); + return 1; +}; + +bool GSM3MobileMockupProvider::getSocketModemStatus(uint8_t s) +{ + // Feeling lazy + return true; +} + diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.h b/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.h index 59eee4185d6..fc786d00ce4 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileMockupProvider.h @@ -1,255 +1,255 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef _GSM3MOBILEMOCKUPPROVIDER_ -#define _GSM3MOBILEMOCKUPPROVIDER_ - -#include -#include - -class GSM3MobileMockupProvider: public GSM3MobileNetworkProvider -{ - private: - // Introducing this status is quite "heavy". But something like this should - // be added to ShieldV1. Or not. - // Note, in ShieldV1 there is no "RECEIVINGSMS" status. - enum GSM3_modemlinest_e { IDLE, WAITINGANSWER, SENDINGSMS}; - GSM3_modemlinest_e lineStatus; - char* msgExample; - int msgIndex; - - public: - - /** Minimum socket - @return 1 - */ - inline int minSocket(){return 1;}; - - /** Maximum socket - @return 8 - */ - inline int maxSocket(){return 8;}; - - /** Constructor */ - GSM3MobileMockupProvider(); - - /** Get network status - @return network status - */ - inline GSM3_NetworkStatus_t getStatus(){return ERROR;}; - - /** Get voice call status - @return call status - */ - inline GSM3_voiceCall_st getvoiceCallStatus(){return IDLE_CALL;}; - - /** Get last command status - @return Returns 0 if last command is still executing, 1 success, >1 error - */ - int ready(); - inline void closeCommand(int code){}; - - //Configuration functions. - - /** Begin connection - @param pin PIN code - @return - */ - int begin(char* pin=0); - - /** Check if is modem alive - @return 0 - */ - inline int isModemAlive(){return 0;}; - - /** Shutdown the modem (power off really) - @return true if successful - */ - inline bool shutdown(){return false;}; - - //Call functions - - /** Launch a voice call - @param number Phone number to be called - @return If asynchronous, returns 0. If synchronous, 1 if success, other if error - */ - inline int voiceCall(const char* number){return 0;}; - - /** Answer a voice call - @return If asynchronous, returns 0. If synchronous, 1 if success, other if error - */ - inline int answerCall(){return 0;}; - - /** Hang a voice call - @return If asynchronous, returns 0. If synchronous, 1 if success, other if error - */ - inline int hangCall(){return 0;}; - - /** Retrieve phone number of caller - @param buffer Buffer for copy phone number - @param bufsize Buffer size - @return If asynchronous, returns 0. If synchronous, 1 if success, other if error - */ - inline int retrieveCallingNumber(char* buffer, int*& bufsize){return 0;}; - - // SMS functions - - /** Begin a SMS to send it - @param number Destination - @return error command if it exists - */ - int beginSMS(const char* number); - - /** End SMS - @return error command if it exists - */ - int endSMS(); - - /** Check if SMS available and prepare it to be read - @return error command if it exists - */ - int availableSMS(); - - /** Read a byte but do not advance the buffer header (circular buffer) - @return character - */ - int peek(); - - /** Delete the SMS from Modem memory and proccess answer - */ - void flushSMS(); - - /** Read sender number phone - @param number Buffer for save number phone - @param nlength Buffer length - @return 1 success, >1 error - */ - int remoteSMSNumber(char* number, int nlength); - - /** Read one char for SMS buffer (advance circular buffer) - @return character - */ - int readSMS(); - - /** Write a SMS character by character - @param c Character - */ - void writeSMS(char c); - - // Socket functions - - /** Connect to a remote TCP server - @param server String with IP or server name - @param port Remote port number - @param id_socket Local socket number - @return 0 if command running, 1 if success, otherwise error - */ - int connectTCPClient(const char* server, int port, int id_socket); - - // Attention to parameter rewriting in ShieldV1 - /** Write buffer information into a socket - @param buf Buffer - @param size Buffer size - @param idsocket Socket - */ - void writeSocket(const uint8_t *buf, size_t size, int idsocket); - - // ShieldV1 will have two reading mechanisms: - // Mechanism 1: Call AT+QIRD for size bytes. Put them in the circular buffer, - // fill buf. Take care to xon/xoff effect, as we may copy just a part of the - // incoming bytes. - /** Read socket and put information in a buffer - @param buf Buffer - @param size Buffer size - @param idsocket Socket - @return - */ - int readSocket(uint8_t *buf, size_t size, int idsocket); - - // Mechanism 2 in ShieldV1: - // When called "available()" or "read()" reuse readSocket code to execute - // QIRD SYNCHRONOUSLY. Ask the modem for 1500 bytes but do not copy them anywhere, - // leave data in the circular buffer. Put buffer head at the start of received data. - // Peek() will get a character but will not advance the buffer head. - // Read() will get one character. XON/XOFF will take care of buffer filling - // If Read() gets to the end of the QIRD response, execute again QIRD SYNCHRONOUSLY - // If the user executes flush(), execute read() until there is nothing more to read() - // (the modem gives no way to empty the socket of incoming data) - - /** Check if there are data to be read in socket. - @param idsocket Local socket number - @return 0 if command running, 1 if there are data available, 4 if no data, otherwise error - */ - int availableSocket(int idsocket); - - /** Read data (get a character) available in socket - @param idsocket Socket - @param advance Determines if advance the buffer head - @return character - */ - int readSocket(int idsocket, bool advance=true); - - /** Flush socket - @param idsocket Socket - */ - void flushSocket(int idsocket); - - // This is the same in ShieldV1 - /** Close a socket - @param idsocket Socket - @return 0 if command running, 1 if success, otherwise error - */ - int disconnectTCP(int idsocket); - - // TCP Server. Attention. Changing the int*&. We'll receive a buffer for the IP - // If the pointer ins NULL just forget it - // I think that opening a server does not occupy a socket. Is that true? - /** Establish a TCP connection - @param port Port - @param localIP IP address - @param localIPlength IP address size in characters - @return command error if exists - */ - int connectTCPServer(int port, char* localIP, int* localIPlength); - - // Modem sockets status. Return TRUE if the modem thinks the socket is occupied. - // This should be detected through an unrequisited response - /** Get modem status - @param s Socket - @return modem status (true if connected) - */ - bool getSocketModemStatus(uint8_t s); - - -}; -#endif +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef _GSM3MOBILEMOCKUPPROVIDER_ +#define _GSM3MOBILEMOCKUPPROVIDER_ + +#include +#include + +class GSM3MobileMockupProvider: public GSM3MobileNetworkProvider +{ + private: + // Introducing this status is quite "heavy". But something like this should + // be added to ShieldV1. Or not. + // Note, in ShieldV1 there is no "RECEIVINGSMS" status. + enum GSM3_modemlinest_e { IDLE, WAITINGANSWER, SENDINGSMS}; + GSM3_modemlinest_e lineStatus; + char* msgExample; + int msgIndex; + + public: + + /** Minimum socket + @return 1 + */ + inline int minSocket(){return 1;}; + + /** Maximum socket + @return 8 + */ + inline int maxSocket(){return 8;}; + + /** Constructor */ + GSM3MobileMockupProvider(); + + /** Get network status + @return network status + */ + inline GSM3_NetworkStatus_t getStatus(){return ERROR;}; + + /** Get voice call status + @return call status + */ + inline GSM3_voiceCall_st getvoiceCallStatus(){return IDLE_CALL;}; + + /** Get last command status + @return Returns 0 if last command is still executing, 1 success, >1 error + */ + int ready(); + inline void closeCommand(int code){}; + + //Configuration functions. + + /** Begin connection + @param pin PIN code + @return + */ + int begin(char* pin=0); + + /** Check if is modem alive + @return 0 + */ + inline int isModemAlive(){return 0;}; + + /** Shutdown the modem (power off really) + @return true if successful + */ + inline bool shutdown(){return false;}; + + //Call functions + + /** Launch a voice call + @param number Phone number to be called + @return If asynchronous, returns 0. If synchronous, 1 if success, other if error + */ + inline int voiceCall(const char* number){return 0;}; + + /** Answer a voice call + @return If asynchronous, returns 0. If synchronous, 1 if success, other if error + */ + inline int answerCall(){return 0;}; + + /** Hang a voice call + @return If asynchronous, returns 0. If synchronous, 1 if success, other if error + */ + inline int hangCall(){return 0;}; + + /** Retrieve phone number of caller + @param buffer Buffer for copy phone number + @param bufsize Buffer size + @return If asynchronous, returns 0. If synchronous, 1 if success, other if error + */ + inline int retrieveCallingNumber(char* buffer, int*& bufsize){return 0;}; + + // SMS functions + + /** Begin a SMS to send it + @param number Destination + @return error command if it exists + */ + int beginSMS(const char* number); + + /** End SMS + @return error command if it exists + */ + int endSMS(); + + /** Check if SMS available and prepare it to be read + @return error command if it exists + */ + int availableSMS(); + + /** Read a byte but do not advance the buffer header (circular buffer) + @return character + */ + int peek(); + + /** Delete the SMS from Modem memory and proccess answer + */ + void flushSMS(); + + /** Read sender number phone + @param number Buffer for save number phone + @param nlength Buffer length + @return 1 success, >1 error + */ + int remoteSMSNumber(char* number, int nlength); + + /** Read one char for SMS buffer (advance circular buffer) + @return character + */ + int readSMS(); + + /** Write a SMS character by character + @param c Character + */ + void writeSMS(char c); + + // Socket functions + + /** Connect to a remote TCP server + @param server String with IP or server name + @param port Remote port number + @param id_socket Local socket number + @return 0 if command running, 1 if success, otherwise error + */ + int connectTCPClient(const char* server, int port, int id_socket); + + // Attention to parameter rewriting in ShieldV1 + /** Write buffer information into a socket + @param buf Buffer + @param size Buffer size + @param idsocket Socket + */ + void writeSocket(const uint8_t *buf, size_t size, int idsocket); + + // ShieldV1 will have two reading mechanisms: + // Mechanism 1: Call AT+QIRD for size bytes. Put them in the circular buffer, + // fill buf. Take care to xon/xoff effect, as we may copy just a part of the + // incoming bytes. + /** Read socket and put information in a buffer + @param buf Buffer + @param size Buffer size + @param idsocket Socket + @return + */ + int readSocket(uint8_t *buf, size_t size, int idsocket); + + // Mechanism 2 in ShieldV1: + // When called "available()" or "read()" reuse readSocket code to execute + // QIRD SYNCHRONOUSLY. Ask the modem for 1500 bytes but do not copy them anywhere, + // leave data in the circular buffer. Put buffer head at the start of received data. + // Peek() will get a character but will not advance the buffer head. + // Read() will get one character. XON/XOFF will take care of buffer filling + // If Read() gets to the end of the QIRD response, execute again QIRD SYNCHRONOUSLY + // If the user executes flush(), execute read() until there is nothing more to read() + // (the modem gives no way to empty the socket of incoming data) + + /** Check if there are data to be read in socket. + @param idsocket Local socket number + @return 0 if command running, 1 if there are data available, 4 if no data, otherwise error + */ + int availableSocket(int idsocket); + + /** Read data (get a character) available in socket + @param idsocket Socket + @param advance Determines if advance the buffer head + @return character + */ + int readSocket(int idsocket, bool advance=true); + + /** Flush socket + @param idsocket Socket + */ + void flushSocket(int idsocket); + + // This is the same in ShieldV1 + /** Close a socket + @param idsocket Socket + @return 0 if command running, 1 if success, otherwise error + */ + int disconnectTCP(int idsocket); + + // TCP Server. Attention. Changing the int*&. We'll receive a buffer for the IP + // If the pointer ins NULL just forget it + // I think that opening a server does not occupy a socket. Is that true? + /** Establish a TCP connection + @param port Port + @param localIP IP address + @param localIPlength IP address size in characters + @return command error if exists + */ + int connectTCPServer(int port, char* localIP, int* localIPlength); + + // Modem sockets status. Return TRUE if the modem thinks the socket is occupied. + // This should be detected through an unrequisited response + /** Get modem status + @param s Socket + @return modem status (true if connected) + */ + bool getSocketModemStatus(uint8_t s); + + +}; +#endif diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkProvider.cpp b/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkProvider.cpp index a8a91c21997..324213c1335 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkProvider.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkProvider.cpp @@ -1,72 +1,72 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include -#include - -GSM3MobileNetworkProvider* theProvider; - -GSM3MobileNetworkProvider::GSM3MobileNetworkProvider() -{ - socketsAsServer=0x0000; -}; - - -int GSM3MobileNetworkProvider::getNewOccupiedSocketAsServer() -{ - int i; - for(i=minSocketAsServer(); i<=maxSocketAsServer(); i++) - { - if ((!(socketsAsServer&(0x0001< +#include + +GSM3MobileNetworkProvider* theProvider; + +GSM3MobileNetworkProvider::GSM3MobileNetworkProvider() +{ + socketsAsServer=0x0000; +}; + + +int GSM3MobileNetworkProvider::getNewOccupiedSocketAsServer() +{ + int i; + for(i=minSocketAsServer(); i<=maxSocketAsServer(); i++) + { + if ((!(socketsAsServer&(0x0001< -#include -#include -#include - -class GSM3MobileNetworkProvider -{ - private: - - /** Restart hardware - @return 1 if successful - */ - int HWrestart(); - - uint16_t socketsAsServer; // Server socket - - /** Get modem status - @param s Socket - @return modem status (true if connected) - */ - virtual inline bool getSocketAsServerModemStatus(int s){return false;}; - - public: - - /** minSocketAsServer - @return 0 - */ - virtual inline int minSocketAsServer(){return 0;}; - - /** maxSocketAsServer - @return 0 - */ - virtual inline int maxSocketAsServer(){return 0;}; - - /** Get last command status - @return returns 0 if last command is still executing, 1 success, >1 error - */ - virtual int ready()=0; - - /** Constructor */ - GSM3MobileNetworkProvider(); - - /** Get network status - @return network status - */ - virtual inline GSM3_NetworkStatus_t getStatus(){return ERROR;}; - - /** Get socket client status - @param socket Socket - @return 1 if connected, 0 otherwise - */ - bool getStatusSocketClient(uint8_t socket); - - /** Close a AT command - @param code Close code - */ - virtual inline void closeCommand(int code){}; - - /** Establish a TCP connection - @param port Port - @param localIP IP address - @param localIPlength IP address size in characters - @return command error if exists - */ - virtual inline int connectTCPServer(int port, char* localIP, int localIPlength){return 0;}; - - /** Get local IP address - @param LocalIP Buffer for save IP address - @param LocalIPlength Buffer size - */ - virtual inline int getIP(char* LocalIP, int LocalIPlength){return 0;}; - - /** Get new occupied socket - @return -1 if no new socket has been occupied - */ - int getNewOccupiedSocketAsServer(); - - /** Get socket status as server - @param socket Socket to get status - @return socket status - */ - bool getStatusSocketAsServer(uint8_t socket); - - /** Close a socket - @param client1Server0 1 if modem acts as client, 0 if acts as server - @param id_socket Local socket number - @return 0 if command running, 1 if success, otherwise error - */ - int disconnectTCP(bool client1Server0, int idsocket){return 1;}; - - /** Release socket - @param socket Socket - */ - void releaseSocket(int socket){}; - -}; - -extern GSM3MobileNetworkProvider* theProvider; - -#endif +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef _GSM3MOBILENETWORKPROVIDER_ +#define _GSM3MOBILENETWORKPROVIDER_ + +#include +#include +#include +#include + +class GSM3MobileNetworkProvider +{ + private: + + /** Restart hardware + @return 1 if successful + */ + int HWrestart(); + + uint16_t socketsAsServer; // Server socket + + /** Get modem status + @param s Socket + @return modem status (true if connected) + */ + virtual inline bool getSocketAsServerModemStatus(int s){return false;}; + + public: + + /** minSocketAsServer + @return 0 + */ + virtual inline int minSocketAsServer(){return 0;}; + + /** maxSocketAsServer + @return 0 + */ + virtual inline int maxSocketAsServer(){return 0;}; + + /** Get last command status + @return returns 0 if last command is still executing, 1 success, >1 error + */ + virtual int ready()=0; + + /** Constructor */ + GSM3MobileNetworkProvider(); + + /** Get network status + @return network status + */ + virtual inline GSM3_NetworkStatus_t getStatus(){return ERROR;}; + + /** Get socket client status + @param socket Socket + @return 1 if connected, 0 otherwise + */ + bool getStatusSocketClient(uint8_t socket); + + /** Close a AT command + @param code Close code + */ + virtual inline void closeCommand(int code){}; + + /** Establish a TCP connection + @param port Port + @param localIP IP address + @param localIPlength IP address size in characters + @return command error if exists + */ + virtual inline int connectTCPServer(int port, char* localIP, int localIPlength){return 0;}; + + /** Get local IP address + @param LocalIP Buffer for save IP address + @param LocalIPlength Buffer size + */ + virtual inline int getIP(char* LocalIP, int LocalIPlength){return 0;}; + + /** Get new occupied socket + @return -1 if no new socket has been occupied + */ + int getNewOccupiedSocketAsServer(); + + /** Get socket status as server + @param socket Socket to get status + @return socket status + */ + bool getStatusSocketAsServer(uint8_t socket); + + /** Close a socket + @param client1Server0 1 if modem acts as client, 0 if acts as server + @param id_socket Local socket number + @return 0 if command running, 1 if success, otherwise error + */ + int disconnectTCP(bool client1Server0, int idsocket){return 1;}; + + /** Release socket + @param socket Socket + */ + void releaseSocket(int socket){}; + +}; + +extern GSM3MobileNetworkProvider* theProvider; + +#endif diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.cpp b/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.cpp index 5e22f3af81f..1ef6d8a5e26 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.cpp @@ -1,51 +1,51 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include - -GSM3MobileNetworkRegistry::GSM3MobileNetworkRegistry() -{ - theProvider=0; -}; - -void GSM3MobileNetworkRegistry::registerMobileNetworkProvider(GSM3MobileNetworkProvider* provider) -{ - theProvider=provider; -} - -GSM3MobileNetworkProvider* GSM3MobileNetworkRegistry::getMobileNetworkProvider() -{ - return theProvider; -} - -GSM3MobileNetworkRegistry theMobileNetworkRegistry; +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include + +GSM3MobileNetworkRegistry::GSM3MobileNetworkRegistry() +{ + theProvider=0; +}; + +void GSM3MobileNetworkRegistry::registerMobileNetworkProvider(GSM3MobileNetworkProvider* provider) +{ + theProvider=provider; +} + +GSM3MobileNetworkProvider* GSM3MobileNetworkRegistry::getMobileNetworkProvider() +{ + return theProvider; +} + +GSM3MobileNetworkRegistry theMobileNetworkRegistry; diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.h b/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.h index de4397725f2..77a7563e7ac 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileNetworkRegistry.h @@ -1,63 +1,63 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef _GSM3MOBILENETWORKREGISTRY_ -#define _GSM3MOBILENETWORKREGISTRY_ -#include - -class GSM3MobileNetworkRegistry -{ - private: - - GSM3MobileNetworkProvider* theProvider; // Network provider - - public: - - /** Constructor */ - GSM3MobileNetworkRegistry(); - - /** Register in mobile network provider - @param provider Provider - */ - void registerMobileNetworkProvider(GSM3MobileNetworkProvider* provider); - - /** Returns network provider object pointer - @return mobile network provider - */ - GSM3MobileNetworkProvider* getMobileNetworkProvider(); - -}; - -extern GSM3MobileNetworkRegistry theMobileNetworkRegistry; - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef _GSM3MOBILENETWORKREGISTRY_ +#define _GSM3MOBILENETWORKREGISTRY_ +#include + +class GSM3MobileNetworkRegistry +{ + private: + + GSM3MobileNetworkProvider* theProvider; // Network provider + + public: + + /** Constructor */ + GSM3MobileNetworkRegistry(); + + /** Register in mobile network provider + @param provider Provider + */ + void registerMobileNetworkProvider(GSM3MobileNetworkProvider* provider); + + /** Returns network provider object pointer + @return mobile network provider + */ + GSM3MobileNetworkProvider* getMobileNetworkProvider(); + +}; + +extern GSM3MobileNetworkRegistry theMobileNetworkRegistry; + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.cpp b/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.cpp index bf76cfcbb63..2baca209097 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.cpp @@ -1,159 +1,159 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include -#include -#include - - -#define __TOUTSERVER__ 10000 -#define BUFFERSIZETWEET 100 - -#define GSM3MOBILESERVERSERVICE_SYNCH 0x01 // 1: TRUE, compatible with other clients 0: FALSE - -// While there is only a shield (ShieldV1) we will include it by default -#include -GSM3ShieldV1ServerProvider theShieldV1ServerProvider; - - -GSM3MobileServerService::GSM3MobileServerService(uint8_t port, bool synch) -{ - mySocket=0; - _port=port; - flags = 0; - - // If synchronous - if(synch) - flags |= GSM3MOBILESERVERSERVICE_SYNCH; -} - -// Returns 0 if last command is still executing -// 1 if success -// >1 if error -int GSM3MobileServerService::ready() -{ - return theGSM3MobileServerProvider->ready(); -} - -void GSM3MobileServerService::begin() -{ - if(theGSM3MobileServerProvider==0) - return; - theGSM3MobileServerProvider->connectTCPServer(_port); - - if(flags & GSM3MOBILESERVERSERVICE_SYNCH) - waitForAnswer(); -} - -GSM3MobileClientService GSM3MobileServerService::available(bool synch) -{ - int newSocket; - // In case we are debugging, we'll need to force a look at the buffer - ready(); - - newSocket=theGSM3MobileServerProvider->getNewOccupiedSocketAsServer(); - - // Instatiate new client. If we are synch, the client is synchronous/blocking - GSM3MobileClientService client((uint8_t)(newSocket), (flags & GSM3MOBILESERVERSERVICE_SYNCH)); - - return client; -} - -size_t GSM3MobileServerService::write(uint8_t c) -{ -// Adapt to the new, lean implementation -// theGSM3MobileServerProvider->writeSocket(c); - return 1; -} - -void GSM3MobileServerService::beginWrite() -{ -// Adapt to the new, lean implementation -// theGSM3MobileServerProvider->beginWriteSocket(local1Remote0, mySocket); -} - -size_t GSM3MobileServerService::write(const uint8_t* buf) -{ -// Adapt to the new, lean implementation -// theGSM3MobileServerProvider->writeSocket((const char*)(buf)); - return strlen((const char*)buf); -} - -size_t GSM3MobileServerService::write(const uint8_t* buf, size_t sz) -{ -// Adapt to the new, lean implementation -// theGSM3MobileServerProvider->writeSocket((const char*)(buf)); -} - -void GSM3MobileServerService::endWrite() -{ -// Adapt to the new, lean implementation -// theGSM3MobileServerProvider->endWriteSocket(); -} - -void GSM3MobileServerService::stop() -{ - - // Review, should be the server? - theGSM3MobileClientProvider->disconnectTCP(local1Remote0, mySocket); - if(flags & GSM3MOBILESERVERSERVICE_SYNCH) - waitForAnswer(); - theGSM3MobileClientProvider->releaseSocket(mySocket); - mySocket = -1; -} - - -/*int GSM3MobileServerService::getIP(char* LocalIP, int LocalIPlength) -{ - return theGSM3MobileServerProvider->getIP(LocalIP, LocalIPlength); -}*/ - -int GSM3MobileServerService::waitForAnswer() -{ - unsigned long m; - m=millis(); - int res; - - while(((millis()-m)< __TOUTSERVER__ )&&(ready()==0)) - delay(10); - - res=ready(); - - // If we get something different from a 1, we are having a problem - if(res!=1) - res=0; - - return res; -} - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include +#include +#include + + +#define __TOUTSERVER__ 10000 +#define BUFFERSIZETWEET 100 + +#define GSM3MOBILESERVERSERVICE_SYNCH 0x01 // 1: TRUE, compatible with other clients 0: FALSE + +// While there is only a shield (ShieldV1) we will include it by default +#include +GSM3ShieldV1ServerProvider theShieldV1ServerProvider; + + +GSM3MobileServerService::GSM3MobileServerService(uint8_t port, bool synch) +{ + mySocket=0; + _port=port; + flags = 0; + + // If synchronous + if(synch) + flags |= GSM3MOBILESERVERSERVICE_SYNCH; +} + +// Returns 0 if last command is still executing +// 1 if success +// >1 if error +int GSM3MobileServerService::ready() +{ + return theGSM3MobileServerProvider->ready(); +} + +void GSM3MobileServerService::begin() +{ + if(theGSM3MobileServerProvider==0) + return; + theGSM3MobileServerProvider->connectTCPServer(_port); + + if(flags & GSM3MOBILESERVERSERVICE_SYNCH) + waitForAnswer(); +} + +GSM3MobileClientService GSM3MobileServerService::available(bool synch) +{ + int newSocket; + // In case we are debugging, we'll need to force a look at the buffer + ready(); + + newSocket=theGSM3MobileServerProvider->getNewOccupiedSocketAsServer(); + + // Instatiate new client. If we are synch, the client is synchronous/blocking + GSM3MobileClientService client((uint8_t)(newSocket), (flags & GSM3MOBILESERVERSERVICE_SYNCH)); + + return client; +} + +size_t GSM3MobileServerService::write(uint8_t c) +{ +// Adapt to the new, lean implementation +// theGSM3MobileServerProvider->writeSocket(c); + return 1; +} + +void GSM3MobileServerService::beginWrite() +{ +// Adapt to the new, lean implementation +// theGSM3MobileServerProvider->beginWriteSocket(local1Remote0, mySocket); +} + +size_t GSM3MobileServerService::write(const uint8_t* buf) +{ +// Adapt to the new, lean implementation +// theGSM3MobileServerProvider->writeSocket((const char*)(buf)); + return strlen((const char*)buf); +} + +size_t GSM3MobileServerService::write(const uint8_t* buf, size_t sz) +{ +// Adapt to the new, lean implementation +// theGSM3MobileServerProvider->writeSocket((const char*)(buf)); +} + +void GSM3MobileServerService::endWrite() +{ +// Adapt to the new, lean implementation +// theGSM3MobileServerProvider->endWriteSocket(); +} + +void GSM3MobileServerService::stop() +{ + + // Review, should be the server? + theGSM3MobileClientProvider->disconnectTCP(local1Remote0, mySocket); + if(flags & GSM3MOBILESERVERSERVICE_SYNCH) + waitForAnswer(); + theGSM3MobileClientProvider->releaseSocket(mySocket); + mySocket = -1; +} + + +/*int GSM3MobileServerService::getIP(char* LocalIP, int LocalIPlength) +{ + return theGSM3MobileServerProvider->getIP(LocalIP, LocalIPlength); +}*/ + +int GSM3MobileServerService::waitForAnswer() +{ + unsigned long m; + m=millis(); + int res; + + while(((millis()-m)< __TOUTSERVER__ )&&(ready()==0)) + delay(10); + + res=ready(); + + // If we get something different from a 1, we are having a problem + if(res!=1) + res=0; + + return res; +} + + diff --git a/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.h b/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.h index 12165eed1b1..2d25e38ca83 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3MobileServerService.h @@ -1,124 +1,124 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef _GSM3MOBILESERVERSERVICE_ -#define _GSM3MOBILESERVERSERVICE_ - -#include -#include -#include - -class GSM3MobileServerService : public Server -{ - private: - - uint8_t _port; // Port - uint8_t mySocket; // Actual socket - uint8_t flags; - bool local1Remote0; - - /** Internal utility, used in synchronous calls - @return operation result, 1 if success, 0 otherwise - */ - int waitForAnswer(); - - public: - - /** Constructor - @param port Port - @param synch True if the server acts synchronously - */ - GSM3MobileServerService(uint8_t port, bool synch=true); - - /** Get last command status - @return returns 0 if last command is still executing, 1 success, >1 error - */ - int ready(); - - /** Initialize server - */ - void begin(); - - /** Check if there is an incoming client request - @param synch If true, the returned client is synchronous or - blocking. - @return Client if successful, else error - */ - GSM3MobileClientService available(bool synch=true); - - // Just to keep in line with Ethernet. - // Write to every open socket... - //void write(uint8_t); - //void write(const uint8_t *buf, size_t size); - - /** Begin write in socket - */ - void beginWrite(); - - /** Write character in socket - @param c Character - @return size - */ - size_t write(uint8_t c); - - /** Write buffer in socket - @param buf Buffer - @return size - */ - size_t write(const uint8_t *buf); - - /** Write buffer in socket with size - @param buf Buffer - @param sz Buffer size - @return size - */ - size_t write(const uint8_t *buf, size_t sz); - - /** End write in socket - */ - void endWrite(); - - /** Stop server - */ - void stop(); - - // we take this function out as IPAddress is complex to bring to - // version 1. - // inline int connect(IPAddress ip, uint16_t port){return 0;}; - // Returns 2 if there are no resources - //int getIP(char* LocalIP, int LocalIPlength); - -}; - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef _GSM3MOBILESERVERSERVICE_ +#define _GSM3MOBILESERVERSERVICE_ + +#include +#include +#include + +class GSM3MobileServerService : public Server +{ + private: + + uint8_t _port; // Port + uint8_t mySocket; // Actual socket + uint8_t flags; + bool local1Remote0; + + /** Internal utility, used in synchronous calls + @return operation result, 1 if success, 0 otherwise + */ + int waitForAnswer(); + + public: + + /** Constructor + @param port Port + @param synch True if the server acts synchronously + */ + GSM3MobileServerService(uint8_t port, bool synch=true); + + /** Get last command status + @return returns 0 if last command is still executing, 1 success, >1 error + */ + int ready(); + + /** Initialize server + */ + void begin(); + + /** Check if there is an incoming client request + @param synch If true, the returned client is synchronous or + blocking. + @return Client if successful, else error + */ + GSM3MobileClientService available(bool synch=true); + + // Just to keep in line with Ethernet. + // Write to every open socket... + //void write(uint8_t); + //void write(const uint8_t *buf, size_t size); + + /** Begin write in socket + */ + void beginWrite(); + + /** Write character in socket + @param c Character + @return size + */ + size_t write(uint8_t c); + + /** Write buffer in socket + @param buf Buffer + @return size + */ + size_t write(const uint8_t *buf); + + /** Write buffer in socket with size + @param buf Buffer + @param sz Buffer size + @return size + */ + size_t write(const uint8_t *buf, size_t sz); + + /** End write in socket + */ + void endWrite(); + + /** Stop server + */ + void stop(); + + // we take this function out as IPAddress is complex to bring to + // version 1. + // inline int connect(IPAddress ip, uint16_t port){return 0;}; + // Returns 2 if there are no resources + //int getIP(char* LocalIP, int LocalIPlength); + +}; + + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/GSM/GSM3SMSService.cpp b/hardware/arduino/avr/libraries/GSM/GSM3SMSService.cpp index 378dc2cc826..96f53f8703e 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3SMSService.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3SMSService.cpp @@ -1,126 +1,126 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include -#include -#include - -// While there is only a shield (ShieldV1) we will include it by default -#include -GSM3ShieldV1SMSProvider theShieldV1SMSProvider; - -#define GSM3SMSSERVICE_SYNCH 0x01 // 1: synchronous 0: asynchronous -#define __TOUT__ 10000 - - -GSM3SMSService::GSM3SMSService(bool synch) -{ - if(synch) - flags |= GSM3SMSSERVICE_SYNCH; -} - -// Returns 0 if last command is still executing -// 1 if success -// >1 if error -int GSM3SMSService::ready() -{ - return theGSM3SMSProvider->ready(); -} - -int GSM3SMSService::beginSMS(const char *number) -{ - return waitForAnswerIfNeeded(theGSM3SMSProvider->beginSMS(number)); -}; - -int GSM3SMSService::endSMS() -{ - return waitForAnswerIfNeeded(theGSM3SMSProvider->endSMS()); -}; - -size_t GSM3SMSService::write(uint8_t c) -{ - theGSM3SMSProvider->writeSMS(c); - return 1; -} - -void GSM3SMSService::flush() -{ - theGSM3SMSProvider->flushSMS(); - waitForAnswerIfNeeded(1); -}; - -int GSM3SMSService::available() -{ - return waitForAnswerIfNeeded(theGSM3SMSProvider->availableSMS()); -}; - -int GSM3SMSService::remoteNumber(char* number, int nlength) -{ - return theGSM3SMSProvider->remoteSMSNumber(number, nlength); - -} - -int GSM3SMSService::read() -{ - return theGSM3SMSProvider->readSMS(); -}; -int GSM3SMSService::peek() -{ - return theGSM3SMSProvider->peekSMS(); -}; - -int GSM3SMSService::waitForAnswerIfNeeded(int returnvalue) -{ - // If synchronous - if(flags & GSM3SMSSERVICE_SYNCH ) - { - unsigned long m; - m=millis(); - // Wait for __TOUT__ - while(((millis()-m)< __TOUT__ )&&(ready()==0)) - delay(100); - // If everything was OK, return 1 - // else (timeout or error codes) return 0; - if(ready()==1) - return 1; - else - return 0; - } - // If not synchronous just kick ahead the coming result - return ready(); -} - - - - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include +#include +#include + +// While there is only a shield (ShieldV1) we will include it by default +#include +GSM3ShieldV1SMSProvider theShieldV1SMSProvider; + +#define GSM3SMSSERVICE_SYNCH 0x01 // 1: synchronous 0: asynchronous +#define __TOUT__ 10000 + + +GSM3SMSService::GSM3SMSService(bool synch) +{ + if(synch) + flags |= GSM3SMSSERVICE_SYNCH; +} + +// Returns 0 if last command is still executing +// 1 if success +// >1 if error +int GSM3SMSService::ready() +{ + return theGSM3SMSProvider->ready(); +} + +int GSM3SMSService::beginSMS(const char *number) +{ + return waitForAnswerIfNeeded(theGSM3SMSProvider->beginSMS(number)); +}; + +int GSM3SMSService::endSMS() +{ + return waitForAnswerIfNeeded(theGSM3SMSProvider->endSMS()); +}; + +size_t GSM3SMSService::write(uint8_t c) +{ + theGSM3SMSProvider->writeSMS(c); + return 1; +} + +void GSM3SMSService::flush() +{ + theGSM3SMSProvider->flushSMS(); + waitForAnswerIfNeeded(1); +}; + +int GSM3SMSService::available() +{ + return waitForAnswerIfNeeded(theGSM3SMSProvider->availableSMS()); +}; + +int GSM3SMSService::remoteNumber(char* number, int nlength) +{ + return theGSM3SMSProvider->remoteSMSNumber(number, nlength); + +} + +int GSM3SMSService::read() +{ + return theGSM3SMSProvider->readSMS(); +}; +int GSM3SMSService::peek() +{ + return theGSM3SMSProvider->peekSMS(); +}; + +int GSM3SMSService::waitForAnswerIfNeeded(int returnvalue) +{ + // If synchronous + if(flags & GSM3SMSSERVICE_SYNCH ) + { + unsigned long m; + m=millis(); + // Wait for __TOUT__ + while(((millis()-m)< __TOUT__ )&&(ready()==0)) + delay(100); + // If everything was OK, return 1 + // else (timeout or error codes) return 0; + if(ready()==1) + return 1; + else + return 0; + } + // If not synchronous just kick ahead the coming result + return ready(); +} + + + + + diff --git a/hardware/arduino/avr/libraries/GSM/GSM3SMSService.h b/hardware/arduino/avr/libraries/GSM/GSM3SMSService.h index 878be114b25..8cb610401f4 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3SMSService.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3SMSService.h @@ -1,110 +1,110 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef _GSM3SMSSERVICE_ -#define _GSM3SMSSERVICE_ - -#include -#include - -class GSM3SMSService : public Stream -{ - private: - - uint8_t flags; - - /** Makes synchronous the functions, if needed - @param returnvalue Return value - @return returns 0 if last command is still executing, 1 success, >1 error - */ - int waitForAnswerIfNeeded(int returnvalue); - - public: - - /** Constructor - @param synch Determines sync mode - */ - GSM3SMSService(bool synch=true); - - /** Write a character in SMS message - @param c Character - @return size - */ - size_t write(uint8_t c); - - /** Begin a SMS to send it - @param to Destination - @return error command if it exists - */ - int beginSMS(const char* to); - - /** Get last command status - @return returns 0 if last command is still executing, 1 success, >1 error - */ - int ready(); - - /** End SMS - @return error command if it exists - */ - int endSMS(); - - /** Check if SMS available and prepare it to be read - @return number of bytes in a received SMS - */ - int available(); - - /** Read sender number phone - @param number Buffer for save number phone - @param nlength Buffer length - @return 1 success, >1 error - */ - int remoteNumber(char* number, int nlength); - - /** Read one char for SMS buffer (advance circular buffer) - @return byte - */ - int read(); - - /** Read a byte but do not advance the buffer header (circular buffer) - @return byte - */ - int peek(); - - /** Delete the SMS from Modem memory and proccess answer - */ - void flush(); - -}; - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef _GSM3SMSSERVICE_ +#define _GSM3SMSSERVICE_ + +#include +#include + +class GSM3SMSService : public Stream +{ + private: + + uint8_t flags; + + /** Makes synchronous the functions, if needed + @param returnvalue Return value + @return returns 0 if last command is still executing, 1 success, >1 error + */ + int waitForAnswerIfNeeded(int returnvalue); + + public: + + /** Constructor + @param synch Determines sync mode + */ + GSM3SMSService(bool synch=true); + + /** Write a character in SMS message + @param c Character + @return size + */ + size_t write(uint8_t c); + + /** Begin a SMS to send it + @param to Destination + @return error command if it exists + */ + int beginSMS(const char* to); + + /** Get last command status + @return returns 0 if last command is still executing, 1 success, >1 error + */ + int ready(); + + /** End SMS + @return error command if it exists + */ + int endSMS(); + + /** Check if SMS available and prepare it to be read + @return number of bytes in a received SMS + */ + int available(); + + /** Read sender number phone + @param number Buffer for save number phone + @param nlength Buffer length + @return 1 success, >1 error + */ + int remoteNumber(char* number, int nlength); + + /** Read one char for SMS buffer (advance circular buffer) + @return byte + */ + int read(); + + /** Read a byte but do not advance the buffer header (circular buffer) + @return byte + */ + int peek(); + + /** Delete the SMS from Modem memory and proccess answer + */ + void flush(); + +}; + + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.cpp b/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.cpp index d59487406c7..a36cf1d9c7f 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.cpp @@ -1,96 +1,96 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include -#include -#include - -#define __RESETPIN__ 7 -#define __TOUTLOCALCOMS__ 500 -#define __TOUTSHUTDOWN__ 5000 -#define __TOUTMODEMCONFIGURATION__ 5000//equivalent to 30000 because of time in interrupt routine. -#define __TOUTAT__ 1000 -#define __TOUTSMS__ 7000 -#define __TOUTCALL__ 15000 -#define __TOUTGPRS__ 10000 -#define __NCLIENTS_MAX__ 3 - -//Constructor. -GSM3ShieldV1::GSM3ShieldV1(bool db) -{ - theGSM3ShieldV1ModemCore.setCommandCounter(1); - socketsAccepted=0; - theGSM3ShieldV1ModemCore.registerUMProvider(this); - theProvider=this; -} - -//Response management. -void GSM3ShieldV1::manageResponse(byte from, byte to) -{ - switch(theGSM3ShieldV1ModemCore.getOngoingCommand()) - { - case NONE: - theGSM3ShieldV1ModemCore.gss.cb.deleteToTheEnd(from); - break; - - } -} - -//Function for 2 sec delay inside an interruption. -void GSM3ShieldV1::delayInsideInterrupt2seg() -{ - for (int k=0;k<40;k++) theGSM3ShieldV1ModemCore.gss.tunedDelay(50000); -} - -///////////////////////////////////////////////////////UNSOLICITED RESULT CODE (URC) FUNCTIONS/////////////////////////////////////////////////////////////////// - -//URC recognize. -bool GSM3ShieldV1::recognizeUnsolicitedEvent(byte oldTail) -{ - -int nlength; -char auxLocate [15]; - //POWER DOWN. - prepareAuxLocate(PSTR("POWER DOWN"), auxLocate); - if(theGSM3ShieldV1ModemCore.gss.cb.locate(auxLocate)) - { - theGSM3ShieldV1ModemCore.gss.cb.flush(); - return true; - } - - - return false; -} - - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include +#include +#include + +#define __RESETPIN__ 7 +#define __TOUTLOCALCOMS__ 500 +#define __TOUTSHUTDOWN__ 5000 +#define __TOUTMODEMCONFIGURATION__ 5000//equivalent to 30000 because of time in interrupt routine. +#define __TOUTAT__ 1000 +#define __TOUTSMS__ 7000 +#define __TOUTCALL__ 15000 +#define __TOUTGPRS__ 10000 +#define __NCLIENTS_MAX__ 3 + +//Constructor. +GSM3ShieldV1::GSM3ShieldV1(bool db) +{ + theGSM3ShieldV1ModemCore.setCommandCounter(1); + socketsAccepted=0; + theGSM3ShieldV1ModemCore.registerUMProvider(this); + theProvider=this; +} + +//Response management. +void GSM3ShieldV1::manageResponse(byte from, byte to) +{ + switch(theGSM3ShieldV1ModemCore.getOngoingCommand()) + { + case NONE: + theGSM3ShieldV1ModemCore.gss.cb.deleteToTheEnd(from); + break; + + } +} + +//Function for 2 sec delay inside an interruption. +void GSM3ShieldV1::delayInsideInterrupt2seg() +{ + for (int k=0;k<40;k++) theGSM3ShieldV1ModemCore.gss.tunedDelay(50000); +} + +///////////////////////////////////////////////////////UNSOLICITED RESULT CODE (URC) FUNCTIONS/////////////////////////////////////////////////////////////////// + +//URC recognize. +bool GSM3ShieldV1::recognizeUnsolicitedEvent(byte oldTail) +{ + +int nlength; +char auxLocate [15]; + //POWER DOWN. + prepareAuxLocate(PSTR("POWER DOWN"), auxLocate); + if(theGSM3ShieldV1ModemCore.gss.cb.locate(auxLocate)) + { + theGSM3ShieldV1ModemCore.gss.cb.flush(); + return true; + } + + + return false; +} + + + diff --git a/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.h b/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.h index db52f7b0e0a..78617d07679 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3ShieldV1.h @@ -1,137 +1,137 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef __GSM3_SHIELDV1__ -#define __GSM3_SHIELDV1__ - -#include -#include -#include -#include - - -class GSM3ShieldV1 : public GSM3MobileNetworkProvider, public GSM3ShieldV1BaseProvider -{ - // General code, for modem management - private: - - /** Delay inside an interrupt (2 seconds) - */ - void delayInsideInterrupt2seg(); - - // Code for SMS Service - private: - - - long commandMillis; - bool commandSent; - - const char* pinConfig; //PIN. - char* accessPoint; //APN. - char* userName; //User. - char* passw; //Password. - const char* remoteID; //Server. - - char* dataSocket; //Data socket. - int local_Port; //Local Port. - char* local_IP; //Local IP. - int local_IP_Length; //Local IP length. - - - int socketDataSize; //Size of socket data to be read. - int socketDataSizeWritten; //Number of socket data written in buffer not to overflow the buffer - - int socketsAccepted; //Status for remote clients accepted of closed. - - public: - - /** Constructor **/ - GSM3ShieldV1(bool debug=false); - - /** Manages modem response - @param from Initial byte of buffer - @param to Final byte of buffer - */ - void manageResponse(byte from, byte to); - - /** Get last command status - @return returns 0 if last command is still executing, 1 success, >1 error - */ - int ready(){return GSM3ShieldV1BaseProvider::ready();}; - - /** Parse modem response - @param rsp Returns true if expected response exists - @param string1 Substring expected in response - @param string2 Second substring expected in response - @return true if parsed successful - */ - bool genericParse_rsp2(bool& rsp, char* string1, char* string2); - - /** Recognize URC - @param oldTail - @return true if successful - */ - bool recognizeUnsolicitedEvent(byte oldTail); - - /** Receive answer - @return true if successful - */ - bool answerReceived(); - - /** Receive socket - @param id_socket Socket ID - @return true if successful - */ - bool socketReceived(int id_socket); - - /** Update active ID sockets - @param active Active sockets - @param ID Id for update - */ - void update_activeIDsockets (bool active, int ID); - - /** Assign ID to socket - @param ID Id to assign to socket - @return true if successful - */ - bool assignIDsocket (int& ID); - - /** Close data socket - @return true if successful - */ - bool closedDataSocket(); //Flag closed current data socket. - - //bool writeIncomingCalls(char* bufferForCallerId) If isn't zero, doesn't wait calls -}; - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef __GSM3_SHIELDV1__ +#define __GSM3_SHIELDV1__ + +#include +#include +#include +#include + + +class GSM3ShieldV1 : public GSM3MobileNetworkProvider, public GSM3ShieldV1BaseProvider +{ + // General code, for modem management + private: + + /** Delay inside an interrupt (2 seconds) + */ + void delayInsideInterrupt2seg(); + + // Code for SMS Service + private: + + + long commandMillis; + bool commandSent; + + const char* pinConfig; //PIN. + char* accessPoint; //APN. + char* userName; //User. + char* passw; //Password. + const char* remoteID; //Server. + + char* dataSocket; //Data socket. + int local_Port; //Local Port. + char* local_IP; //Local IP. + int local_IP_Length; //Local IP length. + + + int socketDataSize; //Size of socket data to be read. + int socketDataSizeWritten; //Number of socket data written in buffer not to overflow the buffer + + int socketsAccepted; //Status for remote clients accepted of closed. + + public: + + /** Constructor **/ + GSM3ShieldV1(bool debug=false); + + /** Manages modem response + @param from Initial byte of buffer + @param to Final byte of buffer + */ + void manageResponse(byte from, byte to); + + /** Get last command status + @return returns 0 if last command is still executing, 1 success, >1 error + */ + int ready(){return GSM3ShieldV1BaseProvider::ready();}; + + /** Parse modem response + @param rsp Returns true if expected response exists + @param string1 Substring expected in response + @param string2 Second substring expected in response + @return true if parsed successful + */ + bool genericParse_rsp2(bool& rsp, char* string1, char* string2); + + /** Recognize URC + @param oldTail + @return true if successful + */ + bool recognizeUnsolicitedEvent(byte oldTail); + + /** Receive answer + @return true if successful + */ + bool answerReceived(); + + /** Receive socket + @param id_socket Socket ID + @return true if successful + */ + bool socketReceived(int id_socket); + + /** Update active ID sockets + @param active Active sockets + @param ID Id for update + */ + void update_activeIDsockets (bool active, int ID); + + /** Assign ID to socket + @param ID Id to assign to socket + @return true if successful + */ + bool assignIDsocket (int& ID); + + /** Close data socket + @return true if successful + */ + bool closedDataSocket(); //Flag closed current data socket. + + //bool writeIncomingCalls(char* bufferForCallerId) If isn't zero, doesn't wait calls +}; + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.cpp b/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.cpp index 176e8cb2d50..c0f29eb3788 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.cpp @@ -1,537 +1,537 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include "GSM3SoftSerial.h" -#include -#include -#include "pins_arduino.h" -#include -#include - -#if defined(__AVR_ATmega328P__) -#define __TXPIN__ 3 -#define __RXPIN__ 2 -#define __RXINT__ 3 -#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) -#define __TXPIN__ 3 -#define __RXPIN__ 10 -#define __RXINT__ 4 -#elif defined(__AVR_ATmega32U4__) -#define __TXPIN__ 3 -#define __RXPIN__ 8 -#define __RXINT__ 3 -#endif - -#define __XON__ 0x11 -#define __XOFF__ 0x13 - -#define _GSMSOFTSERIALFLAGS_ESCAPED_ 0x01 -#define _GSMSOFTSERIALFLAGS_SENTXOFF_ 0x02 - -// -// Lookup table -// -#define __PARAGRAPHGUARD__ 50 -typedef struct _DELAY_TABLE -{ - long baud; - unsigned short rx_delay_centering; - unsigned short rx_delay_intrabit; - unsigned short rx_delay_stopbit; - unsigned short tx_delay; -} DELAY_TABLE; - -#if F_CPU == 16000000 - -static const DELAY_TABLE PROGMEM table[] = -{ - // baud rxcenter rxintra rxstop tx - { 115200, 1, 17, 17, 12, }, - { 57600, 10, 37, 37, 33, }, - { 38400, 25, 57, 57, 54, }, - { 31250, 31, 70, 70, 68, }, - { 28800, 34, 77, 77, 74, }, - { 19200, 54, 117, 117, 114, }, - { 14400, 74, 156, 156, 153, }, - { 9600, 114, 236, 236, 233, }, - { 4800, 233, 474, 474, 471, }, - { 2400, 471, 950, 950, 947, }, - { 1200, 947, 1902, 1902, 1899, }, - { 300, 3804, 7617, 7617, 7614, }, -}; - -const int XMIT_START_ADJUSTMENT = 5; - -#elif F_CPU == 8000000 - -static const DELAY_TABLE table[] PROGMEM = -{ - // baud rxcenter rxintra rxstop tx - { 115200, 1, 5, 5, 3, }, - { 57600, 1, 15, 15, 13, }, - { 38400, 2, 25, 26, 23, }, - { 31250, 7, 32, 33, 29, }, - { 28800, 11, 35, 35, 32, }, - { 19200, 20, 55, 55, 52, }, - { 14400, 30, 75, 75, 72, }, - { 9600, 50, 114, 114, 112, }, - { 4800, 110, 233, 233, 230, }, - { 2400, 229, 472, 472, 469, }, - { 1200, 467, 948, 948, 945, }, - { 300, 1895, 3805, 3805, 3802, }, -}; - -const int XMIT_START_ADJUSTMENT = 4; - -#elif F_CPU == 20000000 - -// 20MHz support courtesy of the good people at macegr.com. -// Thanks, Garrett! - -static const DELAY_TABLE PROGMEM table[] = -{ - // baud rxcenter rxintra rxstop tx - { 115200, 3, 21, 21, 18, }, - { 57600, 20, 43, 43, 41, }, - { 38400, 37, 73, 73, 70, }, - { 31250, 45, 89, 89, 88, }, - { 28800, 46, 98, 98, 95, }, - { 19200, 71, 148, 148, 145, }, - { 14400, 96, 197, 197, 194, }, - { 9600, 146, 297, 297, 294, }, - { 4800, 296, 595, 595, 592, }, - { 2400, 592, 1189, 1189, 1186, }, - { 1200, 1187, 2379, 2379, 2376, }, - { 300, 4759, 9523, 9523, 9520, }, -}; - -const int XMIT_START_ADJUSTMENT = 6; - -#else - -#error This version of GSM3SoftSerial supports only 20, 16 and 8MHz processors - -#endif - -GSM3SoftSerial* GSM3SoftSerial::_activeObject=0; - -GSM3SoftSerial::GSM3SoftSerial(): - _rx_delay_centering(0), - _rx_delay_intrabit(0), - _rx_delay_stopbit(0), - _tx_delay(0), - cb(this) -{ - setTX(); - setRX(); - //comStatus=0; - //waitingAnswer=false; -} - -int GSM3SoftSerial::begin(long speed) -{ - _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; - - for (unsigned i=0; ifinalWrite(0x77); - return this->finalWrite(0xEE); - } - - if(c==0x13) - { - this->finalWrite(0x77); - return this->finalWrite(0xEC); - } - - if(c==0x77) - { - this->finalWrite(0x77); - return this->finalWrite(0x88); - } - - return this->finalWrite(c); -} - -size_t GSM3SoftSerial::finalWrite(uint8_t c) -{ - - uint8_t oldSREG = SREG; - cli(); // turn off interrupts for a clean txmit - - // Write the start bit - tx_pin_write(LOW); - tunedDelay(_tx_delay + XMIT_START_ADJUSTMENT); - - // Write each of the 8 bits - for (byte mask = 0x01; mask; mask <<= 1) - { - if (c & mask) // choose bit - tx_pin_write(HIGH); // send 1 - else - tx_pin_write(LOW); // send 0 - tunedDelay(_tx_delay); - } - - tx_pin_write(HIGH); // restore pin to natural state - - SREG = oldSREG; // turn interrupts back on - tunedDelay(_tx_delay); - - return 1; -} - -/*inline*/ void GSM3SoftSerial::tunedDelay(uint16_t delay) { - uint8_t tmp=0; - - asm volatile("sbiw %0, 0x01 \n\t" - "ldi %1, 0xFF \n\t" - "cpi %A0, 0xFF \n\t" - "cpc %B0, %1 \n\t" - "brne .-10 \n\t" - : "+r" (delay), "+a" (tmp) - : "0" (delay) - ); -} - -void GSM3SoftSerial::tx_pin_write(uint8_t pin_state) -{ - // Direct port manipulation is faster than digitalWrite/Read - if (pin_state == LOW) - *_transmitPortRegister &= ~_transmitBitMask; - else - *_transmitPortRegister |= _transmitBitMask; -} - -void GSM3SoftSerial::setTX() -{ - pinMode(__TXPIN__, OUTPUT); - digitalWrite(__TXPIN__, HIGH); - // For digital port direct manipulation - _transmitBitMask = digitalPinToBitMask(__TXPIN__); - uint8_t port = digitalPinToPort(__TXPIN__); - _transmitPortRegister = portOutputRegister(port); -} - -void GSM3SoftSerial::setRX() -{ - pinMode(__RXPIN__, INPUT); - digitalWrite(__RXPIN__, HIGH); // pullup for normal logic! - // For digital port direct manipulation - _receiveBitMask = digitalPinToBitMask(__RXPIN__); - uint8_t port = digitalPinToPort(__RXPIN__); - _receivePortRegister = portInputRegister(port); - -#ifdef __AVR_ATmega32U4__ -//#define __RXINT__ 1 - attachInterrupt(__RXINT__, GSM3SoftSerial::handle_interrupt, FALLING); -#endif - // This line comes from the High Middle Ages... - // attachInterrupt(__RXINT__, GSM3SoftSerial::handle_interrupt, FALLING); -} - -void GSM3SoftSerial::handle_interrupt() -{ - if(_activeObject) - _activeObject->recv(); -} - -uint8_t GSM3SoftSerial::rx_pin_read() -{ - // Digital port manipulation - return *_receivePortRegister & _receiveBitMask; -} - -void GSM3SoftSerial::recv() -{ - -#if GCC_VERSION < 40302 -// Work-around for avr-gcc 4.3.0 OSX version bug -// Preserve the registers that the compiler misses -// (courtesy of Arduino forum user *etracer*) - asm volatile( - "push r18 \n\t" - "push r19 \n\t" - "push r20 \n\t" - "push r21 \n\t" - "push r22 \n\t" - "push r23 \n\t" - "push r26 \n\t" - "push r27 \n\t" - ::); -#endif - - bool firstByte=true; - byte thisHead; - - uint8_t d = 0; - bool morebytes=false; - //bool fullbuffer=(cb.availableBytes()<3); - bool fullbuffer; - bool capturado_fullbuffer = 0; - int i; - byte oldTail; - - // If RX line is high, then we don't see any start bit - // so interrupt is probably not for us - if (!rx_pin_read()) - { - do - { - oldTail=cb.getTail(); - // Wait approximately 1/2 of a bit width to "center" the sample - tunedDelay(_rx_delay_centering); - - fullbuffer=(cb.availableBytes()<6); - - - if(fullbuffer&&(!capturado_fullbuffer)) - tx_pin_write(LOW); - - - // Read each of the 8 bits - for (uint8_t i=0x1; i; i <<= 1) - { - tunedDelay(_rx_delay_intrabit); - uint8_t noti = ~i; - if (rx_pin_read()) - d |= i; - else // else clause added to ensure function timing is ~balanced - d &= noti; - - if(fullbuffer&&(!capturado_fullbuffer)) - { - if((uint8_t)__XOFF__ & i) - tx_pin_write(HIGH); - else - tx_pin_write(LOW); - } - } - - if(fullbuffer&&(!capturado_fullbuffer)) - { - tunedDelay(_rx_delay_intrabit); - tx_pin_write(HIGH); - } - - // So, we know the buffer is full, and we have sent a XOFF - if (fullbuffer) - { - capturado_fullbuffer =1; - _flags |=_GSMSOFTSERIALFLAGS_SENTXOFF_; - } - - - // skip the stop bit - if (!fullbuffer) tunedDelay(_rx_delay_stopbit); - - if(keepThisChar(&d)) - { - cb.write(d); - if(firstByte) - { - firstByte=false; - thisHead=cb.getTail(); - } - } - - - // This part is new. It is used to detect the end of a "paragraph" - // Caveat: the old fashion would let processor a bit of time between bytes, - // that here is lost - // This active waiting avoids drifting - morebytes=false; - // TO-DO. This PARAGRAPHGUARD is empyric. We should test it for every speed - for(i=0;i<__PARAGRAPHGUARD__;i++) - { - tunedDelay(1); - if(!rx_pin_read()) - { - morebytes=true; - break; - } - } - }while(morebytes); - // If we find a line feed, we are at the end of a paragraph - // check! - - if (fullbuffer) - { - // And... go handle it! - if(mgr) - mgr->manageMsg(thisHead, cb.getTail()); - } - else if(d==10) - { - // And... go handle it! - if(mgr) - mgr->manageMsg(thisHead, cb.getTail()); - } - else if (d==32) - { - // And... go handle it! - if(mgr) - mgr->manageMsg(thisHead, cb.getTail()); - } - } - -#if GCC_VERSION < 40302 -// Work-around for avr-gcc 4.3.0 OSX version bug -// Restore the registers that the compiler misses - asm volatile( - "pop r27 \n\t" - "pop r26 \n\t" - "pop r23 \n\t" - "pop r22 \n\t" - "pop r21 \n\t" - "pop r20 \n\t" - "pop r19 \n\t" - "pop r18 \n\t" - ::); -#endif -} - -bool GSM3SoftSerial::keepThisChar(uint8_t* c) -{ - // Horrible things for Quectel XON/XOFF - // 255 is the answer to a XOFF - // It comes just once - if((*c==255)&&(_flags & _GSMSOFTSERIALFLAGS_SENTXOFF_)) - { - _flags ^= _GSMSOFTSERIALFLAGS_SENTXOFF_; - return false; - } - - // 0x77, w, is the escape character - if(*c==0x77) - { - _flags |= _GSMSOFTSERIALFLAGS_ESCAPED_; - return false; - } - - // and these are the escaped codes - if(_flags & _GSMSOFTSERIALFLAGS_ESCAPED_) - { - if(*c==0xEE) - *c=0x11; - else if(*c==0xEC) - *c=0x13; - else if(*c==0x88) - *c=0x77; - - _flags ^= _GSMSOFTSERIALFLAGS_ESCAPED_; - return true; - } - - return true; -} - -void GSM3SoftSerial::spaceAvailable() -{ - // If there is spaceAvailable in the buffer, lets send a XON - finalWrite((byte)__XON__); -} - - -// This is here to avoid problems with Arduino compiler -void GSM3SoftSerialMgr::manageMsg(byte from, byte to){}; - -//#define PCINT1_vect _VECTOR(2) -//#undef PCINT1_vect - -#if defined(PCINT0_vect) -ISR(PCINT0_vect) -{ - GSM3SoftSerial::handle_interrupt(); -} -#endif - -#if defined(PCINT1_vect) -ISR(PCINT1_vect) -{ - GSM3SoftSerial::handle_interrupt(); -} -#endif - -#if defined(PCINT2_vect) -ISR(PCINT2_vect) -{ - GSM3SoftSerial::handle_interrupt(); -} -#endif - -#if defined(PCINT3_vect) -ISR(PCINT3_vect) -{ - GSM3SoftSerial::handle_interrupt(); -} -#endif - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include "GSM3SoftSerial.h" +#include +#include +#include "pins_arduino.h" +#include +#include + +#if defined(__AVR_ATmega328P__) +#define __TXPIN__ 3 +#define __RXPIN__ 2 +#define __RXINT__ 3 +#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) +#define __TXPIN__ 3 +#define __RXPIN__ 10 +#define __RXINT__ 4 +#elif defined(__AVR_ATmega32U4__) +#define __TXPIN__ 3 +#define __RXPIN__ 8 +#define __RXINT__ 3 +#endif + +#define __XON__ 0x11 +#define __XOFF__ 0x13 + +#define _GSMSOFTSERIALFLAGS_ESCAPED_ 0x01 +#define _GSMSOFTSERIALFLAGS_SENTXOFF_ 0x02 + +// +// Lookup table +// +#define __PARAGRAPHGUARD__ 50 +typedef struct _DELAY_TABLE +{ + long baud; + unsigned short rx_delay_centering; + unsigned short rx_delay_intrabit; + unsigned short rx_delay_stopbit; + unsigned short tx_delay; +} DELAY_TABLE; + +#if F_CPU == 16000000 + +static const DELAY_TABLE PROGMEM table[] = +{ + // baud rxcenter rxintra rxstop tx + { 115200, 1, 17, 17, 12, }, + { 57600, 10, 37, 37, 33, }, + { 38400, 25, 57, 57, 54, }, + { 31250, 31, 70, 70, 68, }, + { 28800, 34, 77, 77, 74, }, + { 19200, 54, 117, 117, 114, }, + { 14400, 74, 156, 156, 153, }, + { 9600, 114, 236, 236, 233, }, + { 4800, 233, 474, 474, 471, }, + { 2400, 471, 950, 950, 947, }, + { 1200, 947, 1902, 1902, 1899, }, + { 300, 3804, 7617, 7617, 7614, }, +}; + +const int XMIT_START_ADJUSTMENT = 5; + +#elif F_CPU == 8000000 + +static const DELAY_TABLE table[] PROGMEM = +{ + // baud rxcenter rxintra rxstop tx + { 115200, 1, 5, 5, 3, }, + { 57600, 1, 15, 15, 13, }, + { 38400, 2, 25, 26, 23, }, + { 31250, 7, 32, 33, 29, }, + { 28800, 11, 35, 35, 32, }, + { 19200, 20, 55, 55, 52, }, + { 14400, 30, 75, 75, 72, }, + { 9600, 50, 114, 114, 112, }, + { 4800, 110, 233, 233, 230, }, + { 2400, 229, 472, 472, 469, }, + { 1200, 467, 948, 948, 945, }, + { 300, 1895, 3805, 3805, 3802, }, +}; + +const int XMIT_START_ADJUSTMENT = 4; + +#elif F_CPU == 20000000 + +// 20MHz support courtesy of the good people at macegr.com. +// Thanks, Garrett! + +static const DELAY_TABLE PROGMEM table[] = +{ + // baud rxcenter rxintra rxstop tx + { 115200, 3, 21, 21, 18, }, + { 57600, 20, 43, 43, 41, }, + { 38400, 37, 73, 73, 70, }, + { 31250, 45, 89, 89, 88, }, + { 28800, 46, 98, 98, 95, }, + { 19200, 71, 148, 148, 145, }, + { 14400, 96, 197, 197, 194, }, + { 9600, 146, 297, 297, 294, }, + { 4800, 296, 595, 595, 592, }, + { 2400, 592, 1189, 1189, 1186, }, + { 1200, 1187, 2379, 2379, 2376, }, + { 300, 4759, 9523, 9523, 9520, }, +}; + +const int XMIT_START_ADJUSTMENT = 6; + +#else + +#error This version of GSM3SoftSerial supports only 20, 16 and 8MHz processors + +#endif + +GSM3SoftSerial* GSM3SoftSerial::_activeObject=0; + +GSM3SoftSerial::GSM3SoftSerial(): + _rx_delay_centering(0), + _rx_delay_intrabit(0), + _rx_delay_stopbit(0), + _tx_delay(0), + cb(this) +{ + setTX(); + setRX(); + //comStatus=0; + //waitingAnswer=false; +} + +int GSM3SoftSerial::begin(long speed) +{ + _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; + + for (unsigned i=0; ifinalWrite(0x77); + return this->finalWrite(0xEE); + } + + if(c==0x13) + { + this->finalWrite(0x77); + return this->finalWrite(0xEC); + } + + if(c==0x77) + { + this->finalWrite(0x77); + return this->finalWrite(0x88); + } + + return this->finalWrite(c); +} + +size_t GSM3SoftSerial::finalWrite(uint8_t c) +{ + + uint8_t oldSREG = SREG; + cli(); // turn off interrupts for a clean txmit + + // Write the start bit + tx_pin_write(LOW); + tunedDelay(_tx_delay + XMIT_START_ADJUSTMENT); + + // Write each of the 8 bits + for (byte mask = 0x01; mask; mask <<= 1) + { + if (c & mask) // choose bit + tx_pin_write(HIGH); // send 1 + else + tx_pin_write(LOW); // send 0 + tunedDelay(_tx_delay); + } + + tx_pin_write(HIGH); // restore pin to natural state + + SREG = oldSREG; // turn interrupts back on + tunedDelay(_tx_delay); + + return 1; +} + +/*inline*/ void GSM3SoftSerial::tunedDelay(uint16_t delay) { + uint8_t tmp=0; + + asm volatile("sbiw %0, 0x01 \n\t" + "ldi %1, 0xFF \n\t" + "cpi %A0, 0xFF \n\t" + "cpc %B0, %1 \n\t" + "brne .-10 \n\t" + : "+r" (delay), "+a" (tmp) + : "0" (delay) + ); +} + +void GSM3SoftSerial::tx_pin_write(uint8_t pin_state) +{ + // Direct port manipulation is faster than digitalWrite/Read + if (pin_state == LOW) + *_transmitPortRegister &= ~_transmitBitMask; + else + *_transmitPortRegister |= _transmitBitMask; +} + +void GSM3SoftSerial::setTX() +{ + pinMode(__TXPIN__, OUTPUT); + digitalWrite(__TXPIN__, HIGH); + // For digital port direct manipulation + _transmitBitMask = digitalPinToBitMask(__TXPIN__); + uint8_t port = digitalPinToPort(__TXPIN__); + _transmitPortRegister = portOutputRegister(port); +} + +void GSM3SoftSerial::setRX() +{ + pinMode(__RXPIN__, INPUT); + digitalWrite(__RXPIN__, HIGH); // pullup for normal logic! + // For digital port direct manipulation + _receiveBitMask = digitalPinToBitMask(__RXPIN__); + uint8_t port = digitalPinToPort(__RXPIN__); + _receivePortRegister = portInputRegister(port); + +#ifdef __AVR_ATmega32U4__ +//#define __RXINT__ 1 + attachInterrupt(__RXINT__, GSM3SoftSerial::handle_interrupt, FALLING); +#endif + // This line comes from the High Middle Ages... + // attachInterrupt(__RXINT__, GSM3SoftSerial::handle_interrupt, FALLING); +} + +void GSM3SoftSerial::handle_interrupt() +{ + if(_activeObject) + _activeObject->recv(); +} + +uint8_t GSM3SoftSerial::rx_pin_read() +{ + // Digital port manipulation + return *_receivePortRegister & _receiveBitMask; +} + +void GSM3SoftSerial::recv() +{ + +#if GCC_VERSION < 40302 +// Work-around for avr-gcc 4.3.0 OSX version bug +// Preserve the registers that the compiler misses +// (courtesy of Arduino forum user *etracer*) + asm volatile( + "push r18 \n\t" + "push r19 \n\t" + "push r20 \n\t" + "push r21 \n\t" + "push r22 \n\t" + "push r23 \n\t" + "push r26 \n\t" + "push r27 \n\t" + ::); +#endif + + bool firstByte=true; + byte thisHead; + + uint8_t d = 0; + bool morebytes=false; + //bool fullbuffer=(cb.availableBytes()<3); + bool fullbuffer; + bool capturado_fullbuffer = 0; + int i; + byte oldTail; + + // If RX line is high, then we don't see any start bit + // so interrupt is probably not for us + if (!rx_pin_read()) + { + do + { + oldTail=cb.getTail(); + // Wait approximately 1/2 of a bit width to "center" the sample + tunedDelay(_rx_delay_centering); + + fullbuffer=(cb.availableBytes()<6); + + + if(fullbuffer&&(!capturado_fullbuffer)) + tx_pin_write(LOW); + + + // Read each of the 8 bits + for (uint8_t i=0x1; i; i <<= 1) + { + tunedDelay(_rx_delay_intrabit); + uint8_t noti = ~i; + if (rx_pin_read()) + d |= i; + else // else clause added to ensure function timing is ~balanced + d &= noti; + + if(fullbuffer&&(!capturado_fullbuffer)) + { + if((uint8_t)__XOFF__ & i) + tx_pin_write(HIGH); + else + tx_pin_write(LOW); + } + } + + if(fullbuffer&&(!capturado_fullbuffer)) + { + tunedDelay(_rx_delay_intrabit); + tx_pin_write(HIGH); + } + + // So, we know the buffer is full, and we have sent a XOFF + if (fullbuffer) + { + capturado_fullbuffer =1; + _flags |=_GSMSOFTSERIALFLAGS_SENTXOFF_; + } + + + // skip the stop bit + if (!fullbuffer) tunedDelay(_rx_delay_stopbit); + + if(keepThisChar(&d)) + { + cb.write(d); + if(firstByte) + { + firstByte=false; + thisHead=cb.getTail(); + } + } + + + // This part is new. It is used to detect the end of a "paragraph" + // Caveat: the old fashion would let processor a bit of time between bytes, + // that here is lost + // This active waiting avoids drifting + morebytes=false; + // TO-DO. This PARAGRAPHGUARD is empyric. We should test it for every speed + for(i=0;i<__PARAGRAPHGUARD__;i++) + { + tunedDelay(1); + if(!rx_pin_read()) + { + morebytes=true; + break; + } + } + }while(morebytes); + // If we find a line feed, we are at the end of a paragraph + // check! + + if (fullbuffer) + { + // And... go handle it! + if(mgr) + mgr->manageMsg(thisHead, cb.getTail()); + } + else if(d==10) + { + // And... go handle it! + if(mgr) + mgr->manageMsg(thisHead, cb.getTail()); + } + else if (d==32) + { + // And... go handle it! + if(mgr) + mgr->manageMsg(thisHead, cb.getTail()); + } + } + +#if GCC_VERSION < 40302 +// Work-around for avr-gcc 4.3.0 OSX version bug +// Restore the registers that the compiler misses + asm volatile( + "pop r27 \n\t" + "pop r26 \n\t" + "pop r23 \n\t" + "pop r22 \n\t" + "pop r21 \n\t" + "pop r20 \n\t" + "pop r19 \n\t" + "pop r18 \n\t" + ::); +#endif +} + +bool GSM3SoftSerial::keepThisChar(uint8_t* c) +{ + // Horrible things for Quectel XON/XOFF + // 255 is the answer to a XOFF + // It comes just once + if((*c==255)&&(_flags & _GSMSOFTSERIALFLAGS_SENTXOFF_)) + { + _flags ^= _GSMSOFTSERIALFLAGS_SENTXOFF_; + return false; + } + + // 0x77, w, is the escape character + if(*c==0x77) + { + _flags |= _GSMSOFTSERIALFLAGS_ESCAPED_; + return false; + } + + // and these are the escaped codes + if(_flags & _GSMSOFTSERIALFLAGS_ESCAPED_) + { + if(*c==0xEE) + *c=0x11; + else if(*c==0xEC) + *c=0x13; + else if(*c==0x88) + *c=0x77; + + _flags ^= _GSMSOFTSERIALFLAGS_ESCAPED_; + return true; + } + + return true; +} + +void GSM3SoftSerial::spaceAvailable() +{ + // If there is spaceAvailable in the buffer, lets send a XON + finalWrite((byte)__XON__); +} + + +// This is here to avoid problems with Arduino compiler +void GSM3SoftSerialMgr::manageMsg(byte from, byte to){}; + +//#define PCINT1_vect _VECTOR(2) +//#undef PCINT1_vect + +#if defined(PCINT0_vect) +ISR(PCINT0_vect) +{ + GSM3SoftSerial::handle_interrupt(); +} +#endif + +#if defined(PCINT1_vect) +ISR(PCINT1_vect) +{ + GSM3SoftSerial::handle_interrupt(); +} +#endif + +#if defined(PCINT2_vect) +ISR(PCINT2_vect) +{ + GSM3SoftSerial::handle_interrupt(); +} +#endif + +#if defined(PCINT3_vect) +ISR(PCINT3_vect) +{ + GSM3SoftSerial::handle_interrupt(); +} +#endif + diff --git a/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.h b/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.h index c35ef684894..538f40d0362 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3SoftSerial.h @@ -1,174 +1,174 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef __GSM3_SOFTSERIAL__ -#define __GSM3_SOFTSERIAL__ - -// An adaptation of NewSoftSerial for Modem Shields -// Assumes directly that Serial is attached to Pins 2 and 3, not inverse -// We are implementing it because NewSoftSerial does not deal correctly with floods -// of data -#include "GSM3CircularBuffer.h" -#include - -/* -#define _COMSTATUS_ANSWERRECEIVED_ 0x100 -#define _COMSTATUS_SMSRECEIVED_ 0x80 -#define _COMSTATUS_CALLRECEIVED_ 0x40 - -// PLEASE, when accessing the sockets use "for" and >> (bitwise operator) -#define _COMSTATUS_SOCKET6RECEIVED_ 0x20 -#define _COMSTATUS_SOCKET5RECEIVED_ 0x10 -#define _COMSTATUS_SOCKET4RECEIVED_ 0x08 -#define _COMSTATUS_SOCKET3RECEIVED_ 0x04 -#define _COMSTATUS_SOCKET2RECEIVED_ 0x02 -#define _COMSTATUS_SOCKET1RECEIVED_ 0x01 - -#define __CALLTABLEMASK__ 0x3 -*/ - -class GSM3SoftSerialMgr -{ - public: - - /** Manages soft serial message - @param from Initial byte - @param to Final byte - */ - virtual void manageMsg(byte from, byte to); -}; - -// This class manages software serial communications -// Changing it so it doesn't know about modems or whatever - -class GSM3SoftSerial : public GSM3CircularBufferManager -{ - private: - - uint8_t _receiveBitMask; - volatile uint8_t *_receivePortRegister; - uint8_t _transmitBitMask; - volatile uint8_t *_transmitPortRegister; - - static GSM3SoftSerial* _activeObject; - GSM3SoftSerialMgr* mgr; - - uint16_t _rx_delay_centering; - uint16_t _rx_delay_intrabit; - uint16_t _rx_delay_stopbit; - uint16_t _tx_delay; - uint8_t _flags; - - /** Write in tx_pin - @param pin_state Pin state - */ - void tx_pin_write(uint8_t pin_state); - - /** Set transmission - */ - void setTX(); - - /** Set receiver - */ - void setRX(); - - /** Receive - */ - void recv(); - - /** Read from rx_pin - @return receive bit mask - */ - uint8_t rx_pin_read(); - - void setComsReceived(); - - /** Write a character in serial connection, final action after escaping - @param c Character - @return 1 if succesful, 0 if transmission delay = 0 - */ - virtual size_t finalWrite(uint8_t); - - /** Decide, attending to escapes, if the received character should we - kept, forgotten, or changed - @param c Character, may be changed - @return 1 if shall be kept, 0 if forgotten - */ - bool keepThisChar(uint8_t* c); - - // Checks the buffer for well-known events. - //bool recognizeUnsolicitedEvent(byte oldTail); - - public: - - /** Tuned delay in microcontroller - @param delay Time to delay - */ - static /*inline */void tunedDelay(uint16_t delay); - - GSM3CircularBuffer cb; // Circular buffer - - /** Register serial manager - @param manager Serial manager - */ - inline void registerMgr(GSM3SoftSerialMgr* manager){mgr=manager;}; - - /** If there is spaceAvailable in the buffer, lets send a XON - */ - void spaceAvailable(); - - /** Write a character in serial connection - @param c Character - @return 1 if succesful, 0 if transmission delay = 0 - */ - virtual size_t write(uint8_t); - - /** Constructor */ - GSM3SoftSerial(); - - /** Establish serial connection - @param speed Baudrate - @return - */ - int begin(long speed); - - /** Manage interruptions - */ - static inline void handle_interrupt(); - - /** Close serial connection - */ - void close(); -}; - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef __GSM3_SOFTSERIAL__ +#define __GSM3_SOFTSERIAL__ + +// An adaptation of NewSoftSerial for Modem Shields +// Assumes directly that Serial is attached to Pins 2 and 3, not inverse +// We are implementing it because NewSoftSerial does not deal correctly with floods +// of data +#include "GSM3CircularBuffer.h" +#include + +/* +#define _COMSTATUS_ANSWERRECEIVED_ 0x100 +#define _COMSTATUS_SMSRECEIVED_ 0x80 +#define _COMSTATUS_CALLRECEIVED_ 0x40 + +// PLEASE, when accessing the sockets use "for" and >> (bitwise operator) +#define _COMSTATUS_SOCKET6RECEIVED_ 0x20 +#define _COMSTATUS_SOCKET5RECEIVED_ 0x10 +#define _COMSTATUS_SOCKET4RECEIVED_ 0x08 +#define _COMSTATUS_SOCKET3RECEIVED_ 0x04 +#define _COMSTATUS_SOCKET2RECEIVED_ 0x02 +#define _COMSTATUS_SOCKET1RECEIVED_ 0x01 + +#define __CALLTABLEMASK__ 0x3 +*/ + +class GSM3SoftSerialMgr +{ + public: + + /** Manages soft serial message + @param from Initial byte + @param to Final byte + */ + virtual void manageMsg(byte from, byte to); +}; + +// This class manages software serial communications +// Changing it so it doesn't know about modems or whatever + +class GSM3SoftSerial : public GSM3CircularBufferManager +{ + private: + + uint8_t _receiveBitMask; + volatile uint8_t *_receivePortRegister; + uint8_t _transmitBitMask; + volatile uint8_t *_transmitPortRegister; + + static GSM3SoftSerial* _activeObject; + GSM3SoftSerialMgr* mgr; + + uint16_t _rx_delay_centering; + uint16_t _rx_delay_intrabit; + uint16_t _rx_delay_stopbit; + uint16_t _tx_delay; + uint8_t _flags; + + /** Write in tx_pin + @param pin_state Pin state + */ + void tx_pin_write(uint8_t pin_state); + + /** Set transmission + */ + void setTX(); + + /** Set receiver + */ + void setRX(); + + /** Receive + */ + void recv(); + + /** Read from rx_pin + @return receive bit mask + */ + uint8_t rx_pin_read(); + + void setComsReceived(); + + /** Write a character in serial connection, final action after escaping + @param c Character + @return 1 if succesful, 0 if transmission delay = 0 + */ + virtual size_t finalWrite(uint8_t); + + /** Decide, attending to escapes, if the received character should we + kept, forgotten, or changed + @param c Character, may be changed + @return 1 if shall be kept, 0 if forgotten + */ + bool keepThisChar(uint8_t* c); + + // Checks the buffer for well-known events. + //bool recognizeUnsolicitedEvent(byte oldTail); + + public: + + /** Tuned delay in microcontroller + @param delay Time to delay + */ + static /*inline */void tunedDelay(uint16_t delay); + + GSM3CircularBuffer cb; // Circular buffer + + /** Register serial manager + @param manager Serial manager + */ + inline void registerMgr(GSM3SoftSerialMgr* manager){mgr=manager;}; + + /** If there is spaceAvailable in the buffer, lets send a XON + */ + void spaceAvailable(); + + /** Write a character in serial connection + @param c Character + @return 1 if succesful, 0 if transmission delay = 0 + */ + virtual size_t write(uint8_t); + + /** Constructor */ + GSM3SoftSerial(); + + /** Establish serial connection + @param speed Baudrate + @return + */ + int begin(long speed); + + /** Manage interruptions + */ + static inline void handle_interrupt(); + + /** Close serial connection + */ + void close(); +}; + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.cpp b/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.cpp index fefb0f04318..d931d183e2e 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.cpp +++ b/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.cpp @@ -1,144 +1,144 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#include -#include - -#include -GSM3ShieldV1VoiceProvider theShieldV1VoiceProvider; - -// While there is only a shield (ShieldV1) we will include it by default - -#define GSM3VOICECALLSERVICE_SYNCH 0x01 // 1: synchronous 0: asynchronous -#define __TOUT__ 10000 - - - - -GSM3VoiceCallService::GSM3VoiceCallService(bool synch) -{ - if(synch) - flags |= GSM3VOICECALLSERVICE_SYNCH; - theGSM3MobileVoiceProvider->initialize(); -} - -GSM3_voiceCall_st GSM3VoiceCallService::getvoiceCallStatus() -{ - if(theGSM3MobileVoiceProvider==0) - return IDLE_CALL; - - return theGSM3MobileVoiceProvider->getvoiceCallStatus(); -} - -int GSM3VoiceCallService::ready() -{ - if(theGSM3MobileVoiceProvider==0) - return 0; - - return theGSM3MobileVoiceProvider->ready(); -} - -int GSM3VoiceCallService::voiceCall(const char* to, unsigned long timeout) -{ - if(theGSM3MobileVoiceProvider==0) - return 0; - - if(flags & GSM3VOICECALLSERVICE_SYNCH ) - { - theGSM3MobileVoiceProvider->voiceCall(to); - unsigned long m; - m=millis(); - // Wait an answer for timeout - while(((millis()-m)< timeout )&&(getvoiceCallStatus()==CALLING)) - delay(100); - - if(getvoiceCallStatus()==TALKING) - return 1; - else - return 0; - } - else - { - return theGSM3MobileVoiceProvider->voiceCall(to); - } - -} - -int GSM3VoiceCallService::answerCall() -{ - if(theGSM3MobileVoiceProvider==0) - return 0; - - return waitForAnswerIfNeeded(theGSM3MobileVoiceProvider->answerCall()); -} - -int GSM3VoiceCallService::hangCall() -{ - if(theGSM3MobileVoiceProvider==0) - return 0; - - return waitForAnswerIfNeeded(theGSM3MobileVoiceProvider->hangCall()); -} - -int GSM3VoiceCallService::retrieveCallingNumber(char* buffer, int bufsize) -{ - if(theGSM3MobileVoiceProvider==0) - return 0; - - return waitForAnswerIfNeeded(theGSM3MobileVoiceProvider->retrieveCallingNumber(buffer, bufsize)); -} - -int GSM3VoiceCallService::waitForAnswerIfNeeded(int returnvalue) -{ - // If synchronous - if(flags & GSM3VOICECALLSERVICE_SYNCH ) - { - unsigned long m; - m=millis(); - // Wait for __TOUT__ - while(((millis()-m)< __TOUT__ )&&(ready()==0)) - delay(100); - // If everything was OK, return 1 - // else (timeout or error codes) return 0; - if(ready()==1) - return 1; - else - return 0; - } - // If not synchronous just kick ahead the coming result - return ready(); -} - - - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#include +#include + +#include +GSM3ShieldV1VoiceProvider theShieldV1VoiceProvider; + +// While there is only a shield (ShieldV1) we will include it by default + +#define GSM3VOICECALLSERVICE_SYNCH 0x01 // 1: synchronous 0: asynchronous +#define __TOUT__ 10000 + + + + +GSM3VoiceCallService::GSM3VoiceCallService(bool synch) +{ + if(synch) + flags |= GSM3VOICECALLSERVICE_SYNCH; + theGSM3MobileVoiceProvider->initialize(); +} + +GSM3_voiceCall_st GSM3VoiceCallService::getvoiceCallStatus() +{ + if(theGSM3MobileVoiceProvider==0) + return IDLE_CALL; + + return theGSM3MobileVoiceProvider->getvoiceCallStatus(); +} + +int GSM3VoiceCallService::ready() +{ + if(theGSM3MobileVoiceProvider==0) + return 0; + + return theGSM3MobileVoiceProvider->ready(); +} + +int GSM3VoiceCallService::voiceCall(const char* to, unsigned long timeout) +{ + if(theGSM3MobileVoiceProvider==0) + return 0; + + if(flags & GSM3VOICECALLSERVICE_SYNCH ) + { + theGSM3MobileVoiceProvider->voiceCall(to); + unsigned long m; + m=millis(); + // Wait an answer for timeout + while(((millis()-m)< timeout )&&(getvoiceCallStatus()==CALLING)) + delay(100); + + if(getvoiceCallStatus()==TALKING) + return 1; + else + return 0; + } + else + { + return theGSM3MobileVoiceProvider->voiceCall(to); + } + +} + +int GSM3VoiceCallService::answerCall() +{ + if(theGSM3MobileVoiceProvider==0) + return 0; + + return waitForAnswerIfNeeded(theGSM3MobileVoiceProvider->answerCall()); +} + +int GSM3VoiceCallService::hangCall() +{ + if(theGSM3MobileVoiceProvider==0) + return 0; + + return waitForAnswerIfNeeded(theGSM3MobileVoiceProvider->hangCall()); +} + +int GSM3VoiceCallService::retrieveCallingNumber(char* buffer, int bufsize) +{ + if(theGSM3MobileVoiceProvider==0) + return 0; + + return waitForAnswerIfNeeded(theGSM3MobileVoiceProvider->retrieveCallingNumber(buffer, bufsize)); +} + +int GSM3VoiceCallService::waitForAnswerIfNeeded(int returnvalue) +{ + // If synchronous + if(flags & GSM3VOICECALLSERVICE_SYNCH ) + { + unsigned long m; + m=millis(); + // Wait for __TOUT__ + while(((millis()-m)< __TOUT__ )&&(ready()==0)) + delay(100); + // If everything was OK, return 1 + // else (timeout or error codes) return 0; + if(ready()==1) + return 1; + else + return 0; + } + // If not synchronous just kick ahead the coming result + return ready(); +} + + + + diff --git a/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.h b/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.h index 089d5797a6e..c5486583076 100644 --- a/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.h +++ b/hardware/arduino/avr/libraries/GSM/GSM3VoiceCallService.h @@ -1,102 +1,102 @@ -/* -This file is part of the GSM3 communications library for Arduino --- Multi-transport communications platform --- Fully asynchronous --- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 --- Voice calls --- SMS --- TCP/IP connections --- HTTP basic clients - -This library has been developed by Telef�nica Digital - PDI - -- Physical Internet Lab, as part as its collaboration with -Arduino and the Open Hardware Community. - -September-December 2012 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -https://github.com/BlueVia/Official-Arduino -*/ -#ifndef _GSM3VOICECALLSERVICE_ -#define _GSM3VOICECALLSERVICE_ - -#include -#include - -class GSM3VoiceCallService -{ - private: - uint8_t flags; - - /** Make synchronous the functions, if needed - @param returnvalue Return value - @return returns 0 if last command is still executing, 1 success, >1 error - */ - int waitForAnswerIfNeeded(int returnvalue); - - public: - /** Service creation - @param synch If true, the service calls are synchronois - */ - GSM3VoiceCallService(bool synch=true); - - /** Voice call status - @return Status of the voice call, as described in GSM3MobileVoiceProvider.h - { IDLE_CALL, CALLING, RECEIVINGCALL, TALKING}; - */ - GSM3_voiceCall_st getvoiceCallStatus(); - - /** Get last command status - @return Returns 0 if last command is still executing, 1 success, >1 error - */ - int ready(); - - /** Place a voice call. If asynchronous, returns while ringing. If synchronous - returns if the call is stablished or cancelled. - @param to Receiver number. Country extension can be used or not. - Char buffer should not be released or used until command is over - @param timeout In millisecods. Time ringing before closing the call. - Only used in synchronous mode. - If zero, ring undefinitely - @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error - In synchronous mode returns 1 if the call is placed, 0 if not. - */ - int voiceCall(const char* to, unsigned long timeout=30000); - - /** Accept an incoming voice call - @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error - In synchronous mode returns 1 if the call is answered, 0 if not. - */ - int answerCall(); - - /** Hang a stablished call or an incoming ring - @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error - In synchronous mode returns 1 if the call is answered, 0 if not. - */ - int hangCall(); - - /** Retrieve the calling number, put it in buffer - @param buffer pointer to the buffer memory - @param bufsize size of available memory area, at least should be 10 characters - @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error - In synchronous mode returns 1 if the number is correcty taken 0 if not - */ - int retrieveCallingNumber(char* buffer, int bufsize); -}; - - +/* +This file is part of the GSM3 communications library for Arduino +-- Multi-transport communications platform +-- Fully asynchronous +-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1 +-- Voice calls +-- SMS +-- TCP/IP connections +-- HTTP basic clients + +This library has been developed by Telef�nica Digital - PDI - +- Physical Internet Lab, as part as its collaboration with +Arduino and the Open Hardware Community. + +September-December 2012 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +https://github.com/BlueVia/Official-Arduino +*/ +#ifndef _GSM3VOICECALLSERVICE_ +#define _GSM3VOICECALLSERVICE_ + +#include +#include + +class GSM3VoiceCallService +{ + private: + uint8_t flags; + + /** Make synchronous the functions, if needed + @param returnvalue Return value + @return returns 0 if last command is still executing, 1 success, >1 error + */ + int waitForAnswerIfNeeded(int returnvalue); + + public: + /** Service creation + @param synch If true, the service calls are synchronois + */ + GSM3VoiceCallService(bool synch=true); + + /** Voice call status + @return Status of the voice call, as described in GSM3MobileVoiceProvider.h + { IDLE_CALL, CALLING, RECEIVINGCALL, TALKING}; + */ + GSM3_voiceCall_st getvoiceCallStatus(); + + /** Get last command status + @return Returns 0 if last command is still executing, 1 success, >1 error + */ + int ready(); + + /** Place a voice call. If asynchronous, returns while ringing. If synchronous + returns if the call is stablished or cancelled. + @param to Receiver number. Country extension can be used or not. + Char buffer should not be released or used until command is over + @param timeout In millisecods. Time ringing before closing the call. + Only used in synchronous mode. + If zero, ring undefinitely + @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error + In synchronous mode returns 1 if the call is placed, 0 if not. + */ + int voiceCall(const char* to, unsigned long timeout=30000); + + /** Accept an incoming voice call + @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error + In synchronous mode returns 1 if the call is answered, 0 if not. + */ + int answerCall(); + + /** Hang a stablished call or an incoming ring + @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error + In synchronous mode returns 1 if the call is answered, 0 if not. + */ + int hangCall(); + + /** Retrieve the calling number, put it in buffer + @param buffer pointer to the buffer memory + @param bufsize size of available memory area, at least should be 10 characters + @return In asynchronous mode returns 0 if last command is still executing, 1 success, >1 error + In synchronous mode returns 1 if the number is correcty taken 0 if not + */ + int retrieveCallingNumber(char* buffer, int bufsize); +}; + + #endif \ No newline at end of file diff --git a/hardware/arduino/avr/libraries/Servo/Servo.cpp b/hardware/arduino/avr/libraries/Servo/Servo.cpp index a17ed34e17d..869302d5b2d 100644 --- a/hardware/arduino/avr/libraries/Servo/Servo.cpp +++ b/hardware/arduino/avr/libraries/Servo/Servo.cpp @@ -1,337 +1,337 @@ -/* - Servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - Copyright (c) 2009 Michael Margolis. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - - A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - The servos are pulsed in the background using the value most recently written using the write() method - - Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - - The methods are: - - Servo - Class for manipulating servo motors connected to Arduino pins. - - attach(pin ) - Attaches a servo motor to an i/o pin. - attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - default min is 544, max is 2400 - - write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - writeMicroseconds() - Sets the servo pulse width in microseconds - read() - Gets the last written servo pulse width as an angle between 0 and 180. - readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - attached() - Returns true if there is a servo attached. - detach() - Stops an attached servos from pulsing its i/o pin. - -*/ - -#include -#include - -#include "Servo.h" - -#define usToTicks(_us) (( clockCyclesPerMicrosecond()* _us) / 8) // converts microseconds to tick (assumes prescale of 8) // 12 Aug 2009 -#define ticksToUs(_ticks) (( (unsigned)_ticks * 8)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds - - -#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays // 12 August 2009 - -//#define NBR_TIMERS (MAX_SERVOS / SERVOS_PER_TIMER) - -static servo_t servos[MAX_SERVOS]; // static array of servo structures -static volatile int8_t Channel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) - -uint8_t ServoCount = 0; // the total number of attached servos - - -// convenience macros -#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo -#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % SERVOS_PER_TIMER) // returns the index of the servo on this timer -#define SERVO_INDEX(_timer,_channel) ((_timer*SERVOS_PER_TIMER) + _channel) // macro to access servo index by timer and channel -#define SERVO(_timer,_channel) (servos[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel - -#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo -#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo - -/************ static functions common to all instances ***********************/ - -static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t *TCNTn, volatile uint16_t* OCRnA) -{ - if( Channel[timer] < 0 ) - *TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer - else{ - if( SERVO_INDEX(timer,Channel[timer]) < ServoCount && SERVO(timer,Channel[timer]).Pin.isActive == true ) - digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,LOW); // pulse this channel low if activated - } - - Channel[timer]++; // increment to the next channel - if( SERVO_INDEX(timer,Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { - *OCRnA = *TCNTn + SERVO(timer,Channel[timer]).ticks; - if(SERVO(timer,Channel[timer]).Pin.isActive == true) // check if activated - digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,HIGH); // its an active channel so pulse it high - } - else { - // finished all channels so wait for the refresh period to expire before starting over - if( ((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL) ) // allow a few ticks to ensure the next OCR1A not missed - *OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL); - else - *OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed - Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel - } -} - -#ifndef WIRING // Wiring pre-defines signal handlers so don't define any if compiling for the Wiring platform -// Interrupt handlers for Arduino -#if defined(_useTimer1) -ISR(TIMER1_COMPA_vect) -{ - handle_interrupts(_timer1, &TCNT1, &OCR1A); -} -#endif - -#if defined(_useTimer3) -ISR(TIMER3_COMPA_vect) -{ - handle_interrupts(_timer3, &TCNT3, &OCR3A); -} -#endif - -#if defined(_useTimer4) -ISR(TIMER4_COMPA_vect) -{ - handle_interrupts(_timer4, &TCNT4, &OCR4A); -} -#endif - -#if defined(_useTimer5) -ISR(TIMER5_COMPA_vect) -{ - handle_interrupts(_timer5, &TCNT5, &OCR5A); -} -#endif - -#elif defined WIRING -// Interrupt handlers for Wiring -#if defined(_useTimer1) -void Timer1Service() -{ - handle_interrupts(_timer1, &TCNT1, &OCR1A); -} -#endif -#if defined(_useTimer3) -void Timer3Service() -{ - handle_interrupts(_timer3, &TCNT3, &OCR3A); -} -#endif -#endif - - -static void initISR(timer16_Sequence_t timer) -{ -#if defined (_useTimer1) - if(timer == _timer1) { - TCCR1A = 0; // normal counting mode - TCCR1B = _BV(CS11); // set prescaler of 8 - TCNT1 = 0; // clear the timer count -#if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__) - TIFR |= _BV(OCF1A); // clear any pending interrupts; - TIMSK |= _BV(OCIE1A) ; // enable the output compare interrupt -#else - // here if not ATmega8 or ATmega128 - TIFR1 |= _BV(OCF1A); // clear any pending interrupts; - TIMSK1 |= _BV(OCIE1A) ; // enable the output compare interrupt -#endif -#if defined(WIRING) - timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service); -#endif - } -#endif - -#if defined (_useTimer3) - if(timer == _timer3) { - TCCR3A = 0; // normal counting mode - TCCR3B = _BV(CS31); // set prescaler of 8 - TCNT3 = 0; // clear the timer count -#if defined(__AVR_ATmega128__) - TIFR |= _BV(OCF3A); // clear any pending interrupts; - ETIMSK |= _BV(OCIE3A); // enable the output compare interrupt -#else - TIFR3 = _BV(OCF3A); // clear any pending interrupts; - TIMSK3 = _BV(OCIE3A) ; // enable the output compare interrupt -#endif -#if defined(WIRING) - timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only -#endif - } -#endif - -#if defined (_useTimer4) - if(timer == _timer4) { - TCCR4A = 0; // normal counting mode - TCCR4B = _BV(CS41); // set prescaler of 8 - TCNT4 = 0; // clear the timer count - TIFR4 = _BV(OCF4A); // clear any pending interrupts; - TIMSK4 = _BV(OCIE4A) ; // enable the output compare interrupt - } -#endif - -#if defined (_useTimer5) - if(timer == _timer5) { - TCCR5A = 0; // normal counting mode - TCCR5B = _BV(CS51); // set prescaler of 8 - TCNT5 = 0; // clear the timer count - TIFR5 = _BV(OCF5A); // clear any pending interrupts; - TIMSK5 = _BV(OCIE5A) ; // enable the output compare interrupt - } -#endif -} - -static void finISR(timer16_Sequence_t timer) -{ - //disable use of the given timer -#if defined WIRING // Wiring - if(timer == _timer1) { - #if defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) - TIMSK1 &= ~_BV(OCIE1A) ; // disable timer 1 output compare interrupt - #else - TIMSK &= ~_BV(OCIE1A) ; // disable timer 1 output compare interrupt - #endif - timerDetach(TIMER1OUTCOMPAREA_INT); - } - else if(timer == _timer3) { - #if defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) - TIMSK3 &= ~_BV(OCIE3A); // disable the timer3 output compare A interrupt - #else - ETIMSK &= ~_BV(OCIE3A); // disable the timer3 output compare A interrupt - #endif - timerDetach(TIMER3OUTCOMPAREA_INT); - } -#else - //For arduino - in future: call here to a currently undefined function to reset the timer -#endif -} - -static boolean isTimerActive(timer16_Sequence_t timer) -{ - // returns true if any servo is active on this timer - for(uint8_t channel=0; channel < SERVOS_PER_TIMER; channel++) { - if(SERVO(timer,channel).Pin.isActive == true) - return true; - } - return false; -} - - -/****************** end of static functions ******************************/ - -Servo::Servo() -{ - if( ServoCount < MAX_SERVOS) { - this->servoIndex = ServoCount++; // assign a servo index to this instance - servos[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 - } - else - this->servoIndex = INVALID_SERVO ; // too many servos -} - -uint8_t Servo::attach(int pin) -{ - return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); -} - -uint8_t Servo::attach(int pin, int min, int max) -{ - if(this->servoIndex < MAX_SERVOS ) { - pinMode( pin, OUTPUT) ; // set servo pin to output - servos[this->servoIndex].Pin.nbr = pin; - // todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128 - this->min = (MIN_PULSE_WIDTH - min)/4; //resolution of min/max is 4 uS - this->max = (MAX_PULSE_WIDTH - max)/4; - // initialize the timer if it has not already been initialized - timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); - if(isTimerActive(timer) == false) - initISR(timer); - servos[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive - } - return this->servoIndex ; -} - -void Servo::detach() -{ - servos[this->servoIndex].Pin.isActive = false; - timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); - if(isTimerActive(timer) == false) { - finISR(timer); - } -} - -void Servo::write(int value) -{ - if(value < MIN_PULSE_WIDTH) - { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) - if(value < 0) value = 0; - if(value > 180) value = 180; - value = map(value, 0, 180, SERVO_MIN(), SERVO_MAX()); - } - this->writeMicroseconds(value); -} - -void Servo::writeMicroseconds(int value) -{ - // calculate and store the values for the given channel - byte channel = this->servoIndex; - if( (channel < MAX_SERVOS) ) // ensure channel is valid - { - if( value < SERVO_MIN() ) // ensure pulse width is valid - value = SERVO_MIN(); - else if( value > SERVO_MAX() ) - value = SERVO_MAX(); - - value = value - TRIM_DURATION; - value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009 - - uint8_t oldSREG = SREG; - cli(); - servos[channel].ticks = value; - SREG = oldSREG; - } -} - -int Servo::read() // return the value as degrees -{ - return map( this->readMicroseconds()+1, SERVO_MIN(), SERVO_MAX(), 0, 180); -} - -int Servo::readMicroseconds() -{ - unsigned int pulsewidth; - if( this->servoIndex != INVALID_SERVO ) - pulsewidth = ticksToUs(servos[this->servoIndex].ticks) + TRIM_DURATION ; // 12 aug 2009 - else - pulsewidth = 0; - - return pulsewidth; -} - -bool Servo::attached() -{ - return servos[this->servoIndex].Pin.isActive ; -} +/* + Servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + Copyright (c) 2009 Michael Margolis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + + A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + The servos are pulsed in the background using the value most recently written using the write() method + + Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + + The methods are: + + Servo - Class for manipulating servo motors connected to Arduino pins. + + attach(pin ) - Attaches a servo motor to an i/o pin. + attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds + default min is 544, max is 2400 + + write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + writeMicroseconds() - Sets the servo pulse width in microseconds + read() - Gets the last written servo pulse width as an angle between 0 and 180. + readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + attached() - Returns true if there is a servo attached. + detach() - Stops an attached servos from pulsing its i/o pin. + +*/ + +#include +#include + +#include "Servo.h" + +#define usToTicks(_us) (( clockCyclesPerMicrosecond()* _us) / 8) // converts microseconds to tick (assumes prescale of 8) // 12 Aug 2009 +#define ticksToUs(_ticks) (( (unsigned)_ticks * 8)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds + + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays // 12 August 2009 + +//#define NBR_TIMERS (MAX_SERVOS / SERVOS_PER_TIMER) + +static servo_t servos[MAX_SERVOS]; // static array of servo structures +static volatile int8_t Channel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + +uint8_t ServoCount = 0; // the total number of attached servos + + +// convenience macros +#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo +#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % SERVOS_PER_TIMER) // returns the index of the servo on this timer +#define SERVO_INDEX(_timer,_channel) ((_timer*SERVOS_PER_TIMER) + _channel) // macro to access servo index by timer and channel +#define SERVO(_timer,_channel) (servos[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel + +#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo +#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo + +/************ static functions common to all instances ***********************/ + +static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t *TCNTn, volatile uint16_t* OCRnA) +{ + if( Channel[timer] < 0 ) + *TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer + else{ + if( SERVO_INDEX(timer,Channel[timer]) < ServoCount && SERVO(timer,Channel[timer]).Pin.isActive == true ) + digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,LOW); // pulse this channel low if activated + } + + Channel[timer]++; // increment to the next channel + if( SERVO_INDEX(timer,Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + *OCRnA = *TCNTn + SERVO(timer,Channel[timer]).ticks; + if(SERVO(timer,Channel[timer]).Pin.isActive == true) // check if activated + digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,HIGH); // its an active channel so pulse it high + } + else { + // finished all channels so wait for the refresh period to expire before starting over + if( ((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL) ) // allow a few ticks to ensure the next OCR1A not missed + *OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL); + else + *OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +#ifndef WIRING // Wiring pre-defines signal handlers so don't define any if compiling for the Wiring platform +// Interrupt handlers for Arduino +#if defined(_useTimer1) +ISR(TIMER1_COMPA_vect) +{ + handle_interrupts(_timer1, &TCNT1, &OCR1A); +} +#endif + +#if defined(_useTimer3) +ISR(TIMER3_COMPA_vect) +{ + handle_interrupts(_timer3, &TCNT3, &OCR3A); +} +#endif + +#if defined(_useTimer4) +ISR(TIMER4_COMPA_vect) +{ + handle_interrupts(_timer4, &TCNT4, &OCR4A); +} +#endif + +#if defined(_useTimer5) +ISR(TIMER5_COMPA_vect) +{ + handle_interrupts(_timer5, &TCNT5, &OCR5A); +} +#endif + +#elif defined WIRING +// Interrupt handlers for Wiring +#if defined(_useTimer1) +void Timer1Service() +{ + handle_interrupts(_timer1, &TCNT1, &OCR1A); +} +#endif +#if defined(_useTimer3) +void Timer3Service() +{ + handle_interrupts(_timer3, &TCNT3, &OCR3A); +} +#endif +#endif + + +static void initISR(timer16_Sequence_t timer) +{ +#if defined (_useTimer1) + if(timer == _timer1) { + TCCR1A = 0; // normal counting mode + TCCR1B = _BV(CS11); // set prescaler of 8 + TCNT1 = 0; // clear the timer count +#if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__) + TIFR |= _BV(OCF1A); // clear any pending interrupts; + TIMSK |= _BV(OCIE1A) ; // enable the output compare interrupt +#else + // here if not ATmega8 or ATmega128 + TIFR1 |= _BV(OCF1A); // clear any pending interrupts; + TIMSK1 |= _BV(OCIE1A) ; // enable the output compare interrupt +#endif +#if defined(WIRING) + timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service); +#endif + } +#endif + +#if defined (_useTimer3) + if(timer == _timer3) { + TCCR3A = 0; // normal counting mode + TCCR3B = _BV(CS31); // set prescaler of 8 + TCNT3 = 0; // clear the timer count +#if defined(__AVR_ATmega128__) + TIFR |= _BV(OCF3A); // clear any pending interrupts; + ETIMSK |= _BV(OCIE3A); // enable the output compare interrupt +#else + TIFR3 = _BV(OCF3A); // clear any pending interrupts; + TIMSK3 = _BV(OCIE3A) ; // enable the output compare interrupt +#endif +#if defined(WIRING) + timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only +#endif + } +#endif + +#if defined (_useTimer4) + if(timer == _timer4) { + TCCR4A = 0; // normal counting mode + TCCR4B = _BV(CS41); // set prescaler of 8 + TCNT4 = 0; // clear the timer count + TIFR4 = _BV(OCF4A); // clear any pending interrupts; + TIMSK4 = _BV(OCIE4A) ; // enable the output compare interrupt + } +#endif + +#if defined (_useTimer5) + if(timer == _timer5) { + TCCR5A = 0; // normal counting mode + TCCR5B = _BV(CS51); // set prescaler of 8 + TCNT5 = 0; // clear the timer count + TIFR5 = _BV(OCF5A); // clear any pending interrupts; + TIMSK5 = _BV(OCIE5A) ; // enable the output compare interrupt + } +#endif +} + +static void finISR(timer16_Sequence_t timer) +{ + //disable use of the given timer +#if defined WIRING // Wiring + if(timer == _timer1) { + #if defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) + TIMSK1 &= ~_BV(OCIE1A) ; // disable timer 1 output compare interrupt + #else + TIMSK &= ~_BV(OCIE1A) ; // disable timer 1 output compare interrupt + #endif + timerDetach(TIMER1OUTCOMPAREA_INT); + } + else if(timer == _timer3) { + #if defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) + TIMSK3 &= ~_BV(OCIE3A); // disable the timer3 output compare A interrupt + #else + ETIMSK &= ~_BV(OCIE3A); // disable the timer3 output compare A interrupt + #endif + timerDetach(TIMER3OUTCOMPAREA_INT); + } +#else + //For arduino - in future: call here to a currently undefined function to reset the timer +#endif +} + +static boolean isTimerActive(timer16_Sequence_t timer) +{ + // returns true if any servo is active on this timer + for(uint8_t channel=0; channel < SERVOS_PER_TIMER; channel++) { + if(SERVO(timer,channel).Pin.isActive == true) + return true; + } + return false; +} + + +/****************** end of static functions ******************************/ + +Servo::Servo() +{ + if( ServoCount < MAX_SERVOS) { + this->servoIndex = ServoCount++; // assign a servo index to this instance + servos[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 + } + else + this->servoIndex = INVALID_SERVO ; // too many servos +} + +uint8_t Servo::attach(int pin) +{ + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); +} + +uint8_t Servo::attach(int pin, int min, int max) +{ + if(this->servoIndex < MAX_SERVOS ) { + pinMode( pin, OUTPUT) ; // set servo pin to output + servos[this->servoIndex].Pin.nbr = pin; + // todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128 + this->min = (MIN_PULSE_WIDTH - min)/4; //resolution of min/max is 4 uS + this->max = (MAX_PULSE_WIDTH - max)/4; + // initialize the timer if it has not already been initialized + timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); + if(isTimerActive(timer) == false) + initISR(timer); + servos[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive + } + return this->servoIndex ; +} + +void Servo::detach() +{ + servos[this->servoIndex].Pin.isActive = false; + timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); + if(isTimerActive(timer) == false) { + finISR(timer); + } +} + +void Servo::write(int value) +{ + if(value < MIN_PULSE_WIDTH) + { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + if(value < 0) value = 0; + if(value > 180) value = 180; + value = map(value, 0, 180, SERVO_MIN(), SERVO_MAX()); + } + this->writeMicroseconds(value); +} + +void Servo::writeMicroseconds(int value) +{ + // calculate and store the values for the given channel + byte channel = this->servoIndex; + if( (channel < MAX_SERVOS) ) // ensure channel is valid + { + if( value < SERVO_MIN() ) // ensure pulse width is valid + value = SERVO_MIN(); + else if( value > SERVO_MAX() ) + value = SERVO_MAX(); + + value = value - TRIM_DURATION; + value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009 + + uint8_t oldSREG = SREG; + cli(); + servos[channel].ticks = value; + SREG = oldSREG; + } +} + +int Servo::read() // return the value as degrees +{ + return map( this->readMicroseconds()+1, SERVO_MIN(), SERVO_MAX(), 0, 180); +} + +int Servo::readMicroseconds() +{ + unsigned int pulsewidth; + if( this->servoIndex != INVALID_SERVO ) + pulsewidth = ticksToUs(servos[this->servoIndex].ticks) + TRIM_DURATION ; // 12 aug 2009 + else + pulsewidth = 0; + + return pulsewidth; +} + +bool Servo::attached() +{ + return servos[this->servoIndex].Pin.isActive ; +} diff --git a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp index 64496febb25..c2c23900ebc 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -1,518 +1,518 @@ -/* -SoftwareSerial.cpp (formerly NewSoftSerial.cpp) - -Multi-instance software serial library for Arduino/Wiring --- Interrupt-driven receive and other improvements by ladyada - (http://ladyada.net) --- Tuning, circular buffer, derivation from class Print/Stream, - multi-instance support, porting to 8MHz processors, - various optimizations, PROGMEM delay tables, inverse logic and - direct port writing by Mikal Hart (http://www.arduiniana.org) --- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) --- 20MHz processor support by Garrett Mace (http://www.macetech.com) --- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -The latest version of this library can always be found at -http://arduiniana.org. -*/ - -// When set, _DEBUG co-opts pins 11 and 13 for debugging with an -// oscilloscope or logic analyzer. Beware: it also slightly modifies -// the bit times, so don't rely on it too much at high baud rates -#define _DEBUG 0 -#define _DEBUG_PIN1 11 -#define _DEBUG_PIN2 13 -// -// Includes -// -#include -#include -#include -#include -// -// Lookup table -// -typedef struct _DELAY_TABLE -{ - long baud; - unsigned short rx_delay_centering; - unsigned short rx_delay_intrabit; - unsigned short rx_delay_stopbit; - unsigned short tx_delay; -} DELAY_TABLE; - -#if F_CPU == 16000000 - -static const DELAY_TABLE PROGMEM table[] = -{ - // baud rxcenter rxintra rxstop tx - { 115200, 1, 17, 17, 12, }, - { 57600, 10, 37, 37, 33, }, - { 38400, 25, 57, 57, 54, }, - { 31250, 31, 70, 70, 68, }, - { 28800, 34, 77, 77, 74, }, - { 19200, 54, 117, 117, 114, }, - { 14400, 74, 156, 156, 153, }, - { 9600, 114, 236, 236, 233, }, - { 4800, 233, 474, 474, 471, }, - { 2400, 471, 950, 950, 947, }, - { 1200, 947, 1902, 1902, 1899, }, - { 600, 1902, 3804, 3804, 3800, }, - { 300, 3804, 7617, 7617, 7614, }, -}; - -const int XMIT_START_ADJUSTMENT = 5; - -#elif F_CPU == 8000000 - -static const DELAY_TABLE table[] PROGMEM = -{ - // baud rxcenter rxintra rxstop tx - { 115200, 1, 5, 5, 3, }, - { 57600, 1, 15, 15, 13, }, - { 38400, 2, 25, 26, 23, }, - { 31250, 7, 32, 33, 29, }, - { 28800, 11, 35, 35, 32, }, - { 19200, 20, 55, 55, 52, }, - { 14400, 30, 75, 75, 72, }, - { 9600, 50, 114, 114, 112, }, - { 4800, 110, 233, 233, 230, }, - { 2400, 229, 472, 472, 469, }, - { 1200, 467, 948, 948, 945, }, - { 600, 948, 1895, 1895, 1890, }, - { 300, 1895, 3805, 3805, 3802, }, -}; - -const int XMIT_START_ADJUSTMENT = 4; - -#elif F_CPU == 20000000 - -// 20MHz support courtesy of the good people at macegr.com. -// Thanks, Garrett! - -static const DELAY_TABLE PROGMEM table[] = -{ - // baud rxcenter rxintra rxstop tx - { 115200, 3, 21, 21, 18, }, - { 57600, 20, 43, 43, 41, }, - { 38400, 37, 73, 73, 70, }, - { 31250, 45, 89, 89, 88, }, - { 28800, 46, 98, 98, 95, }, - { 19200, 71, 148, 148, 145, }, - { 14400, 96, 197, 197, 194, }, - { 9600, 146, 297, 297, 294, }, - { 4800, 296, 595, 595, 592, }, - { 2400, 592, 1189, 1189, 1186, }, - { 1200, 1187, 2379, 2379, 2376, }, - { 600, 2379, 4759, 4759, 4755, }, - { 300, 4759, 9523, 9523, 9520, }, -}; - -const int XMIT_START_ADJUSTMENT = 6; - -#else - -#error This version of SoftwareSerial supports only 20, 16 and 8MHz processors - -#endif - -// -// Statics -// -SoftwareSerial *SoftwareSerial::active_object = 0; -char SoftwareSerial::_receive_buffer[_SS_MAX_RX_BUFF]; -volatile uint8_t SoftwareSerial::_receive_buffer_tail = 0; -volatile uint8_t SoftwareSerial::_receive_buffer_head = 0; - -// -// Debugging -// -// This function generates a brief pulse -// for debugging or measuring on an oscilloscope. -inline void DebugPulse(uint8_t pin, uint8_t count) -{ -#if _DEBUG - volatile uint8_t *pport = portOutputRegister(digitalPinToPort(pin)); - - uint8_t val = *pport; - while (count--) - { - *pport = val | digitalPinToBitMask(pin); - *pport = val; - } -#endif -} - -// -// Private methods -// - -/* static */ -inline void SoftwareSerial::tunedDelay(uint16_t delay) { - uint8_t tmp=0; - - asm volatile("sbiw %0, 0x01 \n\t" - "ldi %1, 0xFF \n\t" - "cpi %A0, 0xFF \n\t" - "cpc %B0, %1 \n\t" - "brne .-10 \n\t" - : "+r" (delay), "+a" (tmp) - : "0" (delay) - ); -} - -// This function sets the current object as the "listening" -// one and returns true if it replaces another -bool SoftwareSerial::listen() -{ - if (active_object != this) - { - _buffer_overflow = false; - uint8_t oldSREG = SREG; - cli(); - _receive_buffer_head = _receive_buffer_tail = 0; - active_object = this; - SREG = oldSREG; - return true; - } - - return false; -} - -// -// The receive routine called by the interrupt handler -// -void SoftwareSerial::recv() -{ - -#if GCC_VERSION < 40302 -// Work-around for avr-gcc 4.3.0 OSX version bug -// Preserve the registers that the compiler misses -// (courtesy of Arduino forum user *etracer*) - asm volatile( - "push r18 \n\t" - "push r19 \n\t" - "push r20 \n\t" - "push r21 \n\t" - "push r22 \n\t" - "push r23 \n\t" - "push r26 \n\t" - "push r27 \n\t" - ::); -#endif - - uint8_t d = 0; - - // If RX line is high, then we don't see any start bit - // so interrupt is probably not for us - if (_inverse_logic ? rx_pin_read() : !rx_pin_read()) - { - // Wait approximately 1/2 of a bit width to "center" the sample - tunedDelay(_rx_delay_centering); - DebugPulse(_DEBUG_PIN2, 1); - - // Read each of the 8 bits - for (uint8_t i=0x1; i; i <<= 1) - { - tunedDelay(_rx_delay_intrabit); - DebugPulse(_DEBUG_PIN2, 1); - uint8_t noti = ~i; - if (rx_pin_read()) - d |= i; - else // else clause added to ensure function timing is ~balanced - d &= noti; - } - - // skip the stop bit - tunedDelay(_rx_delay_stopbit); - DebugPulse(_DEBUG_PIN2, 1); - - if (_inverse_logic) - d = ~d; - - // if buffer full, set the overflow flag and return - if ((_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF != _receive_buffer_head) - { - // save new data in buffer: tail points to where byte goes - _receive_buffer[_receive_buffer_tail] = d; // save new byte - _receive_buffer_tail = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF; - } - else - { -#if _DEBUG // for scope: pulse pin as overflow indictator - DebugPulse(_DEBUG_PIN1, 1); -#endif - _buffer_overflow = true; - } - } - -#if GCC_VERSION < 40302 -// Work-around for avr-gcc 4.3.0 OSX version bug -// Restore the registers that the compiler misses - asm volatile( - "pop r27 \n\t" - "pop r26 \n\t" - "pop r23 \n\t" - "pop r22 \n\t" - "pop r21 \n\t" - "pop r20 \n\t" - "pop r19 \n\t" - "pop r18 \n\t" - ::); -#endif -} - -void SoftwareSerial::tx_pin_write(uint8_t pin_state) -{ - if (pin_state == LOW) - *_transmitPortRegister &= ~_transmitBitMask; - else - *_transmitPortRegister |= _transmitBitMask; -} - -uint8_t SoftwareSerial::rx_pin_read() -{ - return *_receivePortRegister & _receiveBitMask; -} - -// -// Interrupt handling -// - -/* static */ -inline void SoftwareSerial::handle_interrupt() -{ - if (active_object) - { - active_object->recv(); - } -} - -#if defined(PCINT0_vect) -ISR(PCINT0_vect) -{ - SoftwareSerial::handle_interrupt(); -} -#endif - -#if defined(PCINT1_vect) -ISR(PCINT1_vect) -{ - SoftwareSerial::handle_interrupt(); -} -#endif - -#if defined(PCINT2_vect) -ISR(PCINT2_vect) -{ - SoftwareSerial::handle_interrupt(); -} -#endif - -#if defined(PCINT3_vect) -ISR(PCINT3_vect) -{ - SoftwareSerial::handle_interrupt(); -} -#endif - -// -// Constructor -// -SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic /* = false */) : - _rx_delay_centering(0), - _rx_delay_intrabit(0), - _rx_delay_stopbit(0), - _tx_delay(0), - _buffer_overflow(false), - _inverse_logic(inverse_logic) -{ - setTX(transmitPin); - setRX(receivePin); -} - -// -// Destructor -// -SoftwareSerial::~SoftwareSerial() -{ - end(); -} - -void SoftwareSerial::setTX(uint8_t tx) -{ - pinMode(tx, OUTPUT); - digitalWrite(tx, HIGH); - _transmitBitMask = digitalPinToBitMask(tx); - uint8_t port = digitalPinToPort(tx); - _transmitPortRegister = portOutputRegister(port); -} - -void SoftwareSerial::setRX(uint8_t rx) -{ - pinMode(rx, INPUT); - if (!_inverse_logic) - digitalWrite(rx, HIGH); // pullup for normal logic! - _receivePin = rx; - _receiveBitMask = digitalPinToBitMask(rx); - uint8_t port = digitalPinToPort(rx); - _receivePortRegister = portInputRegister(port); -} - -// -// Public methods -// - -void SoftwareSerial::begin(long speed) -{ - _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; - - for (unsigned i=0; i +#include +#include +#include +// +// Lookup table +// +typedef struct _DELAY_TABLE +{ + long baud; + unsigned short rx_delay_centering; + unsigned short rx_delay_intrabit; + unsigned short rx_delay_stopbit; + unsigned short tx_delay; +} DELAY_TABLE; + +#if F_CPU == 16000000 + +static const DELAY_TABLE PROGMEM table[] = +{ + // baud rxcenter rxintra rxstop tx + { 115200, 1, 17, 17, 12, }, + { 57600, 10, 37, 37, 33, }, + { 38400, 25, 57, 57, 54, }, + { 31250, 31, 70, 70, 68, }, + { 28800, 34, 77, 77, 74, }, + { 19200, 54, 117, 117, 114, }, + { 14400, 74, 156, 156, 153, }, + { 9600, 114, 236, 236, 233, }, + { 4800, 233, 474, 474, 471, }, + { 2400, 471, 950, 950, 947, }, + { 1200, 947, 1902, 1902, 1899, }, + { 600, 1902, 3804, 3804, 3800, }, + { 300, 3804, 7617, 7617, 7614, }, +}; + +const int XMIT_START_ADJUSTMENT = 5; + +#elif F_CPU == 8000000 + +static const DELAY_TABLE table[] PROGMEM = +{ + // baud rxcenter rxintra rxstop tx + { 115200, 1, 5, 5, 3, }, + { 57600, 1, 15, 15, 13, }, + { 38400, 2, 25, 26, 23, }, + { 31250, 7, 32, 33, 29, }, + { 28800, 11, 35, 35, 32, }, + { 19200, 20, 55, 55, 52, }, + { 14400, 30, 75, 75, 72, }, + { 9600, 50, 114, 114, 112, }, + { 4800, 110, 233, 233, 230, }, + { 2400, 229, 472, 472, 469, }, + { 1200, 467, 948, 948, 945, }, + { 600, 948, 1895, 1895, 1890, }, + { 300, 1895, 3805, 3805, 3802, }, +}; + +const int XMIT_START_ADJUSTMENT = 4; + +#elif F_CPU == 20000000 + +// 20MHz support courtesy of the good people at macegr.com. +// Thanks, Garrett! + +static const DELAY_TABLE PROGMEM table[] = +{ + // baud rxcenter rxintra rxstop tx + { 115200, 3, 21, 21, 18, }, + { 57600, 20, 43, 43, 41, }, + { 38400, 37, 73, 73, 70, }, + { 31250, 45, 89, 89, 88, }, + { 28800, 46, 98, 98, 95, }, + { 19200, 71, 148, 148, 145, }, + { 14400, 96, 197, 197, 194, }, + { 9600, 146, 297, 297, 294, }, + { 4800, 296, 595, 595, 592, }, + { 2400, 592, 1189, 1189, 1186, }, + { 1200, 1187, 2379, 2379, 2376, }, + { 600, 2379, 4759, 4759, 4755, }, + { 300, 4759, 9523, 9523, 9520, }, +}; + +const int XMIT_START_ADJUSTMENT = 6; + +#else + +#error This version of SoftwareSerial supports only 20, 16 and 8MHz processors + +#endif + +// +// Statics +// +SoftwareSerial *SoftwareSerial::active_object = 0; +char SoftwareSerial::_receive_buffer[_SS_MAX_RX_BUFF]; +volatile uint8_t SoftwareSerial::_receive_buffer_tail = 0; +volatile uint8_t SoftwareSerial::_receive_buffer_head = 0; + +// +// Debugging +// +// This function generates a brief pulse +// for debugging or measuring on an oscilloscope. +inline void DebugPulse(uint8_t pin, uint8_t count) +{ +#if _DEBUG + volatile uint8_t *pport = portOutputRegister(digitalPinToPort(pin)); + + uint8_t val = *pport; + while (count--) + { + *pport = val | digitalPinToBitMask(pin); + *pport = val; + } +#endif +} + +// +// Private methods +// + +/* static */ +inline void SoftwareSerial::tunedDelay(uint16_t delay) { + uint8_t tmp=0; + + asm volatile("sbiw %0, 0x01 \n\t" + "ldi %1, 0xFF \n\t" + "cpi %A0, 0xFF \n\t" + "cpc %B0, %1 \n\t" + "brne .-10 \n\t" + : "+r" (delay), "+a" (tmp) + : "0" (delay) + ); +} + +// This function sets the current object as the "listening" +// one and returns true if it replaces another +bool SoftwareSerial::listen() +{ + if (active_object != this) + { + _buffer_overflow = false; + uint8_t oldSREG = SREG; + cli(); + _receive_buffer_head = _receive_buffer_tail = 0; + active_object = this; + SREG = oldSREG; + return true; + } + + return false; +} + +// +// The receive routine called by the interrupt handler +// +void SoftwareSerial::recv() +{ + +#if GCC_VERSION < 40302 +// Work-around for avr-gcc 4.3.0 OSX version bug +// Preserve the registers that the compiler misses +// (courtesy of Arduino forum user *etracer*) + asm volatile( + "push r18 \n\t" + "push r19 \n\t" + "push r20 \n\t" + "push r21 \n\t" + "push r22 \n\t" + "push r23 \n\t" + "push r26 \n\t" + "push r27 \n\t" + ::); +#endif + + uint8_t d = 0; + + // If RX line is high, then we don't see any start bit + // so interrupt is probably not for us + if (_inverse_logic ? rx_pin_read() : !rx_pin_read()) + { + // Wait approximately 1/2 of a bit width to "center" the sample + tunedDelay(_rx_delay_centering); + DebugPulse(_DEBUG_PIN2, 1); + + // Read each of the 8 bits + for (uint8_t i=0x1; i; i <<= 1) + { + tunedDelay(_rx_delay_intrabit); + DebugPulse(_DEBUG_PIN2, 1); + uint8_t noti = ~i; + if (rx_pin_read()) + d |= i; + else // else clause added to ensure function timing is ~balanced + d &= noti; + } + + // skip the stop bit + tunedDelay(_rx_delay_stopbit); + DebugPulse(_DEBUG_PIN2, 1); + + if (_inverse_logic) + d = ~d; + + // if buffer full, set the overflow flag and return + if ((_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF != _receive_buffer_head) + { + // save new data in buffer: tail points to where byte goes + _receive_buffer[_receive_buffer_tail] = d; // save new byte + _receive_buffer_tail = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF; + } + else + { +#if _DEBUG // for scope: pulse pin as overflow indictator + DebugPulse(_DEBUG_PIN1, 1); +#endif + _buffer_overflow = true; + } + } + +#if GCC_VERSION < 40302 +// Work-around for avr-gcc 4.3.0 OSX version bug +// Restore the registers that the compiler misses + asm volatile( + "pop r27 \n\t" + "pop r26 \n\t" + "pop r23 \n\t" + "pop r22 \n\t" + "pop r21 \n\t" + "pop r20 \n\t" + "pop r19 \n\t" + "pop r18 \n\t" + ::); +#endif +} + +void SoftwareSerial::tx_pin_write(uint8_t pin_state) +{ + if (pin_state == LOW) + *_transmitPortRegister &= ~_transmitBitMask; + else + *_transmitPortRegister |= _transmitBitMask; +} + +uint8_t SoftwareSerial::rx_pin_read() +{ + return *_receivePortRegister & _receiveBitMask; +} + +// +// Interrupt handling +// + +/* static */ +inline void SoftwareSerial::handle_interrupt() +{ + if (active_object) + { + active_object->recv(); + } +} + +#if defined(PCINT0_vect) +ISR(PCINT0_vect) +{ + SoftwareSerial::handle_interrupt(); +} +#endif + +#if defined(PCINT1_vect) +ISR(PCINT1_vect) +{ + SoftwareSerial::handle_interrupt(); +} +#endif + +#if defined(PCINT2_vect) +ISR(PCINT2_vect) +{ + SoftwareSerial::handle_interrupt(); +} +#endif + +#if defined(PCINT3_vect) +ISR(PCINT3_vect) +{ + SoftwareSerial::handle_interrupt(); +} +#endif + +// +// Constructor +// +SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic /* = false */) : + _rx_delay_centering(0), + _rx_delay_intrabit(0), + _rx_delay_stopbit(0), + _tx_delay(0), + _buffer_overflow(false), + _inverse_logic(inverse_logic) +{ + setTX(transmitPin); + setRX(receivePin); +} + +// +// Destructor +// +SoftwareSerial::~SoftwareSerial() +{ + end(); +} + +void SoftwareSerial::setTX(uint8_t tx) +{ + pinMode(tx, OUTPUT); + digitalWrite(tx, HIGH); + _transmitBitMask = digitalPinToBitMask(tx); + uint8_t port = digitalPinToPort(tx); + _transmitPortRegister = portOutputRegister(port); +} + +void SoftwareSerial::setRX(uint8_t rx) +{ + pinMode(rx, INPUT); + if (!_inverse_logic) + digitalWrite(rx, HIGH); // pullup for normal logic! + _receivePin = rx; + _receiveBitMask = digitalPinToBitMask(rx); + uint8_t port = digitalPinToPort(rx); + _receivePortRegister = portInputRegister(port); +} + +// +// Public methods +// + +void SoftwareSerial::begin(long speed) +{ + _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; + + for (unsigned i=0; i -#include - -/****************************************************************************** -* Definitions -******************************************************************************/ - -#define _SS_MAX_RX_BUFF 64 // RX buffer size -#ifndef GCC_VERSION -#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) -#endif - -class SoftwareSerial : public Stream -{ -private: - // per object data - uint8_t _receivePin; - uint8_t _receiveBitMask; - volatile uint8_t *_receivePortRegister; - uint8_t _transmitBitMask; - volatile uint8_t *_transmitPortRegister; - - uint16_t _rx_delay_centering; - uint16_t _rx_delay_intrabit; - uint16_t _rx_delay_stopbit; - uint16_t _tx_delay; - - uint16_t _buffer_overflow:1; - uint16_t _inverse_logic:1; - - // static data - static char _receive_buffer[_SS_MAX_RX_BUFF]; - static volatile uint8_t _receive_buffer_tail; - static volatile uint8_t _receive_buffer_head; - static SoftwareSerial *active_object; - - // private methods - void recv(); - uint8_t rx_pin_read(); - void tx_pin_write(uint8_t pin_state); - void setTX(uint8_t transmitPin); - void setRX(uint8_t receivePin); - - // private static method for timing - static inline void tunedDelay(uint16_t delay); - -public: - // public methods - SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false); - ~SoftwareSerial(); - void begin(long speed); - bool listen(); - void end(); - bool isListening() { return this == active_object; } - bool overflow() { bool ret = _buffer_overflow; _buffer_overflow = false; return ret; } - int peek(); - - virtual size_t write(uint8_t byte); - virtual int read(); - virtual int available(); - virtual void flush(); - - using Print::write; - - // public only for easy access by interrupt handlers - static inline void handle_interrupt(); -}; - -// Arduino 0012 workaround -#undef int -#undef char -#undef long -#undef byte -#undef float -#undef abs -#undef round - -#endif +/* +SoftwareSerial.h (formerly NewSoftSerial.h) - +Multi-instance software serial library for Arduino/Wiring +-- Interrupt-driven receive and other improvements by ladyada + (http://ladyada.net) +-- Tuning, circular buffer, derivation from class Print/Stream, + multi-instance support, porting to 8MHz processors, + various optimizations, PROGMEM delay tables, inverse logic and + direct port writing by Mikal Hart (http://www.arduiniana.org) +-- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) +-- 20MHz processor support by Garrett Mace (http://www.macetech.com) +-- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The latest version of this library can always be found at +http://arduiniana.org. +*/ + +#ifndef SoftwareSerial_h +#define SoftwareSerial_h + +#include +#include + +/****************************************************************************** +* Definitions +******************************************************************************/ + +#define _SS_MAX_RX_BUFF 64 // RX buffer size +#ifndef GCC_VERSION +#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#endif + +class SoftwareSerial : public Stream +{ +private: + // per object data + uint8_t _receivePin; + uint8_t _receiveBitMask; + volatile uint8_t *_receivePortRegister; + uint8_t _transmitBitMask; + volatile uint8_t *_transmitPortRegister; + + uint16_t _rx_delay_centering; + uint16_t _rx_delay_intrabit; + uint16_t _rx_delay_stopbit; + uint16_t _tx_delay; + + uint16_t _buffer_overflow:1; + uint16_t _inverse_logic:1; + + // static data + static char _receive_buffer[_SS_MAX_RX_BUFF]; + static volatile uint8_t _receive_buffer_tail; + static volatile uint8_t _receive_buffer_head; + static SoftwareSerial *active_object; + + // private methods + void recv(); + uint8_t rx_pin_read(); + void tx_pin_write(uint8_t pin_state); + void setTX(uint8_t transmitPin); + void setRX(uint8_t receivePin); + + // private static method for timing + static inline void tunedDelay(uint16_t delay); + +public: + // public methods + SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false); + ~SoftwareSerial(); + void begin(long speed); + bool listen(); + void end(); + bool isListening() { return this == active_object; } + bool overflow() { bool ret = _buffer_overflow; _buffer_overflow = false; return ret; } + int peek(); + + virtual size_t write(uint8_t byte); + virtual int read(); + virtual int available(); + virtual void flush(); + + using Print::write; + + // public only for easy access by interrupt handlers + static inline void handle_interrupt(); +}; + +// Arduino 0012 workaround +#undef int +#undef char +#undef long +#undef byte +#undef float +#undef abs +#undef round + +#endif diff --git a/hardware/arduino/avr/libraries/TFT/utility/Adafruit_ST7735.cpp b/hardware/arduino/avr/libraries/TFT/utility/Adafruit_ST7735.cpp old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/libraries/TFT/utility/Adafruit_ST7735.h b/hardware/arduino/avr/libraries/TFT/utility/Adafruit_ST7735.h old mode 100755 new mode 100644 diff --git a/hardware/arduino/avr/libraries/WiFi/utility/server_drv.cpp b/hardware/arduino/avr/libraries/WiFi/utility/server_drv.cpp index 4a6d2932ba5..eed31a98c81 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/server_drv.cpp +++ b/hardware/arduino/avr/libraries/WiFi/utility/server_drv.cpp @@ -12,14 +12,14 @@ extern "C" { // Start server TCP on port specified -void ServerDrv::startServer(uint16_t port, uint8_t sock, uint8_t protMode) +void ServerDrv::startServer(uint16_t port, uint8_t sock, uint8_t protMode) { WAIT_FOR_SLAVE_SELECT(); // Send Command - SpiDrv::sendCmd(START_SERVER_TCP_CMD, PARAM_NUMS_3); + SpiDrv::sendCmd(START_SERVER_TCP_CMD, PARAM_NUMS_3); SpiDrv::sendParam(port); - SpiDrv::sendParam(&sock, 1); - SpiDrv::sendParam(&protMode, 1, LAST_PARAM); + SpiDrv::sendParam(&sock, 1); + SpiDrv::sendParam(&protMode, 1, LAST_PARAM); //Wait the reply elaboration SpiDrv::waitForSlaveReady(); @@ -35,15 +35,15 @@ void ServerDrv::startServer(uint16_t port, uint8_t sock, uint8_t protMode) } // Start server TCP on port specified -void ServerDrv::startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode) +void ServerDrv::startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode) { WAIT_FOR_SLAVE_SELECT(); // Send Command - SpiDrv::sendCmd(START_CLIENT_TCP_CMD, PARAM_NUMS_4); + SpiDrv::sendCmd(START_CLIENT_TCP_CMD, PARAM_NUMS_4); SpiDrv::sendParam((uint8_t*)&ipAddress, sizeof(ipAddress)); SpiDrv::sendParam(port); - SpiDrv::sendParam(&sock, 1); - SpiDrv::sendParam(&protMode, 1, LAST_PARAM); + SpiDrv::sendParam(&sock, 1); + SpiDrv::sendParam(&protMode, 1, LAST_PARAM); //Wait the reply elaboration SpiDrv::waitForSlaveReady(); @@ -193,57 +193,57 @@ bool ServerDrv::getDataBuf(uint8_t sock, uint8_t *_data, uint16_t *_dataLen) return false; } -bool ServerDrv::insertDataBuf(uint8_t sock, const uint8_t *data, uint16_t _len) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(INSERT_DATABUF_CMD, PARAM_NUMS_2); - SpiDrv::sendBuffer(&sock, sizeof(sock)); - SpiDrv::sendBuffer((uint8_t *)data, _len, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseData8(INSERT_DATABUF_CMD, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - if (_dataLen!=0) - { - return (_data == 1); - } - return false; -} - -bool ServerDrv::sendUdpData(uint8_t sock) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(SEND_DATA_UDP_CMD, PARAM_NUMS_1); - SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseData8(SEND_DATA_UDP_CMD, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - if (_dataLen!=0) - { - return (_data == 1); - } - return false; -} - +bool ServerDrv::insertDataBuf(uint8_t sock, const uint8_t *data, uint16_t _len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(INSERT_DATABUF_CMD, PARAM_NUMS_2); + SpiDrv::sendBuffer(&sock, sizeof(sock)); + SpiDrv::sendBuffer((uint8_t *)data, _len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseData8(INSERT_DATABUF_CMD, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + if (_dataLen!=0) + { + return (_data == 1); + } + return false; +} + +bool ServerDrv::sendUdpData(uint8_t sock) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SEND_DATA_UDP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseData8(SEND_DATA_UDP_CMD, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + if (_dataLen!=0) + { + return (_data == 1); + } + return false; +} + bool ServerDrv::sendData(uint8_t sock, const uint8_t *data, uint16_t len) { diff --git a/hardware/arduino/avr/libraries/WiFi/utility/server_drv.h b/hardware/arduino/avr/libraries/WiFi/utility/server_drv.h index 50ba7e3969e..989e6920260 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/server_drv.h +++ b/hardware/arduino/avr/libraries/WiFi/utility/server_drv.h @@ -4,16 +4,16 @@ #include #include "wifi_spi.h" -typedef enum eProtMode {TCP_MODE, UDP_MODE}tProtMode; - +typedef enum eProtMode {TCP_MODE, UDP_MODE}tProtMode; + class ServerDrv { public: - + // Start server TCP on port specified - static void startServer(uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); + static void startServer(uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); - static void startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); + static void startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); static void stopClient(uint8_t sock); @@ -25,12 +25,12 @@ class ServerDrv static bool getDataBuf(uint8_t sock, uint8_t *data, uint16_t *len); - static bool insertDataBuf(uint8_t sock, const uint8_t *_data, uint16_t _dataLen); - + static bool insertDataBuf(uint8_t sock, const uint8_t *_data, uint16_t _dataLen); + static bool sendData(uint8_t sock, const uint8_t *data, uint16_t len); - static bool sendUdpData(uint8_t sock); - + static bool sendUdpData(uint8_t sock); + static uint16_t availData(uint8_t sock); static uint8_t checkDataSent(uint8_t sock); diff --git a/hardware/arduino/avr/libraries/WiFi/utility/socket.c b/hardware/arduino/avr/libraries/WiFi/utility/socket.c index 665073b04de..0eddd4abed2 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/socket.c +++ b/hardware/arduino/avr/libraries/WiFi/utility/socket.c @@ -1,20 +1,20 @@ -/* -* -@file socket.c -@brief define function of socket API -* -*/ -#include -#include "socket.h" - -SOCKET socket(uint8 protocol) {return 0;} // Opens a socket(TCP or UDP or IP_RAW mode) -void close(SOCKET s) {} // Close socket -uint8 connect(SOCKET s, uint8 * addr, uint16 port) {return 0;} // Establish TCP connection (Active connection) -void disconnect(SOCKET s) {} // disconnect the connection -uint8 listen(SOCKET s) { return 0;} // Establish TCP connection (Passive connection) -uint16 send(SOCKET s, const uint8 * buf, uint16 len) { return 0;} // Send data (TCP) -uint16 recv(SOCKET s, uint8 * buf, uint16 len) {return 0;} // Receive data (TCP) -uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port) {return 0;} // Send data (UDP/IP RAW) -uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port) {return 0;} // Receive data (UDP/IP RAW) - -uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len) {return 0;} +/* +* +@file socket.c +@brief define function of socket API +* +*/ +#include +#include "socket.h" + +SOCKET socket(uint8 protocol) {return 0;} // Opens a socket(TCP or UDP or IP_RAW mode) +void close(SOCKET s) {} // Close socket +uint8 connect(SOCKET s, uint8 * addr, uint16 port) {return 0;} // Establish TCP connection (Active connection) +void disconnect(SOCKET s) {} // disconnect the connection +uint8 listen(SOCKET s) { return 0;} // Establish TCP connection (Passive connection) +uint16 send(SOCKET s, const uint8 * buf, uint16 len) { return 0;} // Send data (TCP) +uint16 recv(SOCKET s, uint8 * buf, uint16 len) {return 0;} // Receive data (TCP) +uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port) {return 0;} // Send data (UDP/IP RAW) +uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port) {return 0;} // Receive data (UDP/IP RAW) + +uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len) {return 0;} diff --git a/hardware/arduino/avr/libraries/WiFi/utility/socket.h b/hardware/arduino/avr/libraries/WiFi/utility/socket.h index 9b06d00d155..8e7f6b6ac50 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/socket.h +++ b/hardware/arduino/avr/libraries/WiFi/utility/socket.h @@ -1,87 +1,87 @@ -/* -* -@file socket.h -@brief define function of socket API -* -*/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -#define TCP_SOCKET 1 -#define UDP_SOCKET 2 -#define RAW_SOCKET 3 - -#define SOCK_NOT_AVAIL 255 - -#include "wl_definitions.h" -/** - * The 8-bit signed data type. - */ -typedef char int8; -/** - * The volatile 8-bit signed data type. - */ -typedef volatile char vint8; -/** - * The 8-bit unsigned data type. - */ -typedef unsigned char uint8; -/** - * The volatile 8-bit unsigned data type. - */ -typedef volatile unsigned char vuint8; - -/** - * The 16-bit signed data type. - */ -typedef int int16; -/** - * The volatile 16-bit signed data type. - */ -typedef volatile int vint16; -/** - * The 16-bit unsigned data type. - */ -typedef unsigned int uint16; -/** - * The volatile 16-bit unsigned data type. - */ -typedef volatile unsigned int vuint16; -/** - * The 32-bit signed data type. - */ -typedef long int32; -/** - * The volatile 32-bit signed data type. - */ -typedef volatile long vint32; -/** - * The 32-bit unsigned data type. - */ -typedef unsigned long uint32; -/** - * The volatile 32-bit unsigned data type. - */ -typedef volatile unsigned long vuint32; - -/* bsd */ -typedef uint8 u_char; /**< 8-bit value */ -typedef uint16_t SOCKET; -typedef uint16 u_short; /**< 16-bit value */ -typedef uint16 u_int; /**< 16-bit value */ -typedef uint32 u_long; /**< 32-bit value */ - -extern SOCKET socket(uint8 protocol); // Opens a socket(TCP or UDP or IP_RAW mode) -extern void close(SOCKET s); // Close socket -extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) -extern void disconnect(SOCKET s); // disconnect the connection -extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) -extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) -extern uint16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) -extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) -extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) - -extern uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len); -#endif -/* _SOCKET_H_ */ +/* +* +@file socket.h +@brief define function of socket API +* +*/ + +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +#define TCP_SOCKET 1 +#define UDP_SOCKET 2 +#define RAW_SOCKET 3 + +#define SOCK_NOT_AVAIL 255 + +#include "wl_definitions.h" +/** + * The 8-bit signed data type. + */ +typedef char int8; +/** + * The volatile 8-bit signed data type. + */ +typedef volatile char vint8; +/** + * The 8-bit unsigned data type. + */ +typedef unsigned char uint8; +/** + * The volatile 8-bit unsigned data type. + */ +typedef volatile unsigned char vuint8; + +/** + * The 16-bit signed data type. + */ +typedef int int16; +/** + * The volatile 16-bit signed data type. + */ +typedef volatile int vint16; +/** + * The 16-bit unsigned data type. + */ +typedef unsigned int uint16; +/** + * The volatile 16-bit unsigned data type. + */ +typedef volatile unsigned int vuint16; +/** + * The 32-bit signed data type. + */ +typedef long int32; +/** + * The volatile 32-bit signed data type. + */ +typedef volatile long vint32; +/** + * The 32-bit unsigned data type. + */ +typedef unsigned long uint32; +/** + * The volatile 32-bit unsigned data type. + */ +typedef volatile unsigned long vuint32; + +/* bsd */ +typedef uint8 u_char; /**< 8-bit value */ +typedef uint16_t SOCKET; +typedef uint16 u_short; /**< 16-bit value */ +typedef uint16 u_int; /**< 16-bit value */ +typedef uint32 u_long; /**< 32-bit value */ + +extern SOCKET socket(uint8 protocol); // Opens a socket(TCP or UDP or IP_RAW mode) +extern void close(SOCKET s); // Close socket +extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) +extern void disconnect(SOCKET s); // disconnect the connection +extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) +extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) +extern uint16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) +extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) +extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) + +extern uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len); +#endif +/* _SOCKET_H_ */ diff --git a/hardware/arduino/avr/libraries/WiFi/utility/spi_drv.h b/hardware/arduino/avr/libraries/WiFi/utility/spi_drv.h index b7e4cb72efb..24b9344aa3b 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/spi_drv.h +++ b/hardware/arduino/avr/libraries/WiFi/utility/spi_drv.h @@ -4,7 +4,7 @@ #include #include "wifi_spi.h" -#define SPI_START_CMD_DELAY 10 +#define SPI_START_CMD_DELAY 10 #define NO_LAST_PARAM 0 #define LAST_PARAM 1 diff --git a/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.cpp b/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.cpp index ccd5f254ffd..6fb745aa71a 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.cpp +++ b/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.cpp @@ -53,26 +53,26 @@ void WiFiDrv::getNetworkData(uint8_t *ip, uint8_t *mask, uint8_t *gwip) SpiDrv::spiSlaveDeselect(); } -void WiFiDrv::getRemoteData(uint8_t sock, uint8_t *ip, uint8_t *port) -{ - tParam params[PARAM_NUMS_2] = { {0, (char*)ip}, {0, (char*)port} }; - - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_REMOTE_DATA_CMD, PARAM_NUMS_1); - SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - SpiDrv::waitResponseParams(GET_REMOTE_DATA_CMD, PARAM_NUMS_2, params); - - SpiDrv::spiSlaveDeselect(); -} - - +void WiFiDrv::getRemoteData(uint8_t sock, uint8_t *ip, uint8_t *port) +{ + tParam params[PARAM_NUMS_2] = { {0, (char*)ip}, {0, (char*)port} }; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_REMOTE_DATA_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + SpiDrv::waitResponseParams(GET_REMOTE_DATA_CMD, PARAM_NUMS_2, params); + + SpiDrv::spiSlaveDeselect(); +} + + // Public Methods diff --git a/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.h b/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.h index d6ec029ded9..e59516ff9a1 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.h +++ b/hardware/arduino/avr/libraries/WiFi/utility/wifi_drv.h @@ -4,7 +4,7 @@ #include #include "wifi_spi.h" #include "IPAddress.h" -#include "../WiFiUdp.h" +#include "../WiFiUdp.h" // Key index length #define KEY_IDX_LEN 1 @@ -41,11 +41,11 @@ class WiFiDrv static int getHostByName(IPAddress& aResult); - /* - * Get remote Data information on UDP socket - */ - static void getRemoteData(uint8_t sock, uint8_t *ip, uint8_t *port); - + /* + * Get remote Data information on UDP socket + */ + static void getRemoteData(uint8_t sock, uint8_t *ip, uint8_t *port); + public: /* @@ -239,8 +239,8 @@ class WiFiDrv */ static char* getFwVersion(); - friend class WiFiUDP; - + friend class WiFiUDP; + }; extern WiFiDrv wiFiDrv; diff --git a/hardware/arduino/avr/libraries/WiFi/utility/wifi_spi.h b/hardware/arduino/avr/libraries/WiFi/utility/wifi_spi.h index 8856e33e93f..eb1ad2bd9d1 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/wifi_spi.h +++ b/hardware/arduino/avr/libraries/WiFi/utility/wifi_spi.h @@ -56,7 +56,7 @@ enum { GET_FW_VERSION_CMD = 0x37, GET_TEST_CMD = 0x38, SEND_DATA_UDP_CMD = 0x39, - GET_REMOTE_DATA_CMD = 0x3A, + GET_REMOTE_DATA_CMD = 0x3A, // All command with DATA_FLAG 0x40 send a 16bit Len diff --git a/hardware/arduino/avr/libraries/WiFi/utility/wl_types.h b/hardware/arduino/avr/libraries/WiFi/utility/wl_types.h index 82b309d7f96..5eed7eeb9ea 100644 --- a/hardware/arduino/avr/libraries/WiFi/utility/wl_types.h +++ b/hardware/arduino/avr/libraries/WiFi/utility/wl_types.h @@ -1,31 +1,31 @@ -/* - * wl_types.h - * - * Created on: Jul 30, 2010 - * Author: dlafauci - */ - - -#ifndef _WL_TYPES_H_ -#define _WL_TYPES_H_ - -#include - -typedef enum { - WL_FAILURE = -1, - WL_SUCCESS = 1, -} wl_error_code_t; - -/* Authentication modes */ -enum wl_auth_mode { - AUTH_MODE_INVALID, - AUTH_MODE_AUTO, - AUTH_MODE_OPEN_SYSTEM, - AUTH_MODE_SHARED_KEY, - AUTH_MODE_WPA, - AUTH_MODE_WPA2, - AUTH_MODE_WPA_PSK, - AUTH_MODE_WPA2_PSK -}; - -#endif //_WL_TYPES_H_ +/* + * wl_types.h + * + * Created on: Jul 30, 2010 + * Author: dlafauci + */ + + +#ifndef _WL_TYPES_H_ +#define _WL_TYPES_H_ + +#include + +typedef enum { + WL_FAILURE = -1, + WL_SUCCESS = 1, +} wl_error_code_t; + +/* Authentication modes */ +enum wl_auth_mode { + AUTH_MODE_INVALID, + AUTH_MODE_AUTO, + AUTH_MODE_OPEN_SYSTEM, + AUTH_MODE_SHARED_KEY, + AUTH_MODE_WPA, + AUTH_MODE_WPA2, + AUTH_MODE_WPA_PSK, + AUTH_MODE_WPA2_PSK +}; + +#endif //_WL_TYPES_H_ diff --git a/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2012-11-05.hex b/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2012-11-05.hex index 2c219ff7c84..0364b749ef7 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2012-11-05.hex +++ b/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2012-11-05.hex @@ -1,274 +1,274 @@ -:10000000A7C00000C0C00000BEC00000BCC000000F -:10001000BAC00000B8C00000B6C00000B4C0000004 -:10002000B2C00000B0C00000AEC00000CBC40000F1 -:100030008FC40000A8C00000A6C00000A4C000003B -:10004000A2C00000A0C000009EC000009CC0000034 -:100050009AC0000098C0000096C0000021C10000B6 -:1000600092C0000090C000008EC000008CC0000054 -:100070008AC0000088C0000086C0000084C0000064 -:1000800082C0000080C000007EC000007CC0000074 -:100090007AC0000078C000001201100102000008C0 -:1000A00041233D0001000102DC0109023E00020182 -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:100120002E03410072006400750069006E006F00CC -:1001300020004400750065002000500072006F0030 -:1001400067002E00200050006F0072007400000055 -:1001500011241FBECFEFD2E0DEBFCDBF11E0A0E083 -:10016000B1E0E8EEF0E102C005900D92A831B107D0 -:10017000D9F712E0A8E1B1E001C01D92A833B107A0 -:10018000E1F722D1AFC73CCF9C01DC01AE57BF4F96 -:10019000ED91FC91119741911196FC93EE9380584B -:1001A0009F4FE817F90711F42D933C939FB7F894EC -:1001B000F901EC57FF4F8081815080839FBF842FCE -:1001C0000895882311F03F9A01C03F9847980895F9 -:1001D000882311F046980895469A0895DF92EF9289 -:1001E000FF920F931F93FC018489813019F08230B4 -:1001F00019F404C010E303C010E001C010E28389C9 -:10020000823009F418608589873031F0883031F008 -:10021000863029F4126003C0146001C01660109289 -:10022000C9001092C8001092CA000785F088E188C2 -:10023000D288202F3F2D4E2D5D2D10921E01203B88 -:1002400084E0380780E0480780E0580719F481E02F -:1002500080931E01CA01B90122E030E040E050E085 -:1002600026D720583B47414E5F4FCA01B901202F86 -:100270003F2D4E2D5D2DF9D6215030403093CD00CD -:100280002093CC001093CA0082E08093C80088E9D4 -:100290008093C9001F910F91FF90EF90DF90089518 -:1002A0001F920F920FB60F9211242F938F939F934B -:1002B000EF93FF939091CE008EB38430F1F4E091F0 -:1002C000A201F091A3019083E091A201F091A3011A -:1002D000CF0101969093A3018093A201825A91408D -:1002E00021F482E291E0928381839FB7F894809118 -:1002F000A6018F5F8093A6019FBFFF91EF919F9111 -:100300008F912F910F900FBE0F901F901895FC01A9 -:1003100040911A0140931B0180911C0180931D01A3 -:100320008585282F30E02170307020931A01858553 -:1003300090E096958795817080931C0180911E01B5 -:10034000882339F08FE590E090931901809318018C -:100350000895442341F4222331F08EE190E09093FC -:10036000190180931801089580E091E014C680E09F -:1003700091E0C7C51F9384B7877F84BF18E10FB68C -:10038000F89410936000109260000FBE80E019DFB7 -:10039000469A3E9A87E690E09093CD008093CC00F9 -:1003A00086E08093CA001092C8001093C900539A47 -:1003B0005A9A8AB180638AB98BB180638BB9BDD2F6 -:1003C00084E085BD1F9108950F931F93CF93DF9312 -:1003D000D1DF2FB7F89487EA91E0909328028093B9 -:1003E000270290932A02809329022FBF2FB7F894F7 -:1003F00082E291E09093A3018093A2019093A501E2 -:100400008093A4012FBF7894C7EAD1E003E08FB7AF -:10041000F89490912B028FBF903809F180E091E021 -:10042000E6D497FD1CC0E0912702F091280280835A -:10043000E0912702F0912802CF01019690932802C3 -:10044000809327028752924011F4D283C1839FB7D1 -:10045000F89480912B028F5F80932B029FBF8FB700 -:10046000F8941091A6018FBFA89903C0113608F423 -:1004700069C0A89A8091A601882361F05D980093D5 -:100480001F0108C082E291E07FDE682F80E091E0EA -:1004900014D511501123B1F780911F01882351F019 -:1004A00080911F01815080931F0180911F0188233B -:1004B00009F45D9A80912001882351F080912001F8 -:1004C00081508093200180912001882309F45C9A57 -:1004D0008091180190911901181619067CF58F3535 -:1004E000910521F481E074DE80E06BDE80911801DB -:1004F00090911901839721F480E06ADE80E061DE4B -:100500008091180190911901499721F480E060DEF3 -:1005100081E057DE8091180190911901019721F433 -:1005200080E056DE80E04DDE809118019091190147 -:100530000197909319018093180104C080E048DE70 -:1005400080E03FDE8FB7F89490912B028FBF992304 -:1005500069F087EA91E018DE982F8091C80085FF46 -:10056000FCCF9093CE005C980093200180E091E056 -:1005700095D42AD44CCFDA01923049F0933061F00F -:100580009130F9F4E8E9F0E022E130E01EC0EAEA57 -:10059000F0E02EE330E019C0813049F0813018F0EE -:1005A000823079F408C0E8EEF0E0849107C0ECEE08 -:1005B000F0E0849103C0E0E2F1E08491282F30E084 -:1005C00004C0E0E0F0E020E030E0ED93FC93C901EE -:1005D000089528E030E040E003C04F5F220F331F52 -:1005E00028173907D0F3842F8295807F0895809350 -:1005F000E9008091EB0081608093EB001092ED00A8 -:100600006093EC004093ED008091EE00881F8827F6 -:10061000881F08951092F40090E09093E9001092E2 -:10062000F0001092E8001092ED008091EB008E7FB8 -:100630008093EB009F5F953081F7089580913002A1 -:1006400088238CF403C08EB38823B1F08091E80036 -:1006500082FFF9CF8091E8008B778093E8000895BE -:100660008EB3882349F08091E80080FFF9CF809114 -:10067000E8008E778093E800089594E68091EC007E -:1006800080FF05C08091E80080FF05C023C08091F5 -:10069000E80082FD1FC08EB3882311F482E0089524 -:1006A0008EB3853011F483E008958091EB0085FFCF -:1006B00002C081E008958091E10082FFDFCF809148 -:1006C000E1008B7F8093E100992311F484E0089589 -:1006D0009150D4CF80E008959C0140913602509112 -:1006E00037024617570718F4F90120E038C06115A2 -:1006F000710511F0AB01F8CF8091E8008E778093FF -:10070000E80040E050E0F0CF8091E80083FF02C0B5 -:1007100081E008958091E80082FD2DC08EB388238A -:1007200081F18EB3853079F18091E80080FF17C0A8 -:100730009091F20006C081918093F10041505040A9 -:100740009F5F4115510511F09830A8F320E09830D3 -:1007500009F421E08091E8008E778093E80041154C -:10076000510591F6222381F606C08EB3882349F005 -:100770008EB3853041F08091E80082FFF6CF80E0B3 -:10078000089582E0089583E008959C014091360227 -:10079000509137024617570710F490E03BC061159F -:1007A000710511F0AB01F9CF8091E8008E7780934D -:1007B000E80040E050E0F1CF8091E80083FF02C004 -:1007C00081E008958091E80082FD30C08EB38823D7 -:1007D00099F18EB3853091F18091E80080FF1AC0C5 -:1007E0008091F20009C0F9012F5F3F4FE491E0933F -:1007F000F100415050408F5F4115510511F0883094 -:1008000090F390E0883009F491E08091E8008E77D1 -:100810008093E8004115510579F6992369F606C0E1 -:100820008EB3882349F08EB3853041F08091E80083 -:1008300082FFF6CF80E0089582E0089583E0089576 -:100840009C016115710529F48091E8008B778093F4 -:10085000E800F90120C08091E80083FF02C081E038 -:1008600008958EB3882339F18EB3853031F18091AC -:10087000E80082FFF0CF06C08091F10081936150C3 -:10088000704021F08091F2008823B1F78091E80058 -:100890008B778093E80061157105E9F606C08EB389 -:1008A000882349F08EB3853041F08091E80080FFC5 -:1008B000F6CF80E0089582E0089583E0089542D065 -:1008C00044D01EBA10922E0210922D0210922C02C9 -:1008D00084E089BD89B5826089BD09B400FEFDCF81 -:1008E0008091D800982F9F779093D800806880934C -:1008F000D800809163008E7F809363008091D80040 -:100900008F7D8093D8008091E0008E7F8093E000FF -:100910008091E1008E7F8093E1008091E200816010 -:100920008093E2008091E100877F8093E1008091D5 -:10093000E20088608093E2000895C1DF81E0809347 -:100940002F0208951092E20008951092E100089598 -:100950001F920F920FB60F9211241F932F933F9364 -:100960004F935F936F937F938F939F93AF93BF93B7 -:10097000EF93FF93E9EEF0E0108117701082E0EF43 -:10098000F0E08081877F80837894C3D0F894A9EECB -:10099000B0E01C92E0EFF0E08081886080831C93DF -:1009A000FF91EF91BF91AF919F918F917F916F9147 -:1009B0005F914F913F912F911F910F900FBE0F901C -:1009C0001F9018951F920F920FB60F9211242F931C -:1009D0003F934F935F936F937F938F939F93AF93C7 -:1009E000BF93EF93FF938091E10080FF1BC0809144 -:1009F000E20080FF17C08091E1008E7F8093E100CC -:100A00008091E2008E7F8093E2008091E20080611D -:100A10008093E2008091D80080628093D80019BC56 -:100A20001EBAD1D18091E10084FF29C08091E200FB -:100A300084FF25C084E089BD89B5826089BD09B481 -:100A400000FEFDCF8091D8008F7D8093D8008091EB -:100A5000E1008F7E8093E1008091E2008F7E8093A1 -:100A6000E2008091E20081608093E20080912E029A -:100A7000882311F481E001C084E08EBBA4D1809171 -:100A8000E10083FF27C08091E20083FF23C08091B3 -:100A9000E100877F8093E10082E08EBB10922E02FE -:100AA0008091E1008E7F8093E1008091E2008E7F53 -:100AB0008093E2008091E20080618093E200AADDF1 -:100AC00080E060E042E093DD8091F00088608093F8 -:100AD000F00079D18091E10082FF0AC08091E200AC -:100AE00082FF06C08091E1008B7F8093E1006BD193 -:100AF000FF91EF91BF91AF919F918F917F916F91F6 -:100B00005F914F913F912F910F900FBE0F901F90CB -:100B100018951F93DF93CF93CDB7DEB7AC970FB681 -:100B2000F894DEBF0FBECDBFE0E3F2E08091F100AC -:100B3000819322E0E833F207C9F7809130023091C7 -:100B40003102353009F487C0363040F43130C9F114 -:100B5000313070F0333009F01DC133C0383009F442 -:100B6000EFC0393009F4FEC0363009F013C192C02D -:100B7000803821F0823809F00DC108C090912C0214 -:100B800080912D02882399F0926011C080913402E7 -:100B900087708093E9008091EB0090E025E09695C6 -:100BA00087952A95E1F7982F91701092E90080912E -:100BB000E800877F8093E8009093F1001092F100A5 -:100BC000CAC0882319F0823009F0E4C090E08F7128 -:100BD0009070009721F0029709F0DDC00CC0809161 -:100BE0003202813009F0D7C010922D02333069F5FE -:100BF00080932D022AC080913202882331F5209102 -:100C00003402277009F4C7C02093E9008091EB00FB -:100C100080FFC1C0333021F48091EB00806213C0AB -:100C20008091EB0080618093EB0081E090E002C056 -:100C3000880F991F2A95E2F78093EA001092EA0044 -:100C40008091EB0088608093EB001092E900809126 -:100C5000E800877F83C0882309F09CC0109132028E -:100C60008091E800877F8093E800E8DC04C08EB3C1 -:100C7000882309F490C08091E80080FFF8CF812F8D -:100C80008F7711F492E001C093E09EBB806880935F -:100C9000E30081C08058823008F07CC0809132022D -:100CA0009091330223E08C3D920799F55FB7F89459 -:100CB000DE0115964EE020E030E061E2E42FF0E046 -:100CC00060935700849120FF03C082958F704F5F1F -:100CD000982F9F70892F805D8A3308F0895F8C93ED -:100CE00011961C9211972F5F3F4F129624313105B8 -:100CF00029F75FBF8AE28B8383E08C838091E800D1 -:100D0000877F8093E800CE0103966AE270E0E4DC1E -:100D100011C060913402AE014F5F5F4F2CDCBC010B -:100D20000097C9F18091E800877F8093E80089816E -:100D30009A812BDD8091E8008B778093E8002BC0AF -:100D4000803841F58091E800877F8093E8008091AA -:100D50002E028093F1008091E8008E778093E80066 -:100D60006DDC19C08823B1F490913202923098F46E -:100D70008091E800877F8093E80090932E025EDCEC -:100D800080912E02882311F483E001C084E08EBBA1 -:100D9000EEDA01C0E9DA8091E80083FF0AC08091B1 -:100DA000EB0080628093EB008091E800877F809366 -:100DB000E800AC960FB6F894DEBF0FBECDBFCF9162 -:100DC000DF911F91089508951F938EB3882361F0DA -:100DD0001091E9001092E9008091E80083FF01C0C2 -:100DE00098DE17701093E9001F9108950895FC0193 -:100DF0008EB3843021F587859089A189B2890097C7 -:100E0000A105B105E1F085818093E9008091E800BA -:100E100082FF15C08091F200882319F42FEF3FEF75 -:100E200004C08091F100282F30E08091F2008823E7 -:100E300041F48091E8008B778093E80002C02FEFA7 -:100E40003FEFC9010895FC018EB3843011F5878509 -:100E50009089A189B2890097A105B105D1F081815E -:100E60008093E9008091F2008823A9F09091E80036 -:100E70008091E8008E778093E80095FD0CC0FDDB43 -:100E8000982F882349F48091E8008E778093E800BA -:100E900003C092E001C090E0892F0895FC018EB359 -:100EA000843051F487859089A189B2890097A10582 -:100EB000B10511F0CF01C7CF08951F93FC01162F84 -:100EC0008EB38430D9F487859089A189B28900973F -:100ED000A105B10599F081818093E9008091E80036 -:100EE00085FD08C08091E8008E778093E800C5DB1F -:100EF000882329F41093F10080E001C082E01F9163 -:100F000008950F931F93CF93DF93EC010D96FC018F -:100F100089E0DF011D928A95E9F72A813B810981E9 -:100F20008C81882311F410E001C014E0C90151DB69 -:100F3000182B1260802F61E8412F59DB882329F19B -:100F40002E813F810D818885882311F410E001C036 -:100F500014E0C9013EDB182B1260802F60E8412F9E -:100F600046DB882391F02A853B8509858C8588237B -:100F700011F410E001C014E0C9012BDB182B126042 -:100F8000802F61EC412F33DB01C080E0DF91CF91F6 -:100F90001F910F910895CF93DF93EC018091E800AA -:100FA00083FF60C0888190E0209134023091350247 -:100FB0002817390709F056C080913102813261F05B -:100FC000823220F4803209F04DC019C0823269F1BA -:100FD000833209F047C038C080913002813A09F06D -:100FE00041C08091E800877F8093E800CE010F9692 -:100FF00067E070E071DB8091E8008B7713C080912F -:101000003002813279F58091E800877F8093E80093 -:10101000CE010F9667E070E013DCCE01DFD880913F -:10102000E8008E778093E8001DC080913002813205 -:10103000C9F48091E800877F8093E80080913202B4 -:101040008D87CE0164D90DC080913002813251F478 -:101050008091E800877F8093E800CE0160913202A2 -:10106000C5DEECDADF91CF910895A1E21A2EAA1B1A -:10107000BB1BFD010DC0AA1FBB1FEE1FFF1FA21748 -:10108000B307E407F50720F0A21BB30BE40BF50B45 -:10109000661F771F881F991F1A9469F760957095CE -:1010A000809590959B01AC01BD01CF01089597FB00 -:1010B000092E05260ED057FD04D0D7DF0AD0001C1C -:1010C00038F450954095309521953F4F4F4F5F4FE5 -:1010D0000895F6F790958095709561957F4F8F4FA5 -:0810E0009F4F0895F894FFCF23 -:1010E8000003400000044000000208000000000067 -:0810F8000000000000001400DC -:00000001FF +:10000000A7C00000C0C00000BEC00000BCC000000F +:10001000BAC00000B8C00000B6C00000B4C0000004 +:10002000B2C00000B0C00000AEC00000CBC40000F1 +:100030008FC40000A8C00000A6C00000A4C000003B +:10004000A2C00000A0C000009EC000009CC0000034 +:100050009AC0000098C0000096C0000021C10000B6 +:1000600092C0000090C000008EC000008CC0000054 +:100070008AC0000088C0000086C0000084C0000064 +:1000800082C0000080C000007EC000007CC0000074 +:100090007AC0000078C000001201100102000008C0 +:1000A00041233D0001000102DC0109023E00020182 +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:100120002E03410072006400750069006E006F00CC +:1001300020004400750065002000500072006F0030 +:1001400067002E00200050006F0072007400000055 +:1001500011241FBECFEFD2E0DEBFCDBF11E0A0E083 +:10016000B1E0E8EEF0E102C005900D92A831B107D0 +:10017000D9F712E0A8E1B1E001C01D92A833B107A0 +:10018000E1F722D1AFC73CCF9C01DC01AE57BF4F96 +:10019000ED91FC91119741911196FC93EE9380584B +:1001A0009F4FE817F90711F42D933C939FB7F894EC +:1001B000F901EC57FF4F8081815080839FBF842FCE +:1001C0000895882311F03F9A01C03F9847980895F9 +:1001D000882311F046980895469A0895DF92EF9289 +:1001E000FF920F931F93FC018489813019F08230B4 +:1001F00019F404C010E303C010E001C010E28389C9 +:10020000823009F418608589873031F0883031F008 +:10021000863029F4126003C0146001C01660109289 +:10022000C9001092C8001092CA000785F088E188C2 +:10023000D288202F3F2D4E2D5D2D10921E01203B88 +:1002400084E0380780E0480780E0580719F481E02F +:1002500080931E01CA01B90122E030E040E050E085 +:1002600026D720583B47414E5F4FCA01B901202F86 +:100270003F2D4E2D5D2DF9D6215030403093CD00CD +:100280002093CC001093CA0082E08093C80088E9D4 +:100290008093C9001F910F91FF90EF90DF90089518 +:1002A0001F920F920FB60F9211242F938F939F934B +:1002B000EF93FF939091CE008EB38430F1F4E091F0 +:1002C000A201F091A3019083E091A201F091A3011A +:1002D000CF0101969093A3018093A201825A91408D +:1002E00021F482E291E0928381839FB7F894809118 +:1002F000A6018F5F8093A6019FBFFF91EF919F9111 +:100300008F912F910F900FBE0F901F901895FC01A9 +:1003100040911A0140931B0180911C0180931D01A3 +:100320008585282F30E02170307020931A01858553 +:1003300090E096958795817080931C0180911E01B5 +:10034000882339F08FE590E090931901809318018C +:100350000895442341F4222331F08EE190E09093FC +:10036000190180931801089580E091E014C680E09F +:1003700091E0C7C51F9384B7877F84BF18E10FB68C +:10038000F89410936000109260000FBE80E019DFB7 +:10039000469A3E9A87E690E09093CD008093CC00F9 +:1003A00086E08093CA001092C8001093C900539A47 +:1003B0005A9A8AB180638AB98BB180638BB9BDD2F6 +:1003C00084E085BD1F9108950F931F93CF93DF9312 +:1003D000D1DF2FB7F89487EA91E0909328028093B9 +:1003E000270290932A02809329022FBF2FB7F894F7 +:1003F00082E291E09093A3018093A2019093A501E2 +:100400008093A4012FBF7894C7EAD1E003E08FB7AF +:10041000F89490912B028FBF903809F180E091E021 +:10042000E6D497FD1CC0E0912702F091280280835A +:10043000E0912702F0912802CF01019690932802C3 +:10044000809327028752924011F4D283C1839FB7D1 +:10045000F89480912B028F5F80932B029FBF8FB700 +:10046000F8941091A6018FBFA89903C0113608F423 +:1004700069C0A89A8091A601882361F05D980093D5 +:100480001F0108C082E291E07FDE682F80E091E0EA +:1004900014D511501123B1F780911F01882351F019 +:1004A00080911F01815080931F0180911F0188233B +:1004B00009F45D9A80912001882351F080912001F8 +:1004C00081508093200180912001882309F45C9A57 +:1004D0008091180190911901181619067CF58F3535 +:1004E000910521F481E074DE80E06BDE80911801DB +:1004F00090911901839721F480E06ADE80E061DE4B +:100500008091180190911901499721F480E060DEF3 +:1005100081E057DE8091180190911901019721F433 +:1005200080E056DE80E04DDE809118019091190147 +:100530000197909319018093180104C080E048DE70 +:1005400080E03FDE8FB7F89490912B028FBF992304 +:1005500069F087EA91E018DE982F8091C80085FF46 +:10056000FCCF9093CE005C980093200180E091E056 +:1005700095D42AD44CCFDA01923049F0933061F00F +:100580009130F9F4E8E9F0E022E130E01EC0EAEA57 +:10059000F0E02EE330E019C0813049F0813018F0EE +:1005A000823079F408C0E8EEF0E0849107C0ECEE08 +:1005B000F0E0849103C0E0E2F1E08491282F30E084 +:1005C00004C0E0E0F0E020E030E0ED93FC93C901EE +:1005D000089528E030E040E003C04F5F220F331F52 +:1005E00028173907D0F3842F8295807F0895809350 +:1005F000E9008091EB0081608093EB001092ED00A8 +:100600006093EC004093ED008091EE00881F8827F6 +:10061000881F08951092F40090E09093E9001092E2 +:10062000F0001092E8001092ED008091EB008E7FB8 +:100630008093EB009F5F953081F7089580913002A1 +:1006400088238CF403C08EB38823B1F08091E80036 +:1006500082FFF9CF8091E8008B778093E8000895BE +:100660008EB3882349F08091E80080FFF9CF809114 +:10067000E8008E778093E800089594E68091EC007E +:1006800080FF05C08091E80080FF05C023C08091F5 +:10069000E80082FD1FC08EB3882311F482E0089524 +:1006A0008EB3853011F483E008958091EB0085FFCF +:1006B00002C081E008958091E10082FFDFCF809148 +:1006C000E1008B7F8093E100992311F484E0089589 +:1006D0009150D4CF80E008959C0140913602509112 +:1006E00037024617570718F4F90120E038C06115A2 +:1006F000710511F0AB01F8CF8091E8008E778093FF +:10070000E80040E050E0F0CF8091E80083FF02C0B5 +:1007100081E008958091E80082FD2DC08EB388238A +:1007200081F18EB3853079F18091E80080FF17C0A8 +:100730009091F20006C081918093F10041505040A9 +:100740009F5F4115510511F09830A8F320E09830D3 +:1007500009F421E08091E8008E778093E80041154C +:10076000510591F6222381F606C08EB3882349F005 +:100770008EB3853041F08091E80082FFF6CF80E0B3 +:10078000089582E0089583E008959C014091360227 +:10079000509137024617570710F490E03BC061159F +:1007A000710511F0AB01F9CF8091E8008E7780934D +:1007B000E80040E050E0F1CF8091E80083FF02C004 +:1007C00081E008958091E80082FD30C08EB38823D7 +:1007D00099F18EB3853091F18091E80080FF1AC0C5 +:1007E0008091F20009C0F9012F5F3F4FE491E0933F +:1007F000F100415050408F5F4115510511F0883094 +:1008000090F390E0883009F491E08091E8008E77D1 +:100810008093E8004115510579F6992369F606C0E1 +:100820008EB3882349F08EB3853041F08091E80083 +:1008300082FFF6CF80E0089582E0089583E0089576 +:100840009C016115710529F48091E8008B778093F4 +:10085000E800F90120C08091E80083FF02C081E038 +:1008600008958EB3882339F18EB3853031F18091AC +:10087000E80082FFF0CF06C08091F10081936150C3 +:10088000704021F08091F2008823B1F78091E80058 +:100890008B778093E80061157105E9F606C08EB389 +:1008A000882349F08EB3853041F08091E80080FFC5 +:1008B000F6CF80E0089582E0089583E0089542D065 +:1008C00044D01EBA10922E0210922D0210922C02C9 +:1008D00084E089BD89B5826089BD09B400FEFDCF81 +:1008E0008091D800982F9F779093D800806880934C +:1008F000D800809163008E7F809363008091D80040 +:100900008F7D8093D8008091E0008E7F8093E000FF +:100910008091E1008E7F8093E1008091E200816010 +:100920008093E2008091E100877F8093E1008091D5 +:10093000E20088608093E2000895C1DF81E0809347 +:100940002F0208951092E20008951092E100089598 +:100950001F920F920FB60F9211241F932F933F9364 +:100960004F935F936F937F938F939F93AF93BF93B7 +:10097000EF93FF93E9EEF0E0108117701082E0EF43 +:10098000F0E08081877F80837894C3D0F894A9EECB +:10099000B0E01C92E0EFF0E08081886080831C93DF +:1009A000FF91EF91BF91AF919F918F917F916F9147 +:1009B0005F914F913F912F911F910F900FBE0F901C +:1009C0001F9018951F920F920FB60F9211242F931C +:1009D0003F934F935F936F937F938F939F93AF93C7 +:1009E000BF93EF93FF938091E10080FF1BC0809144 +:1009F000E20080FF17C08091E1008E7F8093E100CC +:100A00008091E2008E7F8093E2008091E20080611D +:100A10008093E2008091D80080628093D80019BC56 +:100A20001EBAD1D18091E10084FF29C08091E200FB +:100A300084FF25C084E089BD89B5826089BD09B481 +:100A400000FEFDCF8091D8008F7D8093D8008091EB +:100A5000E1008F7E8093E1008091E2008F7E8093A1 +:100A6000E2008091E20081608093E20080912E029A +:100A7000882311F481E001C084E08EBBA4D1809171 +:100A8000E10083FF27C08091E20083FF23C08091B3 +:100A9000E100877F8093E10082E08EBB10922E02FE +:100AA0008091E1008E7F8093E1008091E2008E7F53 +:100AB0008093E2008091E20080618093E200AADDF1 +:100AC00080E060E042E093DD8091F00088608093F8 +:100AD000F00079D18091E10082FF0AC08091E200AC +:100AE00082FF06C08091E1008B7F8093E1006BD193 +:100AF000FF91EF91BF91AF919F918F917F916F91F6 +:100B00005F914F913F912F910F900FBE0F901F90CB +:100B100018951F93DF93CF93CDB7DEB7AC970FB681 +:100B2000F894DEBF0FBECDBFE0E3F2E08091F100AC +:100B3000819322E0E833F207C9F7809130023091C7 +:100B40003102353009F487C0363040F43130C9F114 +:100B5000313070F0333009F01DC133C0383009F442 +:100B6000EFC0393009F4FEC0363009F013C192C02D +:100B7000803821F0823809F00DC108C090912C0214 +:100B800080912D02882399F0926011C080913402E7 +:100B900087708093E9008091EB0090E025E09695C6 +:100BA00087952A95E1F7982F91701092E90080912E +:100BB000E800877F8093E8009093F1001092F100A5 +:100BC000CAC0882319F0823009F0E4C090E08F7128 +:100BD0009070009721F0029709F0DDC00CC0809161 +:100BE0003202813009F0D7C010922D02333069F5FE +:100BF00080932D022AC080913202882331F5209102 +:100C00003402277009F4C7C02093E9008091EB00FB +:100C100080FFC1C0333021F48091EB00806213C0AB +:100C20008091EB0080618093EB0081E090E002C056 +:100C3000880F991F2A95E2F78093EA001092EA0044 +:100C40008091EB0088608093EB001092E900809126 +:100C5000E800877F83C0882309F09CC0109132028E +:100C60008091E800877F8093E800E8DC04C08EB3C1 +:100C7000882309F490C08091E80080FFF8CF812F8D +:100C80008F7711F492E001C093E09EBB806880935F +:100C9000E30081C08058823008F07CC0809132022D +:100CA0009091330223E08C3D920799F55FB7F89459 +:100CB000DE0115964EE020E030E061E2E42FF0E046 +:100CC00060935700849120FF03C082958F704F5F1F +:100CD000982F9F70892F805D8A3308F0895F8C93ED +:100CE00011961C9211972F5F3F4F129624313105B8 +:100CF00029F75FBF8AE28B8383E08C838091E800D1 +:100D0000877F8093E800CE0103966AE270E0E4DC1E +:100D100011C060913402AE014F5F5F4F2CDCBC010B +:100D20000097C9F18091E800877F8093E80089816E +:100D30009A812BDD8091E8008B778093E8002BC0AF +:100D4000803841F58091E800877F8093E8008091AA +:100D50002E028093F1008091E8008E778093E80066 +:100D60006DDC19C08823B1F490913202923098F46E +:100D70008091E800877F8093E80090932E025EDCEC +:100D800080912E02882311F483E001C084E08EBBA1 +:100D9000EEDA01C0E9DA8091E80083FF0AC08091B1 +:100DA000EB0080628093EB008091E800877F809366 +:100DB000E800AC960FB6F894DEBF0FBECDBFCF9162 +:100DC000DF911F91089508951F938EB3882361F0DA +:100DD0001091E9001092E9008091E80083FF01C0C2 +:100DE00098DE17701093E9001F9108950895FC0193 +:100DF0008EB3843021F587859089A189B2890097C7 +:100E0000A105B105E1F085818093E9008091E800BA +:100E100082FF15C08091F200882319F42FEF3FEF75 +:100E200004C08091F100282F30E08091F2008823E7 +:100E300041F48091E8008B778093E80002C02FEFA7 +:100E40003FEFC9010895FC018EB3843011F5878509 +:100E50009089A189B2890097A105B105D1F081815E +:100E60008093E9008091F2008823A9F09091E80036 +:100E70008091E8008E778093E80095FD0CC0FDDB43 +:100E8000982F882349F48091E8008E778093E800BA +:100E900003C092E001C090E0892F0895FC018EB359 +:100EA000843051F487859089A189B2890097A10582 +:100EB000B10511F0CF01C7CF08951F93FC01162F84 +:100EC0008EB38430D9F487859089A189B28900973F +:100ED000A105B10599F081818093E9008091E80036 +:100EE00085FD08C08091E8008E778093E800C5DB1F +:100EF000882329F41093F10080E001C082E01F9163 +:100F000008950F931F93CF93DF93EC010D96FC018F +:100F100089E0DF011D928A95E9F72A813B810981E9 +:100F20008C81882311F410E001C014E0C90151DB69 +:100F3000182B1260802F61E8412F59DB882329F19B +:100F40002E813F810D818885882311F410E001C036 +:100F500014E0C9013EDB182B1260802F60E8412F9E +:100F600046DB882391F02A853B8509858C8588237B +:100F700011F410E001C014E0C9012BDB182B126042 +:100F8000802F61EC412F33DB01C080E0DF91CF91F6 +:100F90001F910F910895CF93DF93EC018091E800AA +:100FA00083FF60C0888190E0209134023091350247 +:100FB0002817390709F056C080913102813261F05B +:100FC000823220F4803209F04DC019C0823269F1BA +:100FD000833209F047C038C080913002813A09F06D +:100FE00041C08091E800877F8093E800CE010F9692 +:100FF00067E070E071DB8091E8008B7713C080912F +:101000003002813279F58091E800877F8093E80093 +:10101000CE010F9667E070E013DCCE01DFD880913F +:10102000E8008E778093E8001DC080913002813205 +:10103000C9F48091E800877F8093E80080913202B4 +:101040008D87CE0164D90DC080913002813251F478 +:101050008091E800877F8093E800CE0160913202A2 +:10106000C5DEECDADF91CF910895A1E21A2EAA1B1A +:10107000BB1BFD010DC0AA1FBB1FEE1FFF1FA21748 +:10108000B307E407F50720F0A21BB30BE40BF50B45 +:10109000661F771F881F991F1A9469F760957095CE +:1010A000809590959B01AC01BD01CF01089597FB00 +:1010B000092E05260ED057FD04D0D7DF0AD0001C1C +:1010C00038F450954095309521953F4F4F4F5F4FE5 +:1010D0000895F6F790958095709561957F4F8F4FA5 +:0810E0009F4F0895F894FFCF23 +:1010E8000003400000044000000208000000000067 +:0810F8000000000000001400DC +:00000001FF diff --git a/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2013-02-05.hex b/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2013-02-05.hex index b39790b4da1..6a9efbfdd27 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2013-02-05.hex +++ b/hardware/arduino/sam/firmwares/atmega16u2/Arduino-DUE-usbserial-prod-firmware-2013-02-05.hex @@ -1,272 +1,272 @@ -:10000000A7C00000C0C00000BEC00000BCC000000F -:10001000BAC00000B8C00000B6C00000B4C0000004 -:10002000B2C00000B0C00000AEC00000B8C4000004 -:100030007CC40000A8C00000A6C00000A4C000004E -:10004000A2C00000A0C000009EC000009CC0000034 -:100050009AC0000098C0000096C0000021C10000B6 -:1000600092C0000090C000008EC000008CC0000054 -:100070008AC0000088C0000086C0000084C0000064 -:1000800082C0000080C000007EC000007CC0000074 -:100090007AC0000078C000001201100102000008C0 -:1000A00041233D0001000102DC0109023E00020182 -:1000B00000C0320904000001020201000524000111 -:1000C0001004240206052406000107058203080027 -:1000D000FF09040100020A000000070504024000B5 -:1000E00001070583024000010403090432034100B3 -:1000F00072006400750069006E006F002000280027 -:100100007700770077002E006100720064007500B0 -:1001100069006E006F002E0063006300290000007C -:100120002E03410072006400750069006E006F00CC -:1001300020004400750065002000500072006F0030 -:1001400067002E00200050006F0072007400000055 -:1001500011241FBECFEFD2E0DEBFCDBF11E0A0E083 -:10016000B1E0E2ECF0E102C005900D92A831B107D8 -:10017000D9F712E0A8E1B1E001C01D92A833B107A0 -:10018000E1F722D19CC73CCF9C01DC01AE57BF4FA9 -:10019000ED91FC91119741911196FC93EE9380584B -:1001A0009F4FE817F90711F42D933C939FB7F894EC -:1001B000F901EC57FF4F8081815080839FBF842FCE -:1001C0000895882311F03F9A01C03F9847980895F9 -:1001D000882311F046980895469A0895DF92EF9289 -:1001E000FF920F931F93FC018489813019F08230B4 -:1001F00019F404C010E303C010E001C010E28389C9 -:10020000823009F418608589873031F0883031F008 -:10021000863029F4126003C0146001C01660109289 -:10022000C9001092C8001092CA000785F088E188C2 -:10023000D288202F3F2D4E2D5D2D10921E01203B88 -:1002400084E0380780E0480780E0580719F481E02F -:1002500080931E01CA01B90122E030E040E050E085 -:1002600013D720583B47414E5F4FCA01B901202F99 -:100270003F2D4E2D5D2DE6D6215030403093CD00E0 -:100280002093CC001093CA0082E08093C80088E9D4 -:100290008093C9001F910F91FF90EF90DF90089518 -:1002A0001F920F920FB60F9211242F938F939F934B -:1002B000EF93FF939091CE008EB38430F1F4E091F0 -:1002C000A201F091A3019083E091A201F091A3011A -:1002D000CF0101969093A3018093A201825A91408D -:1002E00021F482E291E0928381839FB7F894809118 -:1002F000A6018F5F8093A6019FBFFF91EF919F9111 -:100300008F912F910F900FBE0F901F901895FC01A9 -:1003100040911A0140931B0180911C0180931D01A3 -:100320008585282F30E02170307020931A01858553 -:1003300090E096958795817080931C0180911E01B5 -:10034000882339F088E790E0909319018093180191 -:100350000895442341F4222331F082E390E0909306 -:10036000190180931801089580E091E001C680E0B2 -:1003700091E0B4C51F9384B7877F84BF18E10FB69F -:10038000F89410936000109260000FBE80E019DFB7 -:10039000469A3E9A87E690E09093CD008093CC00F9 -:1003A00086E08093CA001092C8001093C900539A47 -:1003B0005A9A8AB180638AB98BB180638BB9AAD209 -:1003C00084E085BD1F9108950F931F93CF93DF9312 -:1003D000D1DF2FB7F89487EA91E0909328028093B9 -:1003E000270290932A02809329022FBF2FB7F894F7 -:1003F00082E291E09093A3018093A2019093A501E2 -:100400008093A4012FBF7894C7EAD1E003E08FB7AF -:10041000F89490912B028FBF903809F180E091E021 -:10042000D3D497FD1CC0E0912702F091280280836D -:10043000E0912702F0912802CF01019690932802C3 -:10044000809327028752924011F4D283C1839FB7D1 -:10045000F89480912B028F5F80932B029FBF8FB700 -:10046000F8941091A6018FBFA89903C0113608F423 -:1004700056C0A89A8091A601882361F05D980093E8 -:100480001F0108C082E291E07FDE682F80E091E0EA -:1004900001D511501123B1F780911F01882351F02C -:1004A00080911F01815080931F0180911F0188233B -:1004B00009F45D9A80912001882351F080912001F8 -:1004C00081508093200180912001882309F45C9A57 -:1004D000809118019091190118161906E4F4CC972F -:1004E000CD9710F481E001C080E072DE80911801A8 -:1004F000909119010197C29710F481E001C080E04A -:1005000060DE809118019091190101979093190173 -:100510008093180104C080E05BDE80E052DE8FB77C -:10052000F89490912B028FBF992369F087EA91E0AC -:100530002BDE982F8091C80085FFFCCF9093CE00D2 -:100540005C980093200180E091E095D42AD45FCF9D -:10055000DA01923049F0933061F09130F9F4E8E932 -:10056000F0E022E130E01EC0EAEAF0E02EE330E005 -:1005700019C0813049F0813018F0823079F408C018 -:10058000E8EEF0E0849107C0ECEEF0E0849103C067 -:10059000E0E2F1E08491282F30E004C0E0E0F0E0F8 -:1005A00020E030E0ED93FC93C901089528E030E0AD -:1005B00040E003C04F5F220F331F28173907D0F3E5 -:1005C000842F8295807F08958093E9008091EB00CD -:1005D00081608093EB001092ED006093EC004093FB -:1005E000ED008091EE00881F8827881F08951092E3 -:1005F000F40090E09093E9001092F0001092E8006F -:100600001092ED008091EB008E7F8093EB009F5F56 -:10061000953081F708958091300288238CF403C0CF -:100620008EB38823B1F08091E80082FFF9CF8091EA -:10063000E8008B778093E80008958EB3882349F013 -:100640008091E80080FFF9CF8091E8008E77809359 -:10065000E800089594E68091EC0080FF05C0809149 -:10066000E80080FF05C023C08091E80082FD1FC024 -:100670008EB3882311F482E008958EB3853011F48F -:1006800083E008958091EB0085FF02C081E008952A -:100690008091E10082FFDFCF8091E1008B7F80932A -:1006A000E100992311F484E008959150D4CF80E0C3 -:1006B00008959C0140913602509137024617570722 -:1006C00018F4F90120E038C06115710511F0AB0193 -:1006D000F8CF8091E8008E778093E80040E050E00A -:1006E000F0CF8091E80083FF02C081E008958091FF -:1006F000E80082FD2DC08EB3882381F18EB3853052 -:1007000079F18091E80080FF17C09091F20006C057 -:1007100081918093F100415050409F5F41155105F8 -:1007200011F09830A8F320E0983009F421E080918E -:10073000E8008E778093E8004115510591F6222359 -:1007400081F606C08EB3882349F08EB3853041F020 -:100750008091E80082FFF6CF80E0089582E008955E -:1007600083E008959C01409136025091370246176C -:10077000570710F490E03BC06115710511F0AB0113 -:10078000F9CF8091E8008E778093E80040E050E058 -:10079000F1CF8091E80083FF02C081E0089580914D -:1007A000E80082FD30C08EB3882399F18EB3853086 -:1007B00091F18091E80080FF1AC08091F20009C099 -:1007C000F9012F5F3F4FE491E093F1004150504019 -:1007D0008F5F4115510511F0883090F390E088301B -:1007E00009F491E08091E8008E778093E80041154C -:1007F000510579F6992369F606C08EB3882349F02E -:100800008EB3853041F08091E80082FFF6CF80E022 -:10081000089582E0089583E008959C0161157105B3 -:1008200029F48091E8008B778093E800F90120C0DB -:100830008091E80083FF02C081E008958EB3882391 -:1008400039F18EB3853031F18091E80082FFF0CF2D -:1008500006C08091F10081936150704021F0809139 -:10086000F2008823B1F78091E8008B778093E8004D -:1008700061157105E9F606C08EB3882349F08EB381 -:10088000853041F08091E80080FFF6CF80E0089548 -:1008900082E0089583E0089542D044D01EBA1092B9 -:1008A0002E0210922D0210922C0284E089BD89B58F -:1008B000826089BD09B400FEFDCF8091D800982FD9 -:1008C0009F779093D80080688093D80080916300D0 -:1008D0008E7F809363008091D8008F7D8093D800B5 -:1008E0008091E0008E7F8093E0008091E1008E7F18 -:1008F0008093E1008091E20081608093E20080912A -:10090000E100877F8093E1008091E200886080931E -:10091000E2000895C1DF81E080932F0208951092D4 -:10092000E20008951092E10008951F920F920FB611 -:100930000F9211241F932F933F934F935F936F93C5 -:100940007F938F939F93AF93BF93EF93FF93E9EEC2 -:10095000F0E0108117701082E0EFF0E08081877F77 -:1009600080837894C3D0F894A9EEB0E01C92E0EFB5 -:10097000F0E08081886080831C93FF91EF91BF91AC -:10098000AF919F918F917F916F915F914F913F9127 -:100990002F911F910F900FBE0F901F9018951F92CF -:1009A0000F920FB60F9211242F933F934F935F93A3 -:1009B0006F937F938F939F93AF93BF93EF93FF9327 -:1009C0008091E10080FF1BC08091E20080FF17C092 -:1009D0008091E1008E7F8093E1008091E2008E7F24 -:1009E0008093E2008091E20080618093E200809138 -:1009F000D80080628093D80019BC1EBAD1D18091F2 -:100A0000E10084FF29C08091E20084FF25C084E0DA -:100A100089BD89B5826089BD09B400FEFDCF809192 -:100A2000D8008F7D8093D8008091E1008F7E8093E5 -:100A3000E1008091E2008F7E8093E2008091E200ED -:100A400081608093E20080912E02882311F481E07E -:100A500001C084E08EBBA4D18091E10083FF27C058 -:100A60008091E20083FF23C08091E100877F809323 -:100A7000E10082E08EBB10922E028091E1008E7F19 -:100A80008093E1008091E2008E7F8093E20080916C -:100A9000E20080618093E200AADD80E060E042E055 -:100AA00093DD8091F00088608093F00079D180918F -:100AB000E10082FF0AC08091E20082FF06C08091BF -:100AC000E1008B7F8093E1006BD1FF91EF91BF91AB -:100AD000AF919F918F917F916F915F914F913F91D6 -:100AE0002F910F900FBE0F901F9018951F93DF93BB -:100AF000CF93CDB7DEB7AC970FB6F894DEBF0FBE7D -:100B0000CDBFE0E3F2E08091F100819322E0E83391 -:100B1000F207C9F78091300230913102353009F483 -:100B200087C0363040F43130C9F1313070F03330A5 -:100B300009F01DC133C0383009F4EFC0393009F471 -:100B4000FEC0363009F013C192C0803821F08238DF -:100B500009F00DC108C090912C0280912D028823CC -:100B600099F0926011C08091340287708093E900FF -:100B70008091EB0090E025E0969587952A95E1F726 -:100B8000982F91701092E9008091E800877F809300 -:100B9000E8009093F1001092F100CAC0882319F088 -:100BA000823009F0E4C090E08F719070009721F0DE -:100BB000029709F0DDC00CC080913202813009F04B -:100BC000D7C010922D02333069F580932D022AC0D0 -:100BD00080913202882331F520913402277009F484 -:100BE000C7C02093E9008091EB0080FFC1C0333083 -:100BF00021F48091EB00806213C08091EB00806152 -:100C00008093EB0081E090E002C0880F991F2A9545 -:100C1000E2F78093EA001092EA008091EB0088608E -:100C20008093EB001092E9008091E800877F83C0F9 -:100C3000882309F09CC0109132028091E800877FE0 -:100C40008093E800E8DC04C08EB3882309F490C0E8 -:100C50008091E80080FFF8CF812F8F7711F492E028 -:100C600001C093E09EBB80688093E30081C0805800 -:100C7000823008F07CC0809132029091330223E0F0 -:100C80008C3D920799F55FB7F894DE0115964EE01A -:100C900020E030E061E2E42FF0E0609357008491BF -:100CA00020FF03C082958F704F5F982F9F70892F10 -:100CB000805D8A3308F0895F8C9311961C9211979E -:100CC0002F5F3F4F12962431310529F75FBF8AE22B -:100CD0008B8383E08C838091E800877F8093E8009A -:100CE000CE0103966AE270E0E4DC11C06091340248 -:100CF000AE014F5F5F4F2CDCBC010097C9F18091C2 -:100D0000E800877F8093E80089819A812BDD8091BC -:100D1000E8008B778093E8002BC0803841F5809104 -:100D2000E800877F8093E80080912E028093F10095 -:100D30008091E8008E778093E8006DDC19C08823ED -:100D4000B1F490913202923098F48091E800877F5C -:100D50008093E80090932E025EDC80912E0288231F -:100D600011F483E001C084E08EBB01DB01C0FCDA3A -:100D70008091E80083FF0AC08091EB00806280933D -:100D8000EB008091E800877F8093E800AC960FB677 -:100D9000F894DEBF0FBECDBFCF91DF911F910895B4 -:100DA00008951F938EB3882361F01091E90010928B -:100DB000E9008091E80083FF01C098DE177010936E -:100DC000E9001F9108950895FC018EB3843021F548 -:100DD00087859089A189B2890097A105B105E1F0C5 -:100DE00085818093E9008091E80082FF15C08091A1 -:100DF000F200882319F42FEF3FEF04C08091F10037 -:100E0000282F30E08091F200882341F48091E8009F -:100E10008B778093E80002C02FEF3FEFC901089560 -:100E2000FC018EB3843011F587859089A189B28940 -:100E30000097A105B105D1F081818093E9008091EF -:100E4000F2008823A9F09091E8008091E8008E7765 -:100E50008093E80095FD0CC0FDDB982F882349F4B2 -:100E60008091E8008E778093E80003C092E001C093 -:100E700090E0892F0895FC018EB3843051F487856A -:100E80009089A189B2890097A105B10511F0CF0120 -:100E9000C7CF08951F93FC01162F8EB38430D9F469 -:100EA00087859089A189B2890097A105B10599F03C -:100EB00081818093E9008091E80085FD08C08091E0 -:100EC000E8008E778093E800C5DB882329F410932F -:100ED000F10080E001C082E01F9108950F931F93FD -:100EE000CF93DF93EC010D96FC0189E0DF011D92A9 -:100EF0008A95E9F72A813B8109818C81882311F445 -:100F000010E001C014E0C90151DB182B1260802FE2 -:100F100061E8412F59DB882329F12E813F810D8122 -:100F20008885882311F410E001C014E0C9013EDB7C -:100F3000182B1260802F60E8412F46DB882391F048 -:100F40002A853B8509858C85882311F410E001C032 -:100F500014E0C9012BDB182B1260802F61EC412FAC -:100F600033DB01C080E0DF91CF911F910F91089595 -:100F7000CF93DF93EC018091E80083FF60C088810C -:100F800090E020913402309135022817390709F09A -:100F900056C080913102813261F0823220F4803279 -:100FA00009F04DC019C0823269F1833209F047C09F -:100FB00038C080913002813A09F041C08091E80048 -:100FC000877F8093E800CE010F9667E070E071DBC9 -:100FD0008091E8008B7713C080913002813279F5DF -:100FE0008091E800877F8093E800CE010F9667E04C -:100FF00070E013DCCE01F2D88091E8008E77809308 -:10100000E8001DC0809130028132C9F48091E8006F -:10101000877F8093E800809132028D87CE0177D957 -:101020000DC080913002813251F48091E800877FB9 -:101030008093E800CE0160913202C5DEECDADF91E8 -:10104000CF910895A1E21A2EAA1BBB1BFD010DC072 -:10105000AA1FBB1FEE1FFF1FA217B307E407F50768 -:1010600020F0A21BB30BE40BF50B661F771F881F44 -:10107000991F1A9469F760957095809590959B01DA -:10108000AC01BD01CF01089597FB092E05260ED0B6 -:1010900057FD04D0D7DF0AD0001C38F45095409596 -:1010A000309521953F4F4F4F5F4F0895F6F790953C -:1010B0008095709561957F4F8F4F9F4F0895F8945D -:0210C000FFCF60 -:1010C200000340000004400000020800000000008D -:0810D200000000000000140002 -:00000001FF +:10000000A7C00000C0C00000BEC00000BCC000000F +:10001000BAC00000B8C00000B6C00000B4C0000004 +:10002000B2C00000B0C00000AEC00000B8C4000004 +:100030007CC40000A8C00000A6C00000A4C000004E +:10004000A2C00000A0C000009EC000009CC0000034 +:100050009AC0000098C0000096C0000021C10000B6 +:1000600092C0000090C000008EC000008CC0000054 +:100070008AC0000088C0000086C0000084C0000064 +:1000800082C0000080C000007EC000007CC0000074 +:100090007AC0000078C000001201100102000008C0 +:1000A00041233D0001000102DC0109023E00020182 +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:100120002E03410072006400750069006E006F00CC +:1001300020004400750065002000500072006F0030 +:1001400067002E00200050006F0072007400000055 +:1001500011241FBECFEFD2E0DEBFCDBF11E0A0E083 +:10016000B1E0E2ECF0E102C005900D92A831B107D8 +:10017000D9F712E0A8E1B1E001C01D92A833B107A0 +:10018000E1F722D19CC73CCF9C01DC01AE57BF4FA9 +:10019000ED91FC91119741911196FC93EE9380584B +:1001A0009F4FE817F90711F42D933C939FB7F894EC +:1001B000F901EC57FF4F8081815080839FBF842FCE +:1001C0000895882311F03F9A01C03F9847980895F9 +:1001D000882311F046980895469A0895DF92EF9289 +:1001E000FF920F931F93FC018489813019F08230B4 +:1001F00019F404C010E303C010E001C010E28389C9 +:10020000823009F418608589873031F0883031F008 +:10021000863029F4126003C0146001C01660109289 +:10022000C9001092C8001092CA000785F088E188C2 +:10023000D288202F3F2D4E2D5D2D10921E01203B88 +:1002400084E0380780E0480780E0580719F481E02F +:1002500080931E01CA01B90122E030E040E050E085 +:1002600013D720583B47414E5F4FCA01B901202F99 +:100270003F2D4E2D5D2DE6D6215030403093CD00E0 +:100280002093CC001093CA0082E08093C80088E9D4 +:100290008093C9001F910F91FF90EF90DF90089518 +:1002A0001F920F920FB60F9211242F938F939F934B +:1002B000EF93FF939091CE008EB38430F1F4E091F0 +:1002C000A201F091A3019083E091A201F091A3011A +:1002D000CF0101969093A3018093A201825A91408D +:1002E00021F482E291E0928381839FB7F894809118 +:1002F000A6018F5F8093A6019FBFFF91EF919F9111 +:100300008F912F910F900FBE0F901F901895FC01A9 +:1003100040911A0140931B0180911C0180931D01A3 +:100320008585282F30E02170307020931A01858553 +:1003300090E096958795817080931C0180911E01B5 +:10034000882339F088E790E0909319018093180191 +:100350000895442341F4222331F082E390E0909306 +:10036000190180931801089580E091E001C680E0B2 +:1003700091E0B4C51F9384B7877F84BF18E10FB69F +:10038000F89410936000109260000FBE80E019DFB7 +:10039000469A3E9A87E690E09093CD008093CC00F9 +:1003A00086E08093CA001092C8001093C900539A47 +:1003B0005A9A8AB180638AB98BB180638BB9AAD209 +:1003C00084E085BD1F9108950F931F93CF93DF9312 +:1003D000D1DF2FB7F89487EA91E0909328028093B9 +:1003E000270290932A02809329022FBF2FB7F894F7 +:1003F00082E291E09093A3018093A2019093A501E2 +:100400008093A4012FBF7894C7EAD1E003E08FB7AF +:10041000F89490912B028FBF903809F180E091E021 +:10042000D3D497FD1CC0E0912702F091280280836D +:10043000E0912702F0912802CF01019690932802C3 +:10044000809327028752924011F4D283C1839FB7D1 +:10045000F89480912B028F5F80932B029FBF8FB700 +:10046000F8941091A6018FBFA89903C0113608F423 +:1004700056C0A89A8091A601882361F05D980093E8 +:100480001F0108C082E291E07FDE682F80E091E0EA +:1004900001D511501123B1F780911F01882351F02C +:1004A00080911F01815080931F0180911F0188233B +:1004B00009F45D9A80912001882351F080912001F8 +:1004C00081508093200180912001882309F45C9A57 +:1004D000809118019091190118161906E4F4CC972F +:1004E000CD9710F481E001C080E072DE80911801A8 +:1004F000909119010197C29710F481E001C080E04A +:1005000060DE809118019091190101979093190173 +:100510008093180104C080E05BDE80E052DE8FB77C +:10052000F89490912B028FBF992369F087EA91E0AC +:100530002BDE982F8091C80085FFFCCF9093CE00D2 +:100540005C980093200180E091E095D42AD45FCF9D +:10055000DA01923049F0933061F09130F9F4E8E932 +:10056000F0E022E130E01EC0EAEAF0E02EE330E005 +:1005700019C0813049F0813018F0823079F408C018 +:10058000E8EEF0E0849107C0ECEEF0E0849103C067 +:10059000E0E2F1E08491282F30E004C0E0E0F0E0F8 +:1005A00020E030E0ED93FC93C901089528E030E0AD +:1005B00040E003C04F5F220F331F28173907D0F3E5 +:1005C000842F8295807F08958093E9008091EB00CD +:1005D00081608093EB001092ED006093EC004093FB +:1005E000ED008091EE00881F8827881F08951092E3 +:1005F000F40090E09093E9001092F0001092E8006F +:100600001092ED008091EB008E7F8093EB009F5F56 +:10061000953081F708958091300288238CF403C0CF +:100620008EB38823B1F08091E80082FFF9CF8091EA +:10063000E8008B778093E80008958EB3882349F013 +:100640008091E80080FFF9CF8091E8008E77809359 +:10065000E800089594E68091EC0080FF05C0809149 +:10066000E80080FF05C023C08091E80082FD1FC024 +:100670008EB3882311F482E008958EB3853011F48F +:1006800083E008958091EB0085FF02C081E008952A +:100690008091E10082FFDFCF8091E1008B7F80932A +:1006A000E100992311F484E008959150D4CF80E0C3 +:1006B00008959C0140913602509137024617570722 +:1006C00018F4F90120E038C06115710511F0AB0193 +:1006D000F8CF8091E8008E778093E80040E050E00A +:1006E000F0CF8091E80083FF02C081E008958091FF +:1006F000E80082FD2DC08EB3882381F18EB3853052 +:1007000079F18091E80080FF17C09091F20006C057 +:1007100081918093F100415050409F5F41155105F8 +:1007200011F09830A8F320E0983009F421E080918E +:10073000E8008E778093E8004115510591F6222359 +:1007400081F606C08EB3882349F08EB3853041F020 +:100750008091E80082FFF6CF80E0089582E008955E +:1007600083E008959C01409136025091370246176C +:10077000570710F490E03BC06115710511F0AB0113 +:10078000F9CF8091E8008E778093E80040E050E058 +:10079000F1CF8091E80083FF02C081E0089580914D +:1007A000E80082FD30C08EB3882399F18EB3853086 +:1007B00091F18091E80080FF1AC08091F20009C099 +:1007C000F9012F5F3F4FE491E093F1004150504019 +:1007D0008F5F4115510511F0883090F390E088301B +:1007E00009F491E08091E8008E778093E80041154C +:1007F000510579F6992369F606C08EB3882349F02E +:100800008EB3853041F08091E80082FFF6CF80E022 +:10081000089582E0089583E008959C0161157105B3 +:1008200029F48091E8008B778093E800F90120C0DB +:100830008091E80083FF02C081E008958EB3882391 +:1008400039F18EB3853031F18091E80082FFF0CF2D +:1008500006C08091F10081936150704021F0809139 +:10086000F2008823B1F78091E8008B778093E8004D +:1008700061157105E9F606C08EB3882349F08EB381 +:10088000853041F08091E80080FFF6CF80E0089548 +:1008900082E0089583E0089542D044D01EBA1092B9 +:1008A0002E0210922D0210922C0284E089BD89B58F +:1008B000826089BD09B400FEFDCF8091D800982FD9 +:1008C0009F779093D80080688093D80080916300D0 +:1008D0008E7F809363008091D8008F7D8093D800B5 +:1008E0008091E0008E7F8093E0008091E1008E7F18 +:1008F0008093E1008091E20081608093E20080912A +:10090000E100877F8093E1008091E200886080931E +:10091000E2000895C1DF81E080932F0208951092D4 +:10092000E20008951092E10008951F920F920FB611 +:100930000F9211241F932F933F934F935F936F93C5 +:100940007F938F939F93AF93BF93EF93FF93E9EEC2 +:10095000F0E0108117701082E0EFF0E08081877F77 +:1009600080837894C3D0F894A9EEB0E01C92E0EFB5 +:10097000F0E08081886080831C93FF91EF91BF91AC +:10098000AF919F918F917F916F915F914F913F9127 +:100990002F911F910F900FBE0F901F9018951F92CF +:1009A0000F920FB60F9211242F933F934F935F93A3 +:1009B0006F937F938F939F93AF93BF93EF93FF9327 +:1009C0008091E10080FF1BC08091E20080FF17C092 +:1009D0008091E1008E7F8093E1008091E2008E7F24 +:1009E0008093E2008091E20080618093E200809138 +:1009F000D80080628093D80019BC1EBAD1D18091F2 +:100A0000E10084FF29C08091E20084FF25C084E0DA +:100A100089BD89B5826089BD09B400FEFDCF809192 +:100A2000D8008F7D8093D8008091E1008F7E8093E5 +:100A3000E1008091E2008F7E8093E2008091E200ED +:100A400081608093E20080912E02882311F481E07E +:100A500001C084E08EBBA4D18091E10083FF27C058 +:100A60008091E20083FF23C08091E100877F809323 +:100A7000E10082E08EBB10922E028091E1008E7F19 +:100A80008093E1008091E2008E7F8093E20080916C +:100A9000E20080618093E200AADD80E060E042E055 +:100AA00093DD8091F00088608093F00079D180918F +:100AB000E10082FF0AC08091E20082FF06C08091BF +:100AC000E1008B7F8093E1006BD1FF91EF91BF91AB +:100AD000AF919F918F917F916F915F914F913F91D6 +:100AE0002F910F900FBE0F901F9018951F93DF93BB +:100AF000CF93CDB7DEB7AC970FB6F894DEBF0FBE7D +:100B0000CDBFE0E3F2E08091F100819322E0E83391 +:100B1000F207C9F78091300230913102353009F483 +:100B200087C0363040F43130C9F1313070F03330A5 +:100B300009F01DC133C0383009F4EFC0393009F471 +:100B4000FEC0363009F013C192C0803821F08238DF +:100B500009F00DC108C090912C0280912D028823CC +:100B600099F0926011C08091340287708093E900FF +:100B70008091EB0090E025E0969587952A95E1F726 +:100B8000982F91701092E9008091E800877F809300 +:100B9000E8009093F1001092F100CAC0882319F088 +:100BA000823009F0E4C090E08F719070009721F0DE +:100BB000029709F0DDC00CC080913202813009F04B +:100BC000D7C010922D02333069F580932D022AC0D0 +:100BD00080913202882331F520913402277009F484 +:100BE000C7C02093E9008091EB0080FFC1C0333083 +:100BF00021F48091EB00806213C08091EB00806152 +:100C00008093EB0081E090E002C0880F991F2A9545 +:100C1000E2F78093EA001092EA008091EB0088608E +:100C20008093EB001092E9008091E800877F83C0F9 +:100C3000882309F09CC0109132028091E800877FE0 +:100C40008093E800E8DC04C08EB3882309F490C0E8 +:100C50008091E80080FFF8CF812F8F7711F492E028 +:100C600001C093E09EBB80688093E30081C0805800 +:100C7000823008F07CC0809132029091330223E0F0 +:100C80008C3D920799F55FB7F894DE0115964EE01A +:100C900020E030E061E2E42FF0E0609357008491BF +:100CA00020FF03C082958F704F5F982F9F70892F10 +:100CB000805D8A3308F0895F8C9311961C9211979E +:100CC0002F5F3F4F12962431310529F75FBF8AE22B +:100CD0008B8383E08C838091E800877F8093E8009A +:100CE000CE0103966AE270E0E4DC11C06091340248 +:100CF000AE014F5F5F4F2CDCBC010097C9F18091C2 +:100D0000E800877F8093E80089819A812BDD8091BC +:100D1000E8008B778093E8002BC0803841F5809104 +:100D2000E800877F8093E80080912E028093F10095 +:100D30008091E8008E778093E8006DDC19C08823ED +:100D4000B1F490913202923098F48091E800877F5C +:100D50008093E80090932E025EDC80912E0288231F +:100D600011F483E001C084E08EBB01DB01C0FCDA3A +:100D70008091E80083FF0AC08091EB00806280933D +:100D8000EB008091E800877F8093E800AC960FB677 +:100D9000F894DEBF0FBECDBFCF91DF911F910895B4 +:100DA00008951F938EB3882361F01091E90010928B +:100DB000E9008091E80083FF01C098DE177010936E +:100DC000E9001F9108950895FC018EB3843021F548 +:100DD00087859089A189B2890097A105B105E1F0C5 +:100DE00085818093E9008091E80082FF15C08091A1 +:100DF000F200882319F42FEF3FEF04C08091F10037 +:100E0000282F30E08091F200882341F48091E8009F +:100E10008B778093E80002C02FEF3FEFC901089560 +:100E2000FC018EB3843011F587859089A189B28940 +:100E30000097A105B105D1F081818093E9008091EF +:100E4000F2008823A9F09091E8008091E8008E7765 +:100E50008093E80095FD0CC0FDDB982F882349F4B2 +:100E60008091E8008E778093E80003C092E001C093 +:100E700090E0892F0895FC018EB3843051F487856A +:100E80009089A189B2890097A105B10511F0CF0120 +:100E9000C7CF08951F93FC01162F8EB38430D9F469 +:100EA00087859089A189B2890097A105B10599F03C +:100EB00081818093E9008091E80085FD08C08091E0 +:100EC000E8008E778093E800C5DB882329F410932F +:100ED000F10080E001C082E01F9108950F931F93FD +:100EE000CF93DF93EC010D96FC0189E0DF011D92A9 +:100EF0008A95E9F72A813B8109818C81882311F445 +:100F000010E001C014E0C90151DB182B1260802FE2 +:100F100061E8412F59DB882329F12E813F810D8122 +:100F20008885882311F410E001C014E0C9013EDB7C +:100F3000182B1260802F60E8412F46DB882391F048 +:100F40002A853B8509858C85882311F410E001C032 +:100F500014E0C9012BDB182B1260802F61EC412FAC +:100F600033DB01C080E0DF91CF911F910F91089595 +:100F7000CF93DF93EC018091E80083FF60C088810C +:100F800090E020913402309135022817390709F09A +:100F900056C080913102813261F0823220F4803279 +:100FA00009F04DC019C0823269F1833209F047C09F +:100FB00038C080913002813A09F041C08091E80048 +:100FC000877F8093E800CE010F9667E070E071DBC9 +:100FD0008091E8008B7713C080913002813279F5DF +:100FE0008091E800877F8093E800CE010F9667E04C +:100FF00070E013DCCE01F2D88091E8008E77809308 +:10100000E8001DC0809130028132C9F48091E8006F +:10101000877F8093E800809132028D87CE0177D957 +:101020000DC080913002813251F48091E800877FB9 +:101030008093E800CE0160913202C5DEECDADF91E8 +:10104000CF910895A1E21A2EAA1BBB1BFD010DC072 +:10105000AA1FBB1FEE1FFF1FA217B307E407F50768 +:1010600020F0A21BB30BE40BF50B661F771F881F44 +:10107000991F1A9469F760957095809590959B01DA +:10108000AC01BD01CF01089597FB092E05260ED0B6 +:1010900057FD04D0D7DF0AD0001C38F45095409596 +:1010A000309521953F4F4F4F5F4F0895F6F790953C +:1010B0008095709561957F4F8F4F9F4F0895F8945D +:0210C000FFCF60 +:1010C200000340000004400000020800000000008D +:0810D200000000000000140002 +:00000001FF diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c index 715ff2b8a49..088003db4ff 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c @@ -1,309 +1,309 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the Arduino-usbserial project. This file contains the main tasks of - * the project and is responsible for the initial application hardware configuration. - */ - -#include "Arduino-usbserial.h" - -/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ -RingBuff_t USBtoUSART_Buffer; - -/** Circular buffer to hold data from the serial port before it is sent to the host. */ -RingBuff_t USARTtoUSB_Buffer; - -/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ -volatile struct -{ - uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ - uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ - uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ -} PulseMSRemaining; - -/** LUFA CDC Class driver interface configuration and state information. This structure is - * passed to all CDC Class driver functions, so that multiple instances of the same class - * within a device can be differentiated from one another. - */ -USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = - { - .Config = - { - .ControlInterfaceNumber = 0, - - .DataINEndpointNumber = CDC_TX_EPNUM, - .DataINEndpointSize = CDC_TXRX_EPSIZE, - .DataINEndpointDoubleBank = false, - - .DataOUTEndpointNumber = CDC_RX_EPNUM, - .DataOUTEndpointSize = CDC_TXRX_EPSIZE, - .DataOUTEndpointDoubleBank = false, - - .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, - .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, - .NotificationEndpointDoubleBank = false, - }, - }; - -int ResetTimer = 0; -int tries = 20; -bool CurrentDTRState = false; -bool PreviousDTRState = false; -bool CurrentRTSState = false; -bool PreviousRTSState = false; -bool Selected1200BPS = false; - -void setResetPin(bool v) { - /* Target /RESET line */ - if (v) { - /* ACTIVE => OUTPUT LOW (0v on target /RESET) */ - AVR_RESET_LINE_DDR |= AVR_RESET_LINE_MASK; - AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; - //LEDs_TurnOnLEDs(LEDMASK_RX); - } else { - /* INACTIVE => set as INPUT (internal pullup on target /RESET keep it at 3.3v) */ - AVR_RESET_LINE_DDR &= ~AVR_RESET_LINE_MASK; - AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; - //LEDs_TurnOffLEDs(LEDMASK_RX); - } -} - -void setErasePin(bool v) { - if (v) { - AVR_ERASE_LINE_PORT &= ~AVR_ERASE_LINE_MASK; - //LEDs_TurnOnLEDs(LEDMASK_TX); - } else { - AVR_ERASE_LINE_PORT |= AVR_ERASE_LINE_MASK; - //LEDs_TurnOffLEDs(LEDMASK_TX); - } -} - - -/** Main program entry point. This routine contains the overall program flow, including initial - * setup of all components and the main program loop. - */ -int main(void) -{ - SetupHardware(); - - RingBuffer_InitBuffer(&USBtoUSART_Buffer); - RingBuffer_InitBuffer(&USARTtoUSB_Buffer); - - sei(); - - - for (;;) - { - - // Only try to read in bytes from the CDC interface if the transmit buffer is not full - if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) - { - int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); - - // Read bytes from the USB OUT endpoint into the USART transmit buffer - if (!(ReceivedByte < 0)) - RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); - } - - // Check if the UART receive buffer flush timer has expired or the buffer is nearly full - RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); - if ((TIFR0 & (1 << TOV0)) || (BufferCount > BUFFER_NEARLY_FULL)) - { - TIFR0 |= (1 << TOV0); - - if (USARTtoUSB_Buffer.Count) { - LEDs_TurnOnLEDs(LEDMASK_TX); - PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; - } - - // Read bytes from the USART receive buffer into the USB IN endpoint - while (BufferCount--) - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); - - // Turn off TX LED(s) once the TX pulse period has elapsed - if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) - LEDs_TurnOffLEDs(LEDMASK_TX); - - // Turn off RX LED(s) once the RX pulse period has elapsed - if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) - LEDs_TurnOffLEDs(LEDMASK_RX); - - if (ResetTimer > 0) - { - // SAM3X RESET/ERASE Sequence - // -------------------------- - // Between 60 and 120: do erase - if (ResetTimer >= 60 && ResetTimer <= 120) { - setErasePin(true); - } else { - setErasePin(false); - } - - // Between 1 and 50: do reset - if (ResetTimer >= 1 && ResetTimer <= 50) { - setResetPin(true); - } else { - setResetPin(false); - } - ResetTimer--; - } else { - setErasePin(false); - setResetPin(false); - } - } - - // Load the next byte from the USART transmit buffer into the USART - if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { - Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); - LEDs_TurnOnLEDs(LEDMASK_RX); - PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; - } - - CDC_Device_USBTask(&VirtualSerial_CDC_Interface); - USB_USBTask(); - } - -} - -/** Configures the board hardware and chip peripherals for the demo's functionality. */ -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - setResetPin(false); - - /* Target /ERASE line is active HIGH: there is a mosfet that inverts logic */ - AVR_ERASE_LINE_PORT |= AVR_ERASE_LINE_MASK; - AVR_ERASE_LINE_DDR |= AVR_ERASE_LINE_MASK; - - /* Hardware Initialization */ - Serial_Init(9600, false); - LEDs_Init(); - USB_Init(); - - /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ - TCCR0B = (1 << CS02); -} - -/** Event handler for the library USB Configuration Changed event. */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); -} - -/** Event handler for the library USB Unhandled Control Request event. */ -void EVENT_USB_Device_UnhandledControlRequest(void) -{ - CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); -} - -/** Event handler for the CDC Class driver Line Encoding Changed event. - * - * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced - */ -void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - uint8_t ConfigMask = 0; - - switch (CDCInterfaceInfo->State.LineEncoding.ParityType) - { - case CDC_PARITY_Odd: - ConfigMask = ((1 << UPM11) | (1 << UPM10)); - break; - case CDC_PARITY_Even: - ConfigMask = (1 << UPM11); - break; - } - - if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) - ConfigMask |= (1 << USBS1); - - switch (CDCInterfaceInfo->State.LineEncoding.DataBits) - { - case 6: - ConfigMask |= (1 << UCSZ10); - break; - case 7: - ConfigMask |= (1 << UCSZ11); - break; - case 8: - ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); - break; - } - - /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ - UCSR1B = 0; - UCSR1A = 0; - UCSR1C = 0; - - long bps = CDCInterfaceInfo->State.LineEncoding.BaudRateBPS; - Selected1200BPS = (bps == 1200); - - UBRR1 = SERIAL_2X_UBBRVAL(bps); - UCSR1C = ConfigMask; - UCSR1A = (1 << U2X1); - UCSR1B = (1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1); -} - -/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer - * for later transmission to the host. - */ -ISR(USART1_RX_vect, ISR_BLOCK) -{ - uint8_t ReceivedByte = UDR1; - - if (USB_DeviceState == DEVICE_STATE_Configured) - RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); -} - -/** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event. - * - * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced - */ -void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) -{ - PreviousDTRState = CurrentDTRState; - PreviousRTSState = CurrentRTSState; - CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); - CurrentRTSState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_RTS); - - if (Selected1200BPS) { - /* Start Erase / Reset procedure when receiving the magic "1200" baudrate */ - ResetTimer = 120; - } else if (!PreviousDTRState && CurrentDTRState) { - /* Reset on rising edge of DTR */ - ResetTimer = 50; - } -} - +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the Arduino-usbserial project. This file contains the main tasks of + * the project and is responsible for the initial application hardware configuration. + */ + +#include "Arduino-usbserial.h" + +/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ +RingBuff_t USBtoUSART_Buffer; + +/** Circular buffer to hold data from the serial port before it is sent to the host. */ +RingBuff_t USARTtoUSB_Buffer; + +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ +volatile struct +{ + uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ + uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ + uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ +} PulseMSRemaining; + +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = + { + .Config = + { + .ControlInterfaceNumber = 0, + + .DataINEndpointNumber = CDC_TX_EPNUM, + .DataINEndpointSize = CDC_TXRX_EPSIZE, + .DataINEndpointDoubleBank = false, + + .DataOUTEndpointNumber = CDC_RX_EPNUM, + .DataOUTEndpointSize = CDC_TXRX_EPSIZE, + .DataOUTEndpointDoubleBank = false, + + .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, + .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, + .NotificationEndpointDoubleBank = false, + }, + }; + +int ResetTimer = 0; +int tries = 20; +bool CurrentDTRState = false; +bool PreviousDTRState = false; +bool CurrentRTSState = false; +bool PreviousRTSState = false; +bool Selected1200BPS = false; + +void setResetPin(bool v) { + /* Target /RESET line */ + if (v) { + /* ACTIVE => OUTPUT LOW (0v on target /RESET) */ + AVR_RESET_LINE_DDR |= AVR_RESET_LINE_MASK; + AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; + //LEDs_TurnOnLEDs(LEDMASK_RX); + } else { + /* INACTIVE => set as INPUT (internal pullup on target /RESET keep it at 3.3v) */ + AVR_RESET_LINE_DDR &= ~AVR_RESET_LINE_MASK; + AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; + //LEDs_TurnOffLEDs(LEDMASK_RX); + } +} + +void setErasePin(bool v) { + if (v) { + AVR_ERASE_LINE_PORT &= ~AVR_ERASE_LINE_MASK; + //LEDs_TurnOnLEDs(LEDMASK_TX); + } else { + AVR_ERASE_LINE_PORT |= AVR_ERASE_LINE_MASK; + //LEDs_TurnOffLEDs(LEDMASK_TX); + } +} + + +/** Main program entry point. This routine contains the overall program flow, including initial + * setup of all components and the main program loop. + */ +int main(void) +{ + SetupHardware(); + + RingBuffer_InitBuffer(&USBtoUSART_Buffer); + RingBuffer_InitBuffer(&USARTtoUSB_Buffer); + + sei(); + + + for (;;) + { + + // Only try to read in bytes from the CDC interface if the transmit buffer is not full + if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) + { + int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); + + // Read bytes from the USB OUT endpoint into the USART transmit buffer + if (!(ReceivedByte < 0)) + RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); + } + + // Check if the UART receive buffer flush timer has expired or the buffer is nearly full + RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); + if ((TIFR0 & (1 << TOV0)) || (BufferCount > BUFFER_NEARLY_FULL)) + { + TIFR0 |= (1 << TOV0); + + if (USARTtoUSB_Buffer.Count) { + LEDs_TurnOnLEDs(LEDMASK_TX); + PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; + } + + // Read bytes from the USART receive buffer into the USB IN endpoint + while (BufferCount--) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); + + // Turn off TX LED(s) once the TX pulse period has elapsed + if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_TX); + + // Turn off RX LED(s) once the RX pulse period has elapsed + if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_RX); + + if (ResetTimer > 0) + { + // SAM3X RESET/ERASE Sequence + // -------------------------- + // Between 60 and 120: do erase + if (ResetTimer >= 60 && ResetTimer <= 120) { + setErasePin(true); + } else { + setErasePin(false); + } + + // Between 1 and 50: do reset + if (ResetTimer >= 1 && ResetTimer <= 50) { + setResetPin(true); + } else { + setResetPin(false); + } + ResetTimer--; + } else { + setErasePin(false); + setResetPin(false); + } + } + + // Load the next byte from the USART transmit buffer into the USART + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); + LEDs_TurnOnLEDs(LEDMASK_RX); + PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; + } + + CDC_Device_USBTask(&VirtualSerial_CDC_Interface); + USB_USBTask(); + } + +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + setResetPin(false); + + /* Target /ERASE line is active HIGH: there is a mosfet that inverts logic */ + AVR_ERASE_LINE_PORT |= AVR_ERASE_LINE_MASK; + AVR_ERASE_LINE_DDR |= AVR_ERASE_LINE_MASK; + + /* Hardware Initialization */ + Serial_Init(9600, false); + LEDs_Init(); + USB_Init(); + + /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ + TCCR0B = (1 << CS02); +} + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); +} + +/** Event handler for the library USB Unhandled Control Request event. */ +void EVENT_USB_Device_UnhandledControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); +} + +/** Event handler for the CDC Class driver Line Encoding Changed event. + * + * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced + */ +void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + uint8_t ConfigMask = 0; + + switch (CDCInterfaceInfo->State.LineEncoding.ParityType) + { + case CDC_PARITY_Odd: + ConfigMask = ((1 << UPM11) | (1 << UPM10)); + break; + case CDC_PARITY_Even: + ConfigMask = (1 << UPM11); + break; + } + + if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) + ConfigMask |= (1 << USBS1); + + switch (CDCInterfaceInfo->State.LineEncoding.DataBits) + { + case 6: + ConfigMask |= (1 << UCSZ10); + break; + case 7: + ConfigMask |= (1 << UCSZ11); + break; + case 8: + ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); + break; + } + + /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ + UCSR1B = 0; + UCSR1A = 0; + UCSR1C = 0; + + long bps = CDCInterfaceInfo->State.LineEncoding.BaudRateBPS; + Selected1200BPS = (bps == 1200); + + UBRR1 = SERIAL_2X_UBBRVAL(bps); + UCSR1C = ConfigMask; + UCSR1A = (1 << U2X1); + UCSR1B = (1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1); +} + +/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer + * for later transmission to the host. + */ +ISR(USART1_RX_vect, ISR_BLOCK) +{ + uint8_t ReceivedByte = UDR1; + + if (USB_DeviceState == DEVICE_STATE_Configured) + RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); +} + +/** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event. + * + * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced + */ +void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + PreviousDTRState = CurrentDTRState; + PreviousRTSState = CurrentRTSState; + CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); + CurrentRTSState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_RTS); + + if (Selected1200BPS) { + /* Start Erase / Reset procedure when receiving the magic "1200" baudrate */ + ResetTimer = 120; + } else if (!PreviousDTRState && CurrentDTRState) { + /* Reset on rising edge of DTR */ + ResetTimer = 50; + } +} + diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.h b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.h index 99fde3914b4..2183512c891 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.h +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.h @@ -1,79 +1,79 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Arduino-usbserial.c. - */ - -#ifndef _ARDUINO_USBSERIAL_H_ -#define _ARDUINO_USBSERIAL_H_ - - /* Includes: */ - #include - #include - #include - #include - - #include "Descriptors.h" - - #include "Lib/LightweightRingBuff.h" - - #include - #include - #include - #include - #include - - /* Macros: */ - /** LED mask for the library LED driver, to indicate TX activity. */ - #define LEDMASK_TX LEDS_LED1 - - /** LED mask for the library LED driver, to indicate RX activity. */ - #define LEDMASK_RX LEDS_LED2 - - /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ - #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) - - /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ - #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) - - /* Function Prototypes: */ - void SetupHardware(void); - - void EVENT_USB_Device_Connect(void); - void EVENT_USB_Device_Disconnect(void); - void EVENT_USB_Device_ConfigurationChanged(void); - void EVENT_USB_Device_UnhandledControlRequest(void); - - void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); - void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); - -#endif /* _ARDUINO_USBSERIAL_H_ */ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Arduino-usbserial.c. + */ + +#ifndef _ARDUINO_USBSERIAL_H_ +#define _ARDUINO_USBSERIAL_H_ + + /* Includes: */ + #include + #include + #include + #include + + #include "Descriptors.h" + + #include "Lib/LightweightRingBuff.h" + + #include + #include + #include + #include + #include + + /* Macros: */ + /** LED mask for the library LED driver, to indicate TX activity. */ + #define LEDMASK_TX LEDS_LED1 + + /** LED mask for the library LED driver, to indicate RX activity. */ + #define LEDMASK_RX LEDS_LED2 + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ + #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) + + /* Function Prototypes: */ + void SetupHardware(void); + + void EVENT_USB_Device_Connect(void); + void EVENT_USB_Device_Disconnect(void); + void EVENT_USB_Device_ConfigurationChanged(void); + void EVENT_USB_Device_UnhandledControlRequest(void); + + void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + +#endif /* _ARDUINO_USBSERIAL_H_ */ diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Board/LEDs.h b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Board/LEDs.h index 152e8f571c4..41465f22ddf 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Board/LEDs.h +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Board/LEDs.h @@ -1,110 +1,110 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/* - Board LEDs driver for the Benito board, from www.dorkbotpdx.org. -*/ - -#ifndef __LEDS_ARDUINOUNO_H__ -#define __LEDS_ARDUINOUNO_H__ - - /* Includes: */ - #include - -/* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(INCLUDE_FROM_LEDS_H) - #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** LED mask for the first LED on the board. */ - #define LEDS_LED1 (1 << 5) - - /** LED mask for the second LED on the board. */ - #define LEDS_LED2 (1 << 4) - - /** LED mask for all the LEDs on the board. */ - #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) - - /** LED mask for the none of the board LEDs */ - #define LEDS_NO_LEDS 0 - - /* Inline Functions: */ - #if !defined(__DOXYGEN__) - static inline void LEDs_Init(void) - { - DDRD |= LEDS_ALL_LEDS; - PORTD |= LEDS_ALL_LEDS; - } - - static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) - { - PORTD &= ~LEDMask; - } - - static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) - { - PORTD |= LEDMask; - } - - static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) - { - PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); - } - - static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) - { - PORTD = ((PORTD | ActiveMask) & ~LEDMask); - } - - static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) - { - PORTD ^= LEDMask; - } - - static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; - static inline uint8_t LEDs_GetLEDs(void) - { - return (PORTD & LEDS_ALL_LEDS); - } - #endif - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/* + Board LEDs driver for the Benito board, from www.dorkbotpdx.org. +*/ + +#ifndef __LEDS_ARDUINOUNO_H__ +#define __LEDS_ARDUINOUNO_H__ + + /* Includes: */ + #include + +/* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the first LED on the board. */ + #define LEDS_LED1 (1 << 5) + + /** LED mask for the second LED on the board. */ + #define LEDS_LED2 (1 << 4) + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the none of the board LEDs */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRD |= LEDS_ALL_LEDS; + PORTD |= LEDS_ALL_LEDS; + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + PORTD &= ~LEDMask; + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + PORTD |= LEDMask; + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) + { + PORTD = ((PORTD | ActiveMask) & ~LEDMask); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + PORTD ^= LEDMask; + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return (PORTD & LEDS_ALL_LEDS); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.c b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.c index 658508c6e8e..22ea8bed28a 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.c +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.c @@ -1,281 +1,281 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/* On some devices, there is a factory set internal serial number which can be automatically sent to the host as - * the device's serial number when the Device Descriptor's .SerialNumStrIndex entry is set to USE_INTERNAL_SERIAL. - * This allows the host to track a device across insertions on different ports, allowing them to retain allocated - * resources like COM port numbers and drivers. On demos using this feature, give a warning on unsupported devices - * so that the user can supply their own serial number descriptor instead or remove the USE_INTERNAL_SERIAL value - * from the Device Descriptor (forcing the host to generate a serial number for each device from the VID, PID and - * port location). - */ -#if (USE_INTERNAL_SERIAL == NO_DESCRIPTOR) - #warning USE_INTERNAL_SERIAL is not available on this AVR - please manually construct a device serial descriptor. -#endif - -/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ -USB_Descriptor_Device_t PROGMEM DeviceDescriptor = -{ - .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - - .USBSpecification = VERSION_BCD(01.10), - .Class = 0x02, - .SubClass = 0x00, - .Protocol = 0x00, - - .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - - .VendorID = 0x2341, // Arduino - .ProductID = 0x003D, // Arduino Due on board USB2Serial - - .ReleaseNumber = 0x0001, - - .ManufacturerStrIndex = 0x01, - .ProductStrIndex = 0x02, - .SerialNumStrIndex = USE_INTERNAL_SERIAL, - - .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS -}; - -/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ -USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = -{ - .Config = - { - .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 2, - - .ConfigurationNumber = 1, - .ConfigurationStrIndex = NO_DESCRIPTOR, - - .ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED), - - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) - }, - - .CDC_CCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 0, - .AlternateSetting = 0, - - .TotalEndpoints = 1, - - .Class = 0x02, - .SubClass = 0x02, - .Protocol = 0x01, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_Functional_IntHeader = - { - .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, - .SubType = 0x00, - - .Data = {0x01, 0x10} - }, - - .CDC_Functional_AbstractControlManagement = - { - .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), .Type = 0x24}, - .SubType = 0x02, - - .Data = {0x06} - }, - - .CDC_Functional_Union = - { - .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, - .SubType = 0x06, - - .Data = {0x00, 0x01} - }, - - .CDC_NotificationEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_NOTIFICATION_EPSIZE, - .PollingIntervalMS = 0xFF - }, - - .CDC_DCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 1, - .AlternateSetting = 0, - - .TotalEndpoints = 2, - - .Class = 0x0A, - .SubClass = 0x00, - .Protocol = 0x00, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_DataOutEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - }, - - .CDC_DataInEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - } -}; - -/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests - * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -USB_Descriptor_String_t PROGMEM LanguageString = -{ - .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, - - .UnicodeString = {LANGUAGE_ID_ENG} -}; - -/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable - * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -USB_Descriptor_String_t PROGMEM ManufacturerString = -{ - .Header = {.Size = USB_STRING_LEN(24), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino (www.arduino.cc)" -}; - -/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, - * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -USB_Descriptor_String_t PROGMEM ProductString = -{ - #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) - .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Uno" - #elif (ARDUINO_MODEL_PID == ARDUINO_DUE_PID) - .Header = {.Size = USB_STRING_LEN(22), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Due Prog. Port" - #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) - .Header = {.Size = USB_STRING_LEN(17), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Mega 2560" - #endif - -}; - -/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" - * documentation) by the application code so that the address and size of a requested descriptor can be given - * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function - * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the - * USB host. - */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = (void*)&DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = (void*)&ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - switch (DescriptorNumber) - { - case 0x00: - Address = (void*)&LanguageString; - Size = pgm_read_byte(&LanguageString.Header.Size); - break; - case 0x01: - Address = (void*)&ManufacturerString; - Size = pgm_read_byte(&ManufacturerString.Header.Size); - break; - case 0x02: - Address = (void*)&ProductString; - Size = pgm_read_byte(&ProductString.Header.Size); - break; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/* On some devices, there is a factory set internal serial number which can be automatically sent to the host as + * the device's serial number when the Device Descriptor's .SerialNumStrIndex entry is set to USE_INTERNAL_SERIAL. + * This allows the host to track a device across insertions on different ports, allowing them to retain allocated + * resources like COM port numbers and drivers. On demos using this feature, give a warning on unsupported devices + * so that the user can supply their own serial number descriptor instead or remove the USE_INTERNAL_SERIAL value + * from the Device Descriptor (forcing the host to generate a serial number for each device from the VID, PID and + * port location). + */ +#if (USE_INTERNAL_SERIAL == NO_DESCRIPTOR) + #warning USE_INTERNAL_SERIAL is not available on this AVR - please manually construct a device serial descriptor. +#endif + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +USB_Descriptor_Device_t PROGMEM DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = 0x02, + .SubClass = 0x00, + .Protocol = 0x00, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x2341, // Arduino + .ProductID = 0x003D, // Arduino Due on board USB2Serial + + .ReleaseNumber = 0x0001, + + .ManufacturerStrIndex = 0x01, + .ProductStrIndex = 0x02, + .SerialNumStrIndex = USE_INTERNAL_SERIAL, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED), + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = 0x02, + .SubClass = 0x02, + .Protocol = 0x01, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_IntHeader = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, + .SubType = 0x00, + + .Data = {0x01, 0x10} + }, + + .CDC_Functional_AbstractControlManagement = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), .Type = 0x24}, + .SubType = 0x02, + + .Data = {0x06} + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, + .SubType = 0x06, + + .Data = {0x00, 0x01} + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = 0x0A, + .SubClass = 0x00, + .Protocol = 0x00, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +USB_Descriptor_String_t PROGMEM LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable + * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t PROGMEM ManufacturerString = +{ + .Header = {.Size = USB_STRING_LEN(24), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino (www.arduino.cc)" +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t PROGMEM ProductString = +{ + #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Uno" + #elif (ARDUINO_MODEL_PID == ARDUINO_DUE_PID) + .Header = {.Size = USB_STRING_LEN(22), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Due Prog. Port" + #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) + .Header = {.Size = USB_STRING_LEN(17), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Mega 2560" + #endif + +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = (void*)&DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = (void*)&ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case 0x00: + Address = (void*)&LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case 0x01: + Address = (void*)&ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case 0x02: + Address = (void*)&ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.h b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.h index 69e4b6799a2..10e1d8f6fc0 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.h +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Descriptors.h @@ -1,89 +1,89 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - #include - #include - - /* Product-specific definitions: */ - #define ARDUINO_UNO_PID 0x0001 - #define ARDUINO_DUE_PID 0x003D - #define ARDUINO_MEGA2560_PID 0x0010 - - /* Macros: */ - /** Endpoint number of the CDC device-to-host notification IN endpoint. */ - #define CDC_NOTIFICATION_EPNUM 2 - - /** Endpoint number of the CDC device-to-host data IN endpoint. */ - #define CDC_TX_EPNUM 3 - - /** Endpoint number of the CDC host-to-device data OUT endpoint. */ - #define CDC_RX_EPNUM 4 - - /** Size in bytes of the CDC device-to-host notification IN endpoint. */ - #define CDC_NOTIFICATION_EPSIZE 8 - - /** Size in bytes of the CDC data IN and OUT endpoints. */ - #define CDC_TXRX_EPSIZE 64 - - /* Type Defines: */ - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - USB_Descriptor_Interface_t CDC_CCI_Interface; - CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; - CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement; - CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; - USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; - USB_Descriptor_Interface_t CDC_DCI_Interface; - USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; - USB_Descriptor_Endpoint_t CDC_DataInEndpoint; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + #include + #include + + /* Product-specific definitions: */ + #define ARDUINO_UNO_PID 0x0001 + #define ARDUINO_DUE_PID 0x003D + #define ARDUINO_MEGA2560_PID 0x0010 + + /* Macros: */ + /** Endpoint number of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number of the CDC device-to-host data IN endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number of the CDC host-to-device data OUT endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size in bytes of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /** Size in bytes of the CDC data IN and OUT endpoints. */ + #define CDC_TXRX_EPSIZE 64 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + USB_Descriptor_Interface_t CDC_CCI_Interface; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; + CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Lib/LightweightRingBuff.h b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Lib/LightweightRingBuff.h index fb48c1f7398..5a9a125c18b 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Lib/LightweightRingBuff.h +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/Lib/LightweightRingBuff.h @@ -1,197 +1,197 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Ultra lightweight ring buffer, for fast insertion/deletion. - */ - -#ifndef _ULW_RING_BUFF_H_ -#define _ULW_RING_BUFF_H_ - - /* Includes: */ - #include - - #include - #include - - /* Defines: */ - /** Size of each ring buffer, in data elements - must be between 1 and 255. */ - #define BUFFER_SIZE 128 - - /** Maximum number of data elements to buffer before forcing a flush. - * Must be less than BUFFER_SIZE - */ - #define BUFFER_NEARLY_FULL 96 - - /** Type of data to store into the buffer. */ - #define RingBuff_Data_t uint8_t - - /** Datatype which may be used to store the count of data stored in a buffer, retrieved - * via a call to \ref RingBuffer_GetCount(). - */ - #if (BUFFER_SIZE <= 0xFF) - #define RingBuff_Count_t uint8_t - #else - #define RingBuff_Count_t uint16_t - #endif - - /* Type Defines: */ - /** Type define for a new ring buffer object. Buffers should be initialized via a call to - * \ref RingBuffer_InitBuffer() before use. - */ - typedef struct - { - RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */ - RingBuff_Data_t* In; /**< Current storage location in the circular buffer */ - RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */ - RingBuff_Count_t Count; - } RingBuff_t; - - /* Inline Functions: */ - /** Initializes a ring buffer ready for use. Buffers must be initialized via this function - * before any operations are called upon them. Already initialized buffers may be reset - * by re-initializing them using this function. - * - * \param[out] Buffer Pointer to a ring buffer structure to initialize - */ - static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) - { - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Buffer->In = Buffer->Buffer; - Buffer->Out = Buffer->Buffer; - } - } - - /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed - * by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that - * the buffer cannot be modified while the computation takes place. This value should be cached - * when reading out the contents of the buffer, so that as small a time as possible is spent - * in an atomic lock. - * - * \note The value returned by this function is guaranteed to only be the minimum number of bytes - * stored in the given buffer; this value may change as other threads write new data and so - * the returned number should be used only to determine how many successive reads may safely - * be performed on the buffer. - * - * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed - */ - static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer) - { - RingBuff_Count_t Count; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Count = Buffer->Count; - } - - return Count; - } - - /** Atomically determines if the specified ring buffer contains any free space. This should - * be tested before storing data to the buffer, to ensure that no data is lost due to a - * buffer overrun. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to insert into - * - * \return Boolean true if the buffer contains no free space, false otherwise - */ - static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer) - { - return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE); - } - - /** Atomically determines if the specified ring buffer contains any data. This should - * be tested before removing data from the buffer, to ensure that the buffer does not - * underflow. - * - * If the data is to be removed in a loop, store the total number of bytes stored in the - * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable - * to reduce the time spent in atomicity locks. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to insert into - * - * \return Boolean true if the buffer contains no free space, false otherwise - */ - static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer) - { - return (RingBuffer_GetCount(Buffer) == 0); - } - - /** Inserts an element into the ring buffer. - * - * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer - * otherwise data corruption may occur. Insertion and removal may occur from different execution - * threads. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to insert into - * \param[in] Data Data element to insert into the buffer - */ - static inline void RingBuffer_Insert(RingBuff_t* const Buffer, - const RingBuff_Data_t Data) - { - *Buffer->In = Data; - - if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) - Buffer->In = Buffer->Buffer; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Buffer->Count++; - } - } - - /** Removes an element from the ring buffer. - * - * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer - * otherwise data corruption may occur. Insertion and removal may occur from different execution - * threads. - * - * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from - * - * \return Next data element stored in the buffer - */ - static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) - { - RingBuff_Data_t Data = *Buffer->Out; - - if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) - Buffer->Out = Buffer->Buffer; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - Buffer->Count--; - } - - return Data; - } - -#endif +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Ultra lightweight ring buffer, for fast insertion/deletion. + */ + +#ifndef _ULW_RING_BUFF_H_ +#define _ULW_RING_BUFF_H_ + + /* Includes: */ + #include + + #include + #include + + /* Defines: */ + /** Size of each ring buffer, in data elements - must be between 1 and 255. */ + #define BUFFER_SIZE 128 + + /** Maximum number of data elements to buffer before forcing a flush. + * Must be less than BUFFER_SIZE + */ + #define BUFFER_NEARLY_FULL 96 + + /** Type of data to store into the buffer. */ + #define RingBuff_Data_t uint8_t + + /** Datatype which may be used to store the count of data stored in a buffer, retrieved + * via a call to \ref RingBuffer_GetCount(). + */ + #if (BUFFER_SIZE <= 0xFF) + #define RingBuff_Count_t uint8_t + #else + #define RingBuff_Count_t uint16_t + #endif + + /* Type Defines: */ + /** Type define for a new ring buffer object. Buffers should be initialized via a call to + * \ref RingBuffer_InitBuffer() before use. + */ + typedef struct + { + RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */ + RingBuff_Data_t* In; /**< Current storage location in the circular buffer */ + RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */ + RingBuff_Count_t Count; + } RingBuff_t; + + /* Inline Functions: */ + /** Initializes a ring buffer ready for use. Buffers must be initialized via this function + * before any operations are called upon them. Already initialized buffers may be reset + * by re-initializing them using this function. + * + * \param[out] Buffer Pointer to a ring buffer structure to initialize + */ + static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) + { + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->In = Buffer->Buffer; + Buffer->Out = Buffer->Buffer; + } + } + + /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed + * by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that + * the buffer cannot be modified while the computation takes place. This value should be cached + * when reading out the contents of the buffer, so that as small a time as possible is spent + * in an atomic lock. + * + * \note The value returned by this function is guaranteed to only be the minimum number of bytes + * stored in the given buffer; this value may change as other threads write new data and so + * the returned number should be used only to determine how many successive reads may safely + * be performed on the buffer. + * + * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed + */ + static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer) + { + RingBuff_Count_t Count; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Count = Buffer->Count; + } + + return Count; + } + + /** Atomically determines if the specified ring buffer contains any free space. This should + * be tested before storing data to the buffer, to ensure that no data is lost due to a + * buffer overrun. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * + * \return Boolean true if the buffer contains no free space, false otherwise + */ + static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer) + { + return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE); + } + + /** Atomically determines if the specified ring buffer contains any data. This should + * be tested before removing data from the buffer, to ensure that the buffer does not + * underflow. + * + * If the data is to be removed in a loop, store the total number of bytes stored in the + * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable + * to reduce the time spent in atomicity locks. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * + * \return Boolean true if the buffer contains no free space, false otherwise + */ + static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer) + { + return (RingBuffer_GetCount(Buffer) == 0); + } + + /** Inserts an element into the ring buffer. + * + * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer + * otherwise data corruption may occur. Insertion and removal may occur from different execution + * threads. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * \param[in] Data Data element to insert into the buffer + */ + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, + const RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->Count++; + } + } + + /** Removes an element from the ring buffer. + * + * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer + * otherwise data corruption may occur. Insertion and removal may occur from different execution + * threads. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from + * + * \return Next data element stored in the buffer + */ + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->Count--; + } + + return Data; + } + +#endif diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/makefile b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/makefile index 6899dd39216..9d00e1418bf 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/makefile +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/makefile @@ -1,792 +1,792 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# MCU name(s) -# Since the ATMEGA8U2 part is not directly supported by the current -# versions of either avrdude or dfu-programmer, we specify a dummy -# part; AT90USB82 which is close enough in memory size and organization - -#MCU = atmega8u2 -MCU = atmega16u2 -#MCU = atmega32u2 - -# MCU_AVRDUDE = at90usb82 -# MCU_DFU = at90usb82 -MCU_AVRDUDE = $(MCU) -MCU_DFU = $(MCU) - -# Specify the Arduino model using the assigned PID. This is used by Descriptors.c -# to set PID and product descriptor string -# Uno PID: -#ARDUINO_MODEL_PID = 0x0001 -# Mega 2560 PID: -#ARDUINO_MODEL_PID = 0x0010 -# Due PID: -ARDUINO_MODEL_PID = 0x003D - - - -# Target board (see library "Board Types" documentation, NONE for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USER - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_CLOCK below, as it is sourced by -# F_CLOCK after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -#F_CPU = 8000000 -F_CPU = 16000000 - - -# Input clock frequency. -# This will define a symbol, F_CLOCK, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_CLOCK = $(F_CPU) - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = Arduino-usbserial - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Path to the LUFA library -LUFA_PATH = ../.. - - -# LUFA library compile-time options -LUFA_OPTS = -D USB_DEVICE_ONLY -LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 -LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 -LUFA_OPTS += -D USE_FLASH_DESCRIPTORS -LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT -LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" - - -# Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - $(LUFA_SRC_USBCLASS) \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Device.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/HostStandardReq.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Pipe.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBController.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/Events.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBInterrupt.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBTask.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/CDC.c \ - $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/CDC.c - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(LUFA_PATH)/ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=gnu99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -CDEFS += -DF_CLOCK=$(F_CLOCK)UL -CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) -CDEFS += -DBOARD=BOARD_$(BOARD) -CDEFS += $(LUFA_OPTS) - -CDEFS += -DAVR_RESET_LINE_PORT="PORTC" -CDEFS += -DAVR_RESET_LINE_DDR="DDRC" -CDEFS += -DAVR_RESET_LINE_MASK="(1 << 7)" - -CDEFS += -DAVR_ERASE_LINE_PORT="PORTC" -CDEFS += -DAVR_ERASE_LINE_DDR="DDRC" -CDEFS += -DAVR_ERASE_LINE_MASK="(1 << 6)" - -CDEFS += -DTX_RX_LED_PULSE_MS=3 -CDEFS += -DPING_PONG_LED_PULSE_MS=100 - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) -ADEFS += -DF_CLOCK=$(F_CLOCK)UL -ADEFS += -DBOARD=BOARD_$(BOARD) -ADEFS += $(LUFA_OPTS) - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL -CPPDEFS += -DBOARD=BOARD_$(BOARD) -CPPDEFS += $(LUFA_OPTS) -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CPPFLAGS += -Wundef -CFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = avrispmkii - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FORCE = -F - -AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) -AVRDUDE_FLAGS += $(AVRDUDE_FORCE) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -#all: begin gccversion sizebefore build checkinvalidevents showliboptions showtarget sizeafter end -all: begin gccversion sizebefore build showliboptions showtarget sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym asm -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -asm: $(TARGET).s -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -#$(LUFA_PATH)/LUFA/LUFA_Events.lst: -# @make -C $(LUFA_PATH)/LUFA/ LUFA_Events.lst - -#checkinvalidevents: $(LUFA_PATH)/LUFA/LUFA_Events.lst -# @echo -# @echo Checking for invalid events... -# @$(shell) avr-nm $(OBJ) | sed -n -e 's/^.*EVENT_/EVENT_/p' | \ -# grep -F -v --file=$(LUFA_PATH)/LUFA/LUFA_Events.lst > InvalidEvents.tmp || true -# @sed -n -e 's/^/ WARNING - INVALID EVENT NAME: /p' InvalidEvents.tmp -# @if test -s InvalidEvents.tmp; then exit 1; fi - -showliboptions: - @echo - @echo ---- Compile Time Library Options ---- - @for i in $(LUFA_OPTS:-D%=%); do \ - echo $$i; \ - done - @echo -------------------------------------- - -showtarget: - @echo - @echo --------- Target Information --------- - @echo AVR Model: $(MCU) - @echo Board: $(BOARD) - @echo Clock: $(F_CPU)Hz CPU, $(F_CLOCK)Hz Master - @echo -------------------------------------- - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - -flip: $(TARGET).hex - batchisp -hardware usb -device $(MCU_DFU) -operation erase f - batchisp -hardware usb -device $(MCU_DFU) -operation loadbuffer $(TARGET).hex program - batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 - -dfu: $(TARGET).hex - dfu-programmer $(MCU_DFU) erase - dfu-programmer $(MCU_DFU) flash --debug 1 $(TARGET).hex - dfu-programmer $(MCU_DFU) reset - - -flip-ee: $(TARGET).hex $(TARGET).eep - $(COPY) $(TARGET).eep $(TARGET)eep.hex - batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM erase - batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program - batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 - $(REMOVE) $(TARGET)eep.hex - -dfu-ee: $(TARGET).hex $(TARGET).eep - dfu-programmer $(MCU_DFU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep - dfu-programmer $(MCU_DFU) reset - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -z $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list clean_binary end - -clean_binary: - $(REMOVE) $(TARGET).hex - -clean_list: - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - -doxygen: - @echo Generating Project Documentation... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff doxygen clean \ -clean_list clean_doxygen program dfu flip flip-ee dfu-ee \ -debug gdb-config +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# MCU name(s) +# Since the ATMEGA8U2 part is not directly supported by the current +# versions of either avrdude or dfu-programmer, we specify a dummy +# part; AT90USB82 which is close enough in memory size and organization + +#MCU = atmega8u2 +MCU = atmega16u2 +#MCU = atmega32u2 + +# MCU_AVRDUDE = at90usb82 +# MCU_DFU = at90usb82 +MCU_AVRDUDE = $(MCU) +MCU_DFU = $(MCU) + +# Specify the Arduino model using the assigned PID. This is used by Descriptors.c +# to set PID and product descriptor string +# Uno PID: +#ARDUINO_MODEL_PID = 0x0001 +# Mega 2560 PID: +#ARDUINO_MODEL_PID = 0x0010 +# Due PID: +ARDUINO_MODEL_PID = 0x003D + + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_CLOCK below, as it is sourced by +# F_CLOCK after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +#F_CPU = 8000000 +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_CLOCK, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_CLOCK = $(F_CPU) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Arduino-usbserial + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../.. + + +# LUFA library compile-time options +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_FLASH_DESCRIPTORS +LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + $(LUFA_SRC_USBCLASS) \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Device.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/HostStandardReq.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Pipe.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBController.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/Events.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBInterrupt.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBTask.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/CDC.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/CDC.c + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=gnu99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_CLOCK=$(F_CLOCK)UL +CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) +CDEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += $(LUFA_OPTS) + +CDEFS += -DAVR_RESET_LINE_PORT="PORTC" +CDEFS += -DAVR_RESET_LINE_DDR="DDRC" +CDEFS += -DAVR_RESET_LINE_MASK="(1 << 7)" + +CDEFS += -DAVR_ERASE_LINE_PORT="PORTC" +CDEFS += -DAVR_ERASE_LINE_DDR="DDRC" +CDEFS += -DAVR_ERASE_LINE_MASK="(1 << 6)" + +CDEFS += -DTX_RX_LED_PULSE_MS=3 +CDEFS += -DPING_PONG_LED_PULSE_MS=100 + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_CLOCK=$(F_CLOCK)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += $(LUFA_OPTS) + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +CFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkii + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FORCE = -F + +AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) +AVRDUDE_FLAGS += $(AVRDUDE_FORCE) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +#all: begin gccversion sizebefore build checkinvalidevents showliboptions showtarget sizeafter end +all: begin gccversion sizebefore build showliboptions showtarget sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym asm +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +asm: $(TARGET).s +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +#$(LUFA_PATH)/LUFA/LUFA_Events.lst: +# @make -C $(LUFA_PATH)/LUFA/ LUFA_Events.lst + +#checkinvalidevents: $(LUFA_PATH)/LUFA/LUFA_Events.lst +# @echo +# @echo Checking for invalid events... +# @$(shell) avr-nm $(OBJ) | sed -n -e 's/^.*EVENT_/EVENT_/p' | \ +# grep -F -v --file=$(LUFA_PATH)/LUFA/LUFA_Events.lst > InvalidEvents.tmp || true +# @sed -n -e 's/^/ WARNING - INVALID EVENT NAME: /p' InvalidEvents.tmp +# @if test -s InvalidEvents.tmp; then exit 1; fi + +showliboptions: + @echo + @echo ---- Compile Time Library Options ---- + @for i in $(LUFA_OPTS:-D%=%); do \ + echo $$i; \ + done + @echo -------------------------------------- + +showtarget: + @echo + @echo --------- Target Information --------- + @echo AVR Model: $(MCU) + @echo Board: $(BOARD) + @echo Clock: $(F_CPU)Hz CPU, $(F_CLOCK)Hz Master + @echo -------------------------------------- + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +flip: $(TARGET).hex + batchisp -hardware usb -device $(MCU_DFU) -operation erase f + batchisp -hardware usb -device $(MCU_DFU) -operation loadbuffer $(TARGET).hex program + batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 + +dfu: $(TARGET).hex + dfu-programmer $(MCU_DFU) erase + dfu-programmer $(MCU_DFU) flash --debug 1 $(TARGET).hex + dfu-programmer $(MCU_DFU) reset + + +flip-ee: $(TARGET).hex $(TARGET).eep + $(COPY) $(TARGET).eep $(TARGET)eep.hex + batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM erase + batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program + batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 + $(REMOVE) $(TARGET)eep.hex + +dfu-ee: $(TARGET).hex $(TARGET).eep + dfu-programmer $(MCU_DFU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep + dfu-programmer $(MCU_DFU) reset + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list clean_binary end + +clean_binary: + $(REMOVE) $(TARGET).hex + +clean_list: + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program dfu flip flip-ee dfu-ee \ +debug gdb-config diff --git a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/readme.txt b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/readme.txt index ca9f0221b7c..7d58a738212 100644 --- a/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/readme.txt +++ b/hardware/arduino/sam/firmwares/atmega16u2/arduino-usbserial/readme.txt @@ -1,14 +1,14 @@ -To setup the project and upload the Arduino usbserial application firmware to an ATMEGA32U2 using the Arduino USB DFU bootloader: -1. unpack the source into LUFA's Projects directory -2. set ARDUINO_MODEL_PID in the makefile as appropriate -3. do "make clean; make" -4. put the 32U2 into USB DFU mode: -4.a. assert and hold the 32U2's RESET line -4.b. assert and hold the 32U2's HWB line -4.c. release the 32U2's RESET line -4.d. release the 32U2's HWB line -5. confirm that the board enumerates as "ATmega32u2" -6. do "make dfu" (OS X or Linux - dfu-programmer must be installed first) or "make flip" (Windows - Flip must be installed first) - -Check that the board enumerates as "Arduino Mega 2560". -Test by uploading a new Arduino sketch from the Arduino IDE. +To setup the project and upload the Arduino usbserial application firmware to an ATMEGA32U2 using the Arduino USB DFU bootloader: +1. unpack the source into LUFA's Projects directory +2. set ARDUINO_MODEL_PID in the makefile as appropriate +3. do "make clean; make" +4. put the 32U2 into USB DFU mode: +4.a. assert and hold the 32U2's RESET line +4.b. assert and hold the 32U2's HWB line +4.c. release the 32U2's RESET line +4.d. release the 32U2's HWB line +5. confirm that the board enumerates as "ATmega32u2" +6. do "make dfu" (OS X or Linux - dfu-programmer must be installed first) or "make flip" (Windows - Flip must be installed first) + +Check that the board enumerates as "Arduino Mega 2560". +Test by uploading a new Arduino sketch from the Arduino IDE. diff --git a/hardware/arduino/sam/libraries/Ethernet/Dhcp.cpp b/hardware/arduino/sam/libraries/Ethernet/Dhcp.cpp index 56d5b69516e..9e5262c3d31 100644 --- a/hardware/arduino/sam/libraries/Ethernet/Dhcp.cpp +++ b/hardware/arduino/sam/libraries/Ethernet/Dhcp.cpp @@ -1,480 +1,480 @@ -// DHCP Library v0.3 - April 25, 2009 -// Author: Jordan Terrell - blog.jordanterrell.com - -#include "w5100.h" - -#include -#include -#include "Dhcp.h" -#include "Arduino.h" -#include "util.h" - -int DhcpClass::beginWithDHCP(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) -{ - _dhcpLeaseTime=0; - _dhcpT1=0; - _dhcpT2=0; - _lastCheck=0; - _timeout = timeout; - _responseTimeout = responseTimeout; - - // zero out _dhcpMacAddr - memset(_dhcpMacAddr, 0, 6); - reset_DHCP_lease(); - - memcpy((void*)_dhcpMacAddr, (void*)mac, 6); - _dhcp_state = STATE_DHCP_START; - return request_DHCP_lease(); -} - -void DhcpClass::reset_DHCP_lease(){ - // zero out _dhcpSubnetMask, _dhcpGatewayIp, _dhcpLocalIp, _dhcpDhcpServerIp, _dhcpDnsServerIp - memset(_dhcpLocalIp, 0, 20); -} - -//return:0 on error, 1 if request is sent and response is received -int DhcpClass::request_DHCP_lease(){ - - uint8_t messageType = 0; - - - - // Pick an initial transaction ID - _dhcpTransactionId = random(1UL, 2000UL); - _dhcpInitialTransactionId = _dhcpTransactionId; - - _dhcpUdpSocket.stop(); - if (_dhcpUdpSocket.begin(DHCP_CLIENT_PORT) == 0) - { - // Couldn't get a socket - return 0; - } - - presend_DHCP(); - - int result = 0; - - unsigned long startTime = millis(); - - while(_dhcp_state != STATE_DHCP_LEASED) - { - if(_dhcp_state == STATE_DHCP_START) - { - _dhcpTransactionId++; - - send_DHCP_MESSAGE(DHCP_DISCOVER, ((millis() - startTime) / 1000)); - _dhcp_state = STATE_DHCP_DISCOVER; - } - else if(_dhcp_state == STATE_DHCP_REREQUEST){ - _dhcpTransactionId++; - send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime)/1000)); - _dhcp_state = STATE_DHCP_REQUEST; - } - else if(_dhcp_state == STATE_DHCP_DISCOVER) - { - uint32_t respId; - messageType = parseDHCPResponse(_responseTimeout, respId); - if(messageType == DHCP_OFFER) - { - // We'll use the transaction ID that the offer came with, - // rather than the one we were up to - _dhcpTransactionId = respId; - send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime) / 1000)); - _dhcp_state = STATE_DHCP_REQUEST; - } - } - else if(_dhcp_state == STATE_DHCP_REQUEST) - { - uint32_t respId; - messageType = parseDHCPResponse(_responseTimeout, respId); - if(messageType == DHCP_ACK) - { - _dhcp_state = STATE_DHCP_LEASED; - result = 1; - //use default lease time if we didn't get it - if(_dhcpLeaseTime == 0){ - _dhcpLeaseTime = DEFAULT_LEASE; - } - //calculate T1 & T2 if we didn't get it - if(_dhcpT1 == 0){ - //T1 should be 50% of _dhcpLeaseTime - _dhcpT1 = _dhcpLeaseTime >> 1; - } - if(_dhcpT2 == 0){ - //T2 should be 87.5% (7/8ths) of _dhcpLeaseTime - _dhcpT2 = _dhcpT1 << 1; - } - _renewInSec = _dhcpT1; - _rebindInSec = _dhcpT2; - } - else if(messageType == DHCP_NAK) - _dhcp_state = STATE_DHCP_START; - } - - if(messageType == 255) - { - messageType = 0; - _dhcp_state = STATE_DHCP_START; - } - - if(result != 1 && ((millis() - startTime) > _timeout)) - break; - } - - // We're done with the socket now - _dhcpUdpSocket.stop(); - _dhcpTransactionId++; - - return result; -} - -void DhcpClass::presend_DHCP() -{ -} - -void DhcpClass::send_DHCP_MESSAGE(uint8_t messageType, uint16_t secondsElapsed) -{ - uint8_t buffer[32]; - memset(buffer, 0, 32); - IPAddress dest_addr( 255, 255, 255, 255 ); // Broadcast address - - if (-1 == _dhcpUdpSocket.beginPacket(dest_addr, DHCP_SERVER_PORT)) - { - // FIXME Need to return errors - return; - } - - buffer[0] = DHCP_BOOTREQUEST; // op - buffer[1] = DHCP_HTYPE10MB; // htype - buffer[2] = DHCP_HLENETHERNET; // hlen - buffer[3] = DHCP_HOPS; // hops - - // xid - unsigned long xid = htonl(_dhcpTransactionId); - memcpy(buffer + 4, &(xid), 4); - - // 8, 9 - seconds elapsed - buffer[8] = ((secondsElapsed & 0xff00) >> 8); - buffer[9] = (secondsElapsed & 0x00ff); - - // flags - unsigned short flags = htons(DHCP_FLAGSBROADCAST); - memcpy(buffer + 10, &(flags), 2); - - // ciaddr: already zeroed - // yiaddr: already zeroed - // siaddr: already zeroed - // giaddr: already zeroed - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 28); - - memset(buffer, 0, 32); // clear local buffer - - memcpy(buffer, _dhcpMacAddr, 6); // chaddr - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 16); - - memset(buffer, 0, 32); // clear local buffer - - // leave zeroed out for sname && file - // put in W5100 transmit buffer x 6 (192 bytes) - - for(int i = 0; i < 6; i++) { - _dhcpUdpSocket.write(buffer, 32); - } - - // OPT - Magic Cookie - buffer[0] = (uint8_t)((MAGIC_COOKIE >> 24)& 0xFF); - buffer[1] = (uint8_t)((MAGIC_COOKIE >> 16)& 0xFF); - buffer[2] = (uint8_t)((MAGIC_COOKIE >> 8)& 0xFF); - buffer[3] = (uint8_t)(MAGIC_COOKIE& 0xFF); - - // OPT - message type - buffer[4] = dhcpMessageType; - buffer[5] = 0x01; - buffer[6] = messageType; //DHCP_REQUEST; - - // OPT - client identifier - buffer[7] = dhcpClientIdentifier; - buffer[8] = 0x07; - buffer[9] = 0x01; - memcpy(buffer + 10, _dhcpMacAddr, 6); - - // OPT - host name - buffer[16] = hostName; - buffer[17] = strlen(HOST_NAME) + 6; // length of hostname + last 3 bytes of mac address - strcpy((char*)&(buffer[18]), HOST_NAME); - - printByte((char*)&(buffer[24]), _dhcpMacAddr[3]); - printByte((char*)&(buffer[26]), _dhcpMacAddr[4]); - printByte((char*)&(buffer[28]), _dhcpMacAddr[5]); - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 30); - - if(messageType == DHCP_REQUEST) - { - buffer[0] = dhcpRequestedIPaddr; - buffer[1] = 0x04; - buffer[2] = _dhcpLocalIp[0]; - buffer[3] = _dhcpLocalIp[1]; - buffer[4] = _dhcpLocalIp[2]; - buffer[5] = _dhcpLocalIp[3]; - - buffer[6] = dhcpServerIdentifier; - buffer[7] = 0x04; - buffer[8] = _dhcpDhcpServerIp[0]; - buffer[9] = _dhcpDhcpServerIp[1]; - buffer[10] = _dhcpDhcpServerIp[2]; - buffer[11] = _dhcpDhcpServerIp[3]; - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 12); - } - - buffer[0] = dhcpParamRequest; - buffer[1] = 0x06; - buffer[2] = subnetMask; - buffer[3] = routersOnSubnet; - buffer[4] = dns; - buffer[5] = domainName; - buffer[6] = dhcpT1value; - buffer[7] = dhcpT2value; - buffer[8] = endOption; - - //put data in W5100 transmit buffer - _dhcpUdpSocket.write(buffer, 9); - - _dhcpUdpSocket.endPacket(); -} - -uint8_t DhcpClass::parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId) -{ - uint8_t type = 0; - uint8_t opt_len = 0; - - unsigned long startTime = millis(); - - while(_dhcpUdpSocket.parsePacket() <= 0) - { - if((millis() - startTime) > responseTimeout) - { - return 255; - } - delay(50); - } - // start reading in the packet - RIP_MSG_FIXED fixedMsg; - _dhcpUdpSocket.read((uint8_t*)&fixedMsg, sizeof(RIP_MSG_FIXED)); - - if(fixedMsg.op == DHCP_BOOTREPLY && _dhcpUdpSocket.remotePort() == DHCP_SERVER_PORT) - { - transactionId = ntohl(fixedMsg.xid); - if(memcmp(fixedMsg.chaddr, _dhcpMacAddr, 6) != 0 || (transactionId < _dhcpInitialTransactionId) || (transactionId > _dhcpTransactionId)) - { - // Need to read the rest of the packet here regardless - _dhcpUdpSocket.flush(); - return 0; - } - - memcpy(_dhcpLocalIp, fixedMsg.yiaddr, 4); - - // Skip to the option part - // Doing this a byte at a time so we don't have to put a big buffer - // on the stack (as we don't have lots of memory lying around) - for (int i =0; i < (240 - (int)sizeof(RIP_MSG_FIXED)); i++) - { - _dhcpUdpSocket.read(); // we don't care about the returned byte - } - - while (_dhcpUdpSocket.available() > 0) - { - switch (_dhcpUdpSocket.read()) - { - case endOption : - break; - - case padOption : - break; - - case dhcpMessageType : - opt_len = _dhcpUdpSocket.read(); - type = _dhcpUdpSocket.read(); - break; - - case subnetMask : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read(_dhcpSubnetMask, 4); - break; - - case routersOnSubnet : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read(_dhcpGatewayIp, 4); - for (int i = 0; i < opt_len-4; i++) - { - _dhcpUdpSocket.read(); - } - break; - - case dns : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read(_dhcpDnsServerIp, 4); - for (int i = 0; i < opt_len-4; i++) - { - _dhcpUdpSocket.read(); - } - break; - - case dhcpServerIdentifier : - opt_len = _dhcpUdpSocket.read(); - if( *((uint32_t*)_dhcpDhcpServerIp) == 0 || - IPAddress(_dhcpDhcpServerIp) == _dhcpUdpSocket.remoteIP() ) - { - _dhcpUdpSocket.read(_dhcpDhcpServerIp, sizeof(_dhcpDhcpServerIp)); - } - else - { - // Skip over the rest of this option - while (opt_len--) - { - _dhcpUdpSocket.read(); - } - } - break; - - case dhcpT1value : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read((uint8_t*)&_dhcpT1, sizeof(_dhcpT1)); - _dhcpT1 = ntohl(_dhcpT1); - break; - - case dhcpT2value : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read((uint8_t*)&_dhcpT2, sizeof(_dhcpT2)); - _dhcpT2 = ntohl(_dhcpT2); - break; - - case dhcpIPaddrLeaseTime : - opt_len = _dhcpUdpSocket.read(); - _dhcpUdpSocket.read((uint8_t*)&_dhcpLeaseTime, sizeof(_dhcpLeaseTime)); - _dhcpLeaseTime = ntohl(_dhcpLeaseTime); - _renewInSec = _dhcpLeaseTime; - break; - - default : - opt_len = _dhcpUdpSocket.read(); - // Skip over the rest of this option - while (opt_len--) - { - _dhcpUdpSocket.read(); - } - break; - } - } - } - - // Need to skip to end of the packet regardless here - _dhcpUdpSocket.flush(); - - return type; -} - - -/* - returns: - 0/DHCP_CHECK_NONE: nothing happened - 1/DHCP_CHECK_RENEW_FAIL: renew failed - 2/DHCP_CHECK_RENEW_OK: renew success - 3/DHCP_CHECK_REBIND_FAIL: rebind fail - 4/DHCP_CHECK_REBIND_OK: rebind success -*/ -int DhcpClass::checkLease(){ - //this uses a signed / unsigned trick to deal with millis overflow - unsigned long now = millis(); - signed long snow = (long)now; - int rc=DHCP_CHECK_NONE; - if (_lastCheck != 0){ - signed long factor; - //calc how many ms past the timeout we are - factor = snow - (long)_secTimeout; - //if on or passed the timeout, reduce the counters - if ( factor >= 0 ){ - //next timeout should be now plus 1000 ms minus parts of second in factor - _secTimeout = snow + 1000 - factor % 1000; - //how many seconds late are we, minimum 1 - factor = factor / 1000 +1; - - //reduce the counters by that mouch - //if we can assume that the cycle time (factor) is fairly constant - //and if the remainder is less than cycle time * 2 - //do it early instead of late - if(_renewInSec < factor*2 ) - _renewInSec = 0; - else - _renewInSec -= factor; - - if(_rebindInSec < factor*2 ) - _rebindInSec = 0; - else - _rebindInSec -= factor; - } - - //if we have a lease but should renew, do it - if (_dhcp_state == STATE_DHCP_LEASED && _renewInSec <=0){ - _dhcp_state = STATE_DHCP_REREQUEST; - rc = 1 + request_DHCP_lease(); - } - - //if we have a lease or is renewing but should bind, do it - if( (_dhcp_state == STATE_DHCP_LEASED || _dhcp_state == STATE_DHCP_START) && _rebindInSec <=0){ - //this should basically restart completely - _dhcp_state = STATE_DHCP_START; - reset_DHCP_lease(); - rc = 3 + request_DHCP_lease(); - } - } - else{ - _secTimeout = snow + 1000; - } - - _lastCheck = now; - return rc; -} - -IPAddress DhcpClass::getLocalIp() -{ - return IPAddress(_dhcpLocalIp); -} - -IPAddress DhcpClass::getSubnetMask() -{ - return IPAddress(_dhcpSubnetMask); -} - -IPAddress DhcpClass::getGatewayIp() -{ - return IPAddress(_dhcpGatewayIp); -} - -IPAddress DhcpClass::getDhcpServerIp() -{ - return IPAddress(_dhcpDhcpServerIp); -} - -IPAddress DhcpClass::getDnsServerIp() -{ - return IPAddress(_dhcpDnsServerIp); -} - -void DhcpClass::printByte(char * buf, uint8_t n ) { - char *str = &buf[1]; - buf[0]='0'; - do { - unsigned long m = n; - n /= 16; - char c = m - 16 * n; - *str-- = c < 10 ? c + '0' : c + 'A' - 10; - } while(n); -} +// DHCP Library v0.3 - April 25, 2009 +// Author: Jordan Terrell - blog.jordanterrell.com + +#include "w5100.h" + +#include +#include +#include "Dhcp.h" +#include "Arduino.h" +#include "util.h" + +int DhcpClass::beginWithDHCP(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) +{ + _dhcpLeaseTime=0; + _dhcpT1=0; + _dhcpT2=0; + _lastCheck=0; + _timeout = timeout; + _responseTimeout = responseTimeout; + + // zero out _dhcpMacAddr + memset(_dhcpMacAddr, 0, 6); + reset_DHCP_lease(); + + memcpy((void*)_dhcpMacAddr, (void*)mac, 6); + _dhcp_state = STATE_DHCP_START; + return request_DHCP_lease(); +} + +void DhcpClass::reset_DHCP_lease(){ + // zero out _dhcpSubnetMask, _dhcpGatewayIp, _dhcpLocalIp, _dhcpDhcpServerIp, _dhcpDnsServerIp + memset(_dhcpLocalIp, 0, 20); +} + +//return:0 on error, 1 if request is sent and response is received +int DhcpClass::request_DHCP_lease(){ + + uint8_t messageType = 0; + + + + // Pick an initial transaction ID + _dhcpTransactionId = random(1UL, 2000UL); + _dhcpInitialTransactionId = _dhcpTransactionId; + + _dhcpUdpSocket.stop(); + if (_dhcpUdpSocket.begin(DHCP_CLIENT_PORT) == 0) + { + // Couldn't get a socket + return 0; + } + + presend_DHCP(); + + int result = 0; + + unsigned long startTime = millis(); + + while(_dhcp_state != STATE_DHCP_LEASED) + { + if(_dhcp_state == STATE_DHCP_START) + { + _dhcpTransactionId++; + + send_DHCP_MESSAGE(DHCP_DISCOVER, ((millis() - startTime) / 1000)); + _dhcp_state = STATE_DHCP_DISCOVER; + } + else if(_dhcp_state == STATE_DHCP_REREQUEST){ + _dhcpTransactionId++; + send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime)/1000)); + _dhcp_state = STATE_DHCP_REQUEST; + } + else if(_dhcp_state == STATE_DHCP_DISCOVER) + { + uint32_t respId; + messageType = parseDHCPResponse(_responseTimeout, respId); + if(messageType == DHCP_OFFER) + { + // We'll use the transaction ID that the offer came with, + // rather than the one we were up to + _dhcpTransactionId = respId; + send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime) / 1000)); + _dhcp_state = STATE_DHCP_REQUEST; + } + } + else if(_dhcp_state == STATE_DHCP_REQUEST) + { + uint32_t respId; + messageType = parseDHCPResponse(_responseTimeout, respId); + if(messageType == DHCP_ACK) + { + _dhcp_state = STATE_DHCP_LEASED; + result = 1; + //use default lease time if we didn't get it + if(_dhcpLeaseTime == 0){ + _dhcpLeaseTime = DEFAULT_LEASE; + } + //calculate T1 & T2 if we didn't get it + if(_dhcpT1 == 0){ + //T1 should be 50% of _dhcpLeaseTime + _dhcpT1 = _dhcpLeaseTime >> 1; + } + if(_dhcpT2 == 0){ + //T2 should be 87.5% (7/8ths) of _dhcpLeaseTime + _dhcpT2 = _dhcpT1 << 1; + } + _renewInSec = _dhcpT1; + _rebindInSec = _dhcpT2; + } + else if(messageType == DHCP_NAK) + _dhcp_state = STATE_DHCP_START; + } + + if(messageType == 255) + { + messageType = 0; + _dhcp_state = STATE_DHCP_START; + } + + if(result != 1 && ((millis() - startTime) > _timeout)) + break; + } + + // We're done with the socket now + _dhcpUdpSocket.stop(); + _dhcpTransactionId++; + + return result; +} + +void DhcpClass::presend_DHCP() +{ +} + +void DhcpClass::send_DHCP_MESSAGE(uint8_t messageType, uint16_t secondsElapsed) +{ + uint8_t buffer[32]; + memset(buffer, 0, 32); + IPAddress dest_addr( 255, 255, 255, 255 ); // Broadcast address + + if (-1 == _dhcpUdpSocket.beginPacket(dest_addr, DHCP_SERVER_PORT)) + { + // FIXME Need to return errors + return; + } + + buffer[0] = DHCP_BOOTREQUEST; // op + buffer[1] = DHCP_HTYPE10MB; // htype + buffer[2] = DHCP_HLENETHERNET; // hlen + buffer[3] = DHCP_HOPS; // hops + + // xid + unsigned long xid = htonl(_dhcpTransactionId); + memcpy(buffer + 4, &(xid), 4); + + // 8, 9 - seconds elapsed + buffer[8] = ((secondsElapsed & 0xff00) >> 8); + buffer[9] = (secondsElapsed & 0x00ff); + + // flags + unsigned short flags = htons(DHCP_FLAGSBROADCAST); + memcpy(buffer + 10, &(flags), 2); + + // ciaddr: already zeroed + // yiaddr: already zeroed + // siaddr: already zeroed + // giaddr: already zeroed + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 28); + + memset(buffer, 0, 32); // clear local buffer + + memcpy(buffer, _dhcpMacAddr, 6); // chaddr + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 16); + + memset(buffer, 0, 32); // clear local buffer + + // leave zeroed out for sname && file + // put in W5100 transmit buffer x 6 (192 bytes) + + for(int i = 0; i < 6; i++) { + _dhcpUdpSocket.write(buffer, 32); + } + + // OPT - Magic Cookie + buffer[0] = (uint8_t)((MAGIC_COOKIE >> 24)& 0xFF); + buffer[1] = (uint8_t)((MAGIC_COOKIE >> 16)& 0xFF); + buffer[2] = (uint8_t)((MAGIC_COOKIE >> 8)& 0xFF); + buffer[3] = (uint8_t)(MAGIC_COOKIE& 0xFF); + + // OPT - message type + buffer[4] = dhcpMessageType; + buffer[5] = 0x01; + buffer[6] = messageType; //DHCP_REQUEST; + + // OPT - client identifier + buffer[7] = dhcpClientIdentifier; + buffer[8] = 0x07; + buffer[9] = 0x01; + memcpy(buffer + 10, _dhcpMacAddr, 6); + + // OPT - host name + buffer[16] = hostName; + buffer[17] = strlen(HOST_NAME) + 6; // length of hostname + last 3 bytes of mac address + strcpy((char*)&(buffer[18]), HOST_NAME); + + printByte((char*)&(buffer[24]), _dhcpMacAddr[3]); + printByte((char*)&(buffer[26]), _dhcpMacAddr[4]); + printByte((char*)&(buffer[28]), _dhcpMacAddr[5]); + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 30); + + if(messageType == DHCP_REQUEST) + { + buffer[0] = dhcpRequestedIPaddr; + buffer[1] = 0x04; + buffer[2] = _dhcpLocalIp[0]; + buffer[3] = _dhcpLocalIp[1]; + buffer[4] = _dhcpLocalIp[2]; + buffer[5] = _dhcpLocalIp[3]; + + buffer[6] = dhcpServerIdentifier; + buffer[7] = 0x04; + buffer[8] = _dhcpDhcpServerIp[0]; + buffer[9] = _dhcpDhcpServerIp[1]; + buffer[10] = _dhcpDhcpServerIp[2]; + buffer[11] = _dhcpDhcpServerIp[3]; + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 12); + } + + buffer[0] = dhcpParamRequest; + buffer[1] = 0x06; + buffer[2] = subnetMask; + buffer[3] = routersOnSubnet; + buffer[4] = dns; + buffer[5] = domainName; + buffer[6] = dhcpT1value; + buffer[7] = dhcpT2value; + buffer[8] = endOption; + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 9); + + _dhcpUdpSocket.endPacket(); +} + +uint8_t DhcpClass::parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId) +{ + uint8_t type = 0; + uint8_t opt_len = 0; + + unsigned long startTime = millis(); + + while(_dhcpUdpSocket.parsePacket() <= 0) + { + if((millis() - startTime) > responseTimeout) + { + return 255; + } + delay(50); + } + // start reading in the packet + RIP_MSG_FIXED fixedMsg; + _dhcpUdpSocket.read((uint8_t*)&fixedMsg, sizeof(RIP_MSG_FIXED)); + + if(fixedMsg.op == DHCP_BOOTREPLY && _dhcpUdpSocket.remotePort() == DHCP_SERVER_PORT) + { + transactionId = ntohl(fixedMsg.xid); + if(memcmp(fixedMsg.chaddr, _dhcpMacAddr, 6) != 0 || (transactionId < _dhcpInitialTransactionId) || (transactionId > _dhcpTransactionId)) + { + // Need to read the rest of the packet here regardless + _dhcpUdpSocket.flush(); + return 0; + } + + memcpy(_dhcpLocalIp, fixedMsg.yiaddr, 4); + + // Skip to the option part + // Doing this a byte at a time so we don't have to put a big buffer + // on the stack (as we don't have lots of memory lying around) + for (int i =0; i < (240 - (int)sizeof(RIP_MSG_FIXED)); i++) + { + _dhcpUdpSocket.read(); // we don't care about the returned byte + } + + while (_dhcpUdpSocket.available() > 0) + { + switch (_dhcpUdpSocket.read()) + { + case endOption : + break; + + case padOption : + break; + + case dhcpMessageType : + opt_len = _dhcpUdpSocket.read(); + type = _dhcpUdpSocket.read(); + break; + + case subnetMask : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpSubnetMask, 4); + break; + + case routersOnSubnet : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpGatewayIp, 4); + for (int i = 0; i < opt_len-4; i++) + { + _dhcpUdpSocket.read(); + } + break; + + case dns : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpDnsServerIp, 4); + for (int i = 0; i < opt_len-4; i++) + { + _dhcpUdpSocket.read(); + } + break; + + case dhcpServerIdentifier : + opt_len = _dhcpUdpSocket.read(); + if( *((uint32_t*)_dhcpDhcpServerIp) == 0 || + IPAddress(_dhcpDhcpServerIp) == _dhcpUdpSocket.remoteIP() ) + { + _dhcpUdpSocket.read(_dhcpDhcpServerIp, sizeof(_dhcpDhcpServerIp)); + } + else + { + // Skip over the rest of this option + while (opt_len--) + { + _dhcpUdpSocket.read(); + } + } + break; + + case dhcpT1value : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpT1, sizeof(_dhcpT1)); + _dhcpT1 = ntohl(_dhcpT1); + break; + + case dhcpT2value : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpT2, sizeof(_dhcpT2)); + _dhcpT2 = ntohl(_dhcpT2); + break; + + case dhcpIPaddrLeaseTime : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpLeaseTime, sizeof(_dhcpLeaseTime)); + _dhcpLeaseTime = ntohl(_dhcpLeaseTime); + _renewInSec = _dhcpLeaseTime; + break; + + default : + opt_len = _dhcpUdpSocket.read(); + // Skip over the rest of this option + while (opt_len--) + { + _dhcpUdpSocket.read(); + } + break; + } + } + } + + // Need to skip to end of the packet regardless here + _dhcpUdpSocket.flush(); + + return type; +} + + +/* + returns: + 0/DHCP_CHECK_NONE: nothing happened + 1/DHCP_CHECK_RENEW_FAIL: renew failed + 2/DHCP_CHECK_RENEW_OK: renew success + 3/DHCP_CHECK_REBIND_FAIL: rebind fail + 4/DHCP_CHECK_REBIND_OK: rebind success +*/ +int DhcpClass::checkLease(){ + //this uses a signed / unsigned trick to deal with millis overflow + unsigned long now = millis(); + signed long snow = (long)now; + int rc=DHCP_CHECK_NONE; + if (_lastCheck != 0){ + signed long factor; + //calc how many ms past the timeout we are + factor = snow - (long)_secTimeout; + //if on or passed the timeout, reduce the counters + if ( factor >= 0 ){ + //next timeout should be now plus 1000 ms minus parts of second in factor + _secTimeout = snow + 1000 - factor % 1000; + //how many seconds late are we, minimum 1 + factor = factor / 1000 +1; + + //reduce the counters by that mouch + //if we can assume that the cycle time (factor) is fairly constant + //and if the remainder is less than cycle time * 2 + //do it early instead of late + if(_renewInSec < factor*2 ) + _renewInSec = 0; + else + _renewInSec -= factor; + + if(_rebindInSec < factor*2 ) + _rebindInSec = 0; + else + _rebindInSec -= factor; + } + + //if we have a lease but should renew, do it + if (_dhcp_state == STATE_DHCP_LEASED && _renewInSec <=0){ + _dhcp_state = STATE_DHCP_REREQUEST; + rc = 1 + request_DHCP_lease(); + } + + //if we have a lease or is renewing but should bind, do it + if( (_dhcp_state == STATE_DHCP_LEASED || _dhcp_state == STATE_DHCP_START) && _rebindInSec <=0){ + //this should basically restart completely + _dhcp_state = STATE_DHCP_START; + reset_DHCP_lease(); + rc = 3 + request_DHCP_lease(); + } + } + else{ + _secTimeout = snow + 1000; + } + + _lastCheck = now; + return rc; +} + +IPAddress DhcpClass::getLocalIp() +{ + return IPAddress(_dhcpLocalIp); +} + +IPAddress DhcpClass::getSubnetMask() +{ + return IPAddress(_dhcpSubnetMask); +} + +IPAddress DhcpClass::getGatewayIp() +{ + return IPAddress(_dhcpGatewayIp); +} + +IPAddress DhcpClass::getDhcpServerIp() +{ + return IPAddress(_dhcpDhcpServerIp); +} + +IPAddress DhcpClass::getDnsServerIp() +{ + return IPAddress(_dhcpDnsServerIp); +} + +void DhcpClass::printByte(char * buf, uint8_t n ) { + char *str = &buf[1]; + buf[0]='0'; + do { + unsigned long m = n; + n /= 16; + char c = m - 16 * n; + *str-- = c < 10 ? c + '0' : c + 'A' - 10; + } while(n); +} diff --git a/hardware/arduino/sam/libraries/Ethernet/Dhcp.h b/hardware/arduino/sam/libraries/Ethernet/Dhcp.h index 4a47936f0f2..6f9c632c74e 100644 --- a/hardware/arduino/sam/libraries/Ethernet/Dhcp.h +++ b/hardware/arduino/sam/libraries/Ethernet/Dhcp.h @@ -1,178 +1,178 @@ -// DHCP Library v0.3 - April 25, 2009 -// Author: Jordan Terrell - blog.jordanterrell.com - -#ifndef Dhcp_h -#define Dhcp_h - -#include "EthernetUdp.h" - -/* DHCP state machine. */ -#define STATE_DHCP_START 0 -#define STATE_DHCP_DISCOVER 1 -#define STATE_DHCP_REQUEST 2 -#define STATE_DHCP_LEASED 3 -#define STATE_DHCP_REREQUEST 4 -#define STATE_DHCP_RELEASE 5 - -#define DHCP_FLAGSBROADCAST 0x8000 - -/* UDP port numbers for DHCP */ -#define DHCP_SERVER_PORT 67 /* from server to client */ -#define DHCP_CLIENT_PORT 68 /* from client to server */ - -/* DHCP message OP code */ -#define DHCP_BOOTREQUEST 1 -#define DHCP_BOOTREPLY 2 - -/* DHCP message type */ -#define DHCP_DISCOVER 1 -#define DHCP_OFFER 2 -#define DHCP_REQUEST 3 -#define DHCP_DECLINE 4 -#define DHCP_ACK 5 -#define DHCP_NAK 6 -#define DHCP_RELEASE 7 -#define DHCP_INFORM 8 - -#define DHCP_HTYPE10MB 1 -#define DHCP_HTYPE100MB 2 - -#define DHCP_HLENETHERNET 6 -#define DHCP_HOPS 0 -#define DHCP_SECS 0 - -#define MAGIC_COOKIE 0x63825363 -#define MAX_DHCP_OPT 16 - -#define HOST_NAME "WIZnet" -#define DEFAULT_LEASE (900) //default lease time in seconds - -#define DHCP_CHECK_NONE (0) -#define DHCP_CHECK_RENEW_FAIL (1) -#define DHCP_CHECK_RENEW_OK (2) -#define DHCP_CHECK_REBIND_FAIL (3) -#define DHCP_CHECK_REBIND_OK (4) - -enum -{ - padOption = 0, - subnetMask = 1, - timerOffset = 2, - routersOnSubnet = 3, - /* timeServer = 4, - nameServer = 5,*/ - dns = 6, - /*logServer = 7, - cookieServer = 8, - lprServer = 9, - impressServer = 10, - resourceLocationServer = 11,*/ - hostName = 12, - /*bootFileSize = 13, - meritDumpFile = 14,*/ - domainName = 15, - /*swapServer = 16, - rootPath = 17, - extentionsPath = 18, - IPforwarding = 19, - nonLocalSourceRouting = 20, - policyFilter = 21, - maxDgramReasmSize = 22, - defaultIPTTL = 23, - pathMTUagingTimeout = 24, - pathMTUplateauTable = 25, - ifMTU = 26, - allSubnetsLocal = 27, - broadcastAddr = 28, - performMaskDiscovery = 29, - maskSupplier = 30, - performRouterDiscovery = 31, - routerSolicitationAddr = 32, - staticRoute = 33, - trailerEncapsulation = 34, - arpCacheTimeout = 35, - ethernetEncapsulation = 36, - tcpDefaultTTL = 37, - tcpKeepaliveInterval = 38, - tcpKeepaliveGarbage = 39, - nisDomainName = 40, - nisServers = 41, - ntpServers = 42, - vendorSpecificInfo = 43, - netBIOSnameServer = 44, - netBIOSdgramDistServer = 45, - netBIOSnodeType = 46, - netBIOSscope = 47, - xFontServer = 48, - xDisplayManager = 49,*/ - dhcpRequestedIPaddr = 50, - dhcpIPaddrLeaseTime = 51, - /*dhcpOptionOverload = 52,*/ - dhcpMessageType = 53, - dhcpServerIdentifier = 54, - dhcpParamRequest = 55, - /*dhcpMsg = 56, - dhcpMaxMsgSize = 57,*/ - dhcpT1value = 58, - dhcpT2value = 59, - /*dhcpClassIdentifier = 60,*/ - dhcpClientIdentifier = 61, - endOption = 255 -}; - -typedef struct _RIP_MSG_FIXED -{ - uint8_t op; - uint8_t htype; - uint8_t hlen; - uint8_t hops; - uint32_t xid; - uint16_t secs; - uint16_t flags; - uint8_t ciaddr[4]; - uint8_t yiaddr[4]; - uint8_t siaddr[4]; - uint8_t giaddr[4]; - uint8_t chaddr[6]; -}RIP_MSG_FIXED; - -class DhcpClass { -private: - uint32_t _dhcpInitialTransactionId; - uint32_t _dhcpTransactionId; - uint8_t _dhcpMacAddr[6]; - uint8_t _dhcpLocalIp[4]; - uint8_t _dhcpSubnetMask[4]; - uint8_t _dhcpGatewayIp[4]; - uint8_t _dhcpDhcpServerIp[4]; - uint8_t _dhcpDnsServerIp[4]; - uint32_t _dhcpLeaseTime; - uint32_t _dhcpT1, _dhcpT2; - signed long _renewInSec; - signed long _rebindInSec; - signed long _lastCheck; - unsigned long _timeout; - unsigned long _responseTimeout; - unsigned long _secTimeout; - uint8_t _dhcp_state; - EthernetUDP _dhcpUdpSocket; - - int request_DHCP_lease(); - void reset_DHCP_lease(); - void presend_DHCP(); - void send_DHCP_MESSAGE(uint8_t, uint16_t); - void printByte(char *, uint8_t); - - uint8_t parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId); -public: - IPAddress getLocalIp(); - IPAddress getSubnetMask(); - IPAddress getGatewayIp(); - IPAddress getDhcpServerIp(); - IPAddress getDnsServerIp(); - - int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000); - int checkLease(); -}; - -#endif +// DHCP Library v0.3 - April 25, 2009 +// Author: Jordan Terrell - blog.jordanterrell.com + +#ifndef Dhcp_h +#define Dhcp_h + +#include "EthernetUdp.h" + +/* DHCP state machine. */ +#define STATE_DHCP_START 0 +#define STATE_DHCP_DISCOVER 1 +#define STATE_DHCP_REQUEST 2 +#define STATE_DHCP_LEASED 3 +#define STATE_DHCP_REREQUEST 4 +#define STATE_DHCP_RELEASE 5 + +#define DHCP_FLAGSBROADCAST 0x8000 + +/* UDP port numbers for DHCP */ +#define DHCP_SERVER_PORT 67 /* from server to client */ +#define DHCP_CLIENT_PORT 68 /* from client to server */ + +/* DHCP message OP code */ +#define DHCP_BOOTREQUEST 1 +#define DHCP_BOOTREPLY 2 + +/* DHCP message type */ +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +#define DHCP_HTYPE10MB 1 +#define DHCP_HTYPE100MB 2 + +#define DHCP_HLENETHERNET 6 +#define DHCP_HOPS 0 +#define DHCP_SECS 0 + +#define MAGIC_COOKIE 0x63825363 +#define MAX_DHCP_OPT 16 + +#define HOST_NAME "WIZnet" +#define DEFAULT_LEASE (900) //default lease time in seconds + +#define DHCP_CHECK_NONE (0) +#define DHCP_CHECK_RENEW_FAIL (1) +#define DHCP_CHECK_RENEW_OK (2) +#define DHCP_CHECK_REBIND_FAIL (3) +#define DHCP_CHECK_REBIND_OK (4) + +enum +{ + padOption = 0, + subnetMask = 1, + timerOffset = 2, + routersOnSubnet = 3, + /* timeServer = 4, + nameServer = 5,*/ + dns = 6, + /*logServer = 7, + cookieServer = 8, + lprServer = 9, + impressServer = 10, + resourceLocationServer = 11,*/ + hostName = 12, + /*bootFileSize = 13, + meritDumpFile = 14,*/ + domainName = 15, + /*swapServer = 16, + rootPath = 17, + extentionsPath = 18, + IPforwarding = 19, + nonLocalSourceRouting = 20, + policyFilter = 21, + maxDgramReasmSize = 22, + defaultIPTTL = 23, + pathMTUagingTimeout = 24, + pathMTUplateauTable = 25, + ifMTU = 26, + allSubnetsLocal = 27, + broadcastAddr = 28, + performMaskDiscovery = 29, + maskSupplier = 30, + performRouterDiscovery = 31, + routerSolicitationAddr = 32, + staticRoute = 33, + trailerEncapsulation = 34, + arpCacheTimeout = 35, + ethernetEncapsulation = 36, + tcpDefaultTTL = 37, + tcpKeepaliveInterval = 38, + tcpKeepaliveGarbage = 39, + nisDomainName = 40, + nisServers = 41, + ntpServers = 42, + vendorSpecificInfo = 43, + netBIOSnameServer = 44, + netBIOSdgramDistServer = 45, + netBIOSnodeType = 46, + netBIOSscope = 47, + xFontServer = 48, + xDisplayManager = 49,*/ + dhcpRequestedIPaddr = 50, + dhcpIPaddrLeaseTime = 51, + /*dhcpOptionOverload = 52,*/ + dhcpMessageType = 53, + dhcpServerIdentifier = 54, + dhcpParamRequest = 55, + /*dhcpMsg = 56, + dhcpMaxMsgSize = 57,*/ + dhcpT1value = 58, + dhcpT2value = 59, + /*dhcpClassIdentifier = 60,*/ + dhcpClientIdentifier = 61, + endOption = 255 +}; + +typedef struct _RIP_MSG_FIXED +{ + uint8_t op; + uint8_t htype; + uint8_t hlen; + uint8_t hops; + uint32_t xid; + uint16_t secs; + uint16_t flags; + uint8_t ciaddr[4]; + uint8_t yiaddr[4]; + uint8_t siaddr[4]; + uint8_t giaddr[4]; + uint8_t chaddr[6]; +}RIP_MSG_FIXED; + +class DhcpClass { +private: + uint32_t _dhcpInitialTransactionId; + uint32_t _dhcpTransactionId; + uint8_t _dhcpMacAddr[6]; + uint8_t _dhcpLocalIp[4]; + uint8_t _dhcpSubnetMask[4]; + uint8_t _dhcpGatewayIp[4]; + uint8_t _dhcpDhcpServerIp[4]; + uint8_t _dhcpDnsServerIp[4]; + uint32_t _dhcpLeaseTime; + uint32_t _dhcpT1, _dhcpT2; + signed long _renewInSec; + signed long _rebindInSec; + signed long _lastCheck; + unsigned long _timeout; + unsigned long _responseTimeout; + unsigned long _secTimeout; + uint8_t _dhcp_state; + EthernetUDP _dhcpUdpSocket; + + int request_DHCP_lease(); + void reset_DHCP_lease(); + void presend_DHCP(); + void send_DHCP_MESSAGE(uint8_t, uint16_t); + void printByte(char *, uint8_t); + + uint8_t parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId); +public: + IPAddress getLocalIp(); + IPAddress getSubnetMask(); + IPAddress getGatewayIp(); + IPAddress getDhcpServerIp(); + IPAddress getDnsServerIp(); + + int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000); + int checkLease(); +}; + +#endif diff --git a/hardware/arduino/sam/libraries/Ethernet/Dns.h b/hardware/arduino/sam/libraries/Ethernet/Dns.h index 6bcb98ab9eb..c99f5c3769c 100644 --- a/hardware/arduino/sam/libraries/Ethernet/Dns.h +++ b/hardware/arduino/sam/libraries/Ethernet/Dns.h @@ -1,41 +1,41 @@ -// Arduino DNS client for WizNet5100-based Ethernet shield -// (c) Copyright 2009-2010 MCQN Ltd. -// Released under Apache License, version 2.0 - -#ifndef DNSClient_h -#define DNSClient_h - -#include - -class DNSClient -{ -public: - // ctor - void begin(const IPAddress& aDNSServer); - - /** Convert a numeric IP address string into a four-byte IP address. - @param aIPAddrString IP address to convert - @param aResult IPAddress structure to store the returned IP address - @result 1 if aIPAddrString was successfully converted to an IP address, - else error code - */ - int inet_aton(const char *aIPAddrString, IPAddress& aResult); - - /** Resolve the given hostname to an IP address. - @param aHostname Name to be resolved - @param aResult IPAddress structure to store the returned IP address - @result 1 if aIPAddrString was successfully converted to an IP address, - else error code - */ - int getHostByName(const char* aHostname, IPAddress& aResult); - -protected: - uint16_t BuildRequest(const char* aName); - uint16_t ProcessResponse(uint16_t aTimeout, IPAddress& aAddress); - - IPAddress iDNSServer; - uint16_t iRequestId; - EthernetUDP iUdp; -}; - -#endif +// Arduino DNS client for WizNet5100-based Ethernet shield +// (c) Copyright 2009-2010 MCQN Ltd. +// Released under Apache License, version 2.0 + +#ifndef DNSClient_h +#define DNSClient_h + +#include + +class DNSClient +{ +public: + // ctor + void begin(const IPAddress& aDNSServer); + + /** Convert a numeric IP address string into a four-byte IP address. + @param aIPAddrString IP address to convert + @param aResult IPAddress structure to store the returned IP address + @result 1 if aIPAddrString was successfully converted to an IP address, + else error code + */ + int inet_aton(const char *aIPAddrString, IPAddress& aResult); + + /** Resolve the given hostname to an IP address. + @param aHostname Name to be resolved + @param aResult IPAddress structure to store the returned IP address + @result 1 if aIPAddrString was successfully converted to an IP address, + else error code + */ + int getHostByName(const char* aHostname, IPAddress& aResult); + +protected: + uint16_t BuildRequest(const char* aName); + uint16_t ProcessResponse(uint16_t aTimeout, IPAddress& aAddress); + + IPAddress iDNSServer; + uint16_t iRequestId; + EthernetUDP iUdp; +}; + +#endif diff --git a/hardware/arduino/sam/libraries/Servo/Servo.cpp b/hardware/arduino/sam/libraries/Servo/Servo.cpp index 756e926624f..89cddd8892d 100644 --- a/hardware/arduino/sam/libraries/Servo/Servo.cpp +++ b/hardware/arduino/sam/libraries/Servo/Servo.cpp @@ -1,310 +1,310 @@ -/* - Servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - Copyright (c) 2009 Michael Margolis. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - The servos are pulsed in the background using the value most recently written using the write() method - - Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - - The methods are: - - Servo - Class for manipulating servo motors connected to Arduino pins. - - attach(pin ) - Attaches a servo motor to an i/o pin. - attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - default min is 544, max is 2400 - - write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - writeMicroseconds() - Sets the servo pulse width in microseconds - read() - Gets the last written servo pulse width as an angle between 0 and 180. - readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - attached() - Returns true if there is a servo attached. - detach() - Stops an attached servos from pulsing its i/o pin. - -*/ - -#include -#include "Servo.h" - -#define usToTicks(_us) (( clockCyclesPerMicrosecond() * _us) / 32) // converts microseconds to tick -#define ticksToUs(_ticks) (( (unsigned)_ticks * 32)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds - - -#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays - -static servo_t servos[MAX_SERVOS]; // static array of servo structures - -uint8_t ServoCount = 0; // the total number of attached servos - -static volatile int8_t Channel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) - -// convenience macros -#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo -#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % SERVOS_PER_TIMER) // returns the index of the servo on this timer -#define SERVO_INDEX(_timer,_channel) ((_timer*SERVOS_PER_TIMER) + _channel) // macro to access servo index by timer and channel -#define SERVO(_timer,_channel) (servos[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel - -#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo -#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo - -/************ static functions common to all instances ***********************/ - - -//timer16_Sequence_t timer; - -//------------------------------------------------------------------------------ -/// Interrupt handler for the TC0 channel 1. -//------------------------------------------------------------------------------ -void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel); -#if defined (_useTimer1) -void HANDLER_FOR_TIMER1(void) { - Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); -} -#endif -#if defined (_useTimer2) -void HANDLER_FOR_TIMER2(void) { - Servo_Handler(_timer2, TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); -} -#endif -#if defined (_useTimer3) -void HANDLER_FOR_TIMER3(void) { - Servo_Handler(_timer3, TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); -} -#endif -#if defined (_useTimer4) -void HANDLER_FOR_TIMER4(void) { - Servo_Handler(_timer4, TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); -} -#endif -#if defined (_useTimer5) -void HANDLER_FOR_TIMER5(void) { - Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); -} -#endif - -void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) -{ - // clear interrupt - tc->TC_CHANNEL[channel].TC_SR; - if (Channel[timer] < 0) { - tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer - } else { - if (SERVO_INDEX(timer,Channel[timer]) < ServoCount && SERVO(timer,Channel[timer]).Pin.isActive == true) { - digitalWrite(SERVO(timer,Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated - } - } - - Channel[timer]++; // increment to the next channel - if( SERVO_INDEX(timer,Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { - tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; - if(SERVO(timer,Channel[timer]).Pin.isActive == true) { // check if activated - digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,HIGH); // its an active channel so pulse it high - } - } - else { - // finished all channels so wait for the refresh period to expire before starting over - if( (tc->TC_CHANNEL[channel].TC_CV) + 4 < usToTicks(REFRESH_INTERVAL) ) { // allow a few ticks to ensure the next OCR1A not missed - tc->TC_CHANNEL[channel].TC_RA = (unsigned int)usToTicks(REFRESH_INTERVAL); - } - else { - tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed - } - Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel - } -} - -static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) -{ - pmc_enable_periph_clk(id); - TC_Configure(tc, channel, - TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32 - TC_CMR_WAVE | // Waveform mode - TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC - - /* 84MHz, MCK/32, for 1.5ms: 3937 */ - TC_SetRA(tc, channel, 2625); // 1ms - - /* Configure and enable interrupt */ - NVIC_EnableIRQ(irqn); - // TC_IER_CPAS: RA Compare - tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; - - // Enables the timer clock and performs a software reset to start the counting - TC_Start(tc, channel); -} - -static void initISR(timer16_Sequence_t timer) -{ -#if defined (_useTimer1) - if (timer == _timer1) - _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1); -#endif -#if defined (_useTimer2) - if (timer == _timer2) - _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2); -#endif -#if defined (_useTimer3) - if (timer == _timer3) - _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3); -#endif -#if defined (_useTimer4) - if (timer == _timer4) - _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4); -#endif -#if defined (_useTimer5) - if (timer == _timer5) - _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5); -#endif -} - -static void finISR(timer16_Sequence_t timer) -{ -#if defined (_useTimer1) - TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); -#endif -#if defined (_useTimer2) - TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); -#endif -#if defined (_useTimer3) - TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); -#endif -#if defined (_useTimer4) - TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); -#endif -#if defined (_useTimer5) - TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); -#endif -} - - -static boolean isTimerActive(timer16_Sequence_t timer) -{ - // returns true if any servo is active on this timer - for(uint8_t channel=0; channel < SERVOS_PER_TIMER; channel++) { - if(SERVO(timer,channel).Pin.isActive == true) - return true; - } - return false; -} - -/****************** end of static functions ******************************/ - -Servo::Servo() -{ - if (ServoCount < MAX_SERVOS) { - this->servoIndex = ServoCount++; // assign a servo index to this instance - servos[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - } else { - this->servoIndex = INVALID_SERVO; // too many servos - } -} - -uint8_t Servo::attach(int pin) -{ - return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); -} - -uint8_t Servo::attach(int pin, int min, int max) -{ - timer16_Sequence_t timer; - - if (this->servoIndex < MAX_SERVOS) { - pinMode(pin, OUTPUT); // set servo pin to output - servos[this->servoIndex].Pin.nbr = pin; - // todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128 - this->min = (MIN_PULSE_WIDTH - min)/4; //resolution of min/max is 4 uS - this->max = (MAX_PULSE_WIDTH - max)/4; - // initialize the timer if it has not already been initialized - timer = SERVO_INDEX_TO_TIMER(servoIndex); - if (isTimerActive(timer) == false) { - initISR(timer); - } - servos[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive - } - return this->servoIndex; -} - -void Servo::detach() -{ - timer16_Sequence_t timer; - - servos[this->servoIndex].Pin.isActive = false; - timer = SERVO_INDEX_TO_TIMER(servoIndex); - if(isTimerActive(timer) == false) { - finISR(timer); - } -} - -void Servo::write(int value) -{ - // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) - if (value < MIN_PULSE_WIDTH) - { - if (value < 0) - value = 0; - else if (value > 180) - value = 180; - - value = map(value, 0, 180, SERVO_MIN(), SERVO_MAX()); - } - writeMicroseconds(value); -} - -void Servo::writeMicroseconds(int value) -{ - // calculate and store the values for the given channel - byte channel = this->servoIndex; - if( (channel < MAX_SERVOS) ) // ensure channel is valid - { - if (value < SERVO_MIN()) // ensure pulse width is valid - value = SERVO_MIN(); - else if (value > SERVO_MAX()) - value = SERVO_MAX(); - - value = value - TRIM_DURATION; - value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - servos[channel].ticks = value; - } -} - -int Servo::read() // return the value as degrees -{ - return map(readMicroseconds()+1, SERVO_MIN(), SERVO_MAX(), 0, 180); -} - -int Servo::readMicroseconds() -{ - unsigned int pulsewidth; - if (this->servoIndex != INVALID_SERVO) - pulsewidth = ticksToUs(servos[this->servoIndex].ticks) + TRIM_DURATION; - else - pulsewidth = 0; - - return pulsewidth; -} - -bool Servo::attached() -{ - return servos[this->servoIndex].Pin.isActive; -} - - - +/* + Servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + Copyright (c) 2009 Michael Margolis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + The servos are pulsed in the background using the value most recently written using the write() method + + Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + + The methods are: + + Servo - Class for manipulating servo motors connected to Arduino pins. + + attach(pin ) - Attaches a servo motor to an i/o pin. + attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds + default min is 544, max is 2400 + + write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + writeMicroseconds() - Sets the servo pulse width in microseconds + read() - Gets the last written servo pulse width as an angle between 0 and 180. + readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + attached() - Returns true if there is a servo attached. + detach() - Stops an attached servos from pulsing its i/o pin. + +*/ + +#include +#include "Servo.h" + +#define usToTicks(_us) (( clockCyclesPerMicrosecond() * _us) / 32) // converts microseconds to tick +#define ticksToUs(_ticks) (( (unsigned)_ticks * 32)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds + + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays + +static servo_t servos[MAX_SERVOS]; // static array of servo structures + +uint8_t ServoCount = 0; // the total number of attached servos + +static volatile int8_t Channel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + +// convenience macros +#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo +#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % SERVOS_PER_TIMER) // returns the index of the servo on this timer +#define SERVO_INDEX(_timer,_channel) ((_timer*SERVOS_PER_TIMER) + _channel) // macro to access servo index by timer and channel +#define SERVO(_timer,_channel) (servos[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel + +#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo +#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo + +/************ static functions common to all instances ***********************/ + + +//timer16_Sequence_t timer; + +//------------------------------------------------------------------------------ +/// Interrupt handler for the TC0 channel 1. +//------------------------------------------------------------------------------ +void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel); +#if defined (_useTimer1) +void HANDLER_FOR_TIMER1(void) { + Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); +} +#endif +#if defined (_useTimer2) +void HANDLER_FOR_TIMER2(void) { + Servo_Handler(_timer2, TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); +} +#endif +#if defined (_useTimer3) +void HANDLER_FOR_TIMER3(void) { + Servo_Handler(_timer3, TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); +} +#endif +#if defined (_useTimer4) +void HANDLER_FOR_TIMER4(void) { + Servo_Handler(_timer4, TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); +} +#endif +#if defined (_useTimer5) +void HANDLER_FOR_TIMER5(void) { + Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); +} +#endif + +void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) +{ + // clear interrupt + tc->TC_CHANNEL[channel].TC_SR; + if (Channel[timer] < 0) { + tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer + } else { + if (SERVO_INDEX(timer,Channel[timer]) < ServoCount && SERVO(timer,Channel[timer]).Pin.isActive == true) { + digitalWrite(SERVO(timer,Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated + } + } + + Channel[timer]++; // increment to the next channel + if( SERVO_INDEX(timer,Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; + if(SERVO(timer,Channel[timer]).Pin.isActive == true) { // check if activated + digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,HIGH); // its an active channel so pulse it high + } + } + else { + // finished all channels so wait for the refresh period to expire before starting over + if( (tc->TC_CHANNEL[channel].TC_CV) + 4 < usToTicks(REFRESH_INTERVAL) ) { // allow a few ticks to ensure the next OCR1A not missed + tc->TC_CHANNEL[channel].TC_RA = (unsigned int)usToTicks(REFRESH_INTERVAL); + } + else { + tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed + } + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) +{ + pmc_enable_periph_clk(id); + TC_Configure(tc, channel, + TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32 + TC_CMR_WAVE | // Waveform mode + TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC + + /* 84MHz, MCK/32, for 1.5ms: 3937 */ + TC_SetRA(tc, channel, 2625); // 1ms + + /* Configure and enable interrupt */ + NVIC_EnableIRQ(irqn); + // TC_IER_CPAS: RA Compare + tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; + + // Enables the timer clock and performs a software reset to start the counting + TC_Start(tc, channel); +} + +static void initISR(timer16_Sequence_t timer) +{ +#if defined (_useTimer1) + if (timer == _timer1) + _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1); +#endif +#if defined (_useTimer2) + if (timer == _timer2) + _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2); +#endif +#if defined (_useTimer3) + if (timer == _timer3) + _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3); +#endif +#if defined (_useTimer4) + if (timer == _timer4) + _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4); +#endif +#if defined (_useTimer5) + if (timer == _timer5) + _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5); +#endif +} + +static void finISR(timer16_Sequence_t timer) +{ +#if defined (_useTimer1) + TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); +#endif +#if defined (_useTimer2) + TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); +#endif +#if defined (_useTimer3) + TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); +#endif +#if defined (_useTimer4) + TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); +#endif +#if defined (_useTimer5) + TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); +#endif +} + + +static boolean isTimerActive(timer16_Sequence_t timer) +{ + // returns true if any servo is active on this timer + for(uint8_t channel=0; channel < SERVOS_PER_TIMER; channel++) { + if(SERVO(timer,channel).Pin.isActive == true) + return true; + } + return false; +} + +/****************** end of static functions ******************************/ + +Servo::Servo() +{ + if (ServoCount < MAX_SERVOS) { + this->servoIndex = ServoCount++; // assign a servo index to this instance + servos[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values + } else { + this->servoIndex = INVALID_SERVO; // too many servos + } +} + +uint8_t Servo::attach(int pin) +{ + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); +} + +uint8_t Servo::attach(int pin, int min, int max) +{ + timer16_Sequence_t timer; + + if (this->servoIndex < MAX_SERVOS) { + pinMode(pin, OUTPUT); // set servo pin to output + servos[this->servoIndex].Pin.nbr = pin; + // todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128 + this->min = (MIN_PULSE_WIDTH - min)/4; //resolution of min/max is 4 uS + this->max = (MAX_PULSE_WIDTH - max)/4; + // initialize the timer if it has not already been initialized + timer = SERVO_INDEX_TO_TIMER(servoIndex); + if (isTimerActive(timer) == false) { + initISR(timer); + } + servos[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive + } + return this->servoIndex; +} + +void Servo::detach() +{ + timer16_Sequence_t timer; + + servos[this->servoIndex].Pin.isActive = false; + timer = SERVO_INDEX_TO_TIMER(servoIndex); + if(isTimerActive(timer) == false) { + finISR(timer); + } +} + +void Servo::write(int value) +{ + // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + if (value < MIN_PULSE_WIDTH) + { + if (value < 0) + value = 0; + else if (value > 180) + value = 180; + + value = map(value, 0, 180, SERVO_MIN(), SERVO_MAX()); + } + writeMicroseconds(value); +} + +void Servo::writeMicroseconds(int value) +{ + // calculate and store the values for the given channel + byte channel = this->servoIndex; + if( (channel < MAX_SERVOS) ) // ensure channel is valid + { + if (value < SERVO_MIN()) // ensure pulse width is valid + value = SERVO_MIN(); + else if (value > SERVO_MAX()) + value = SERVO_MAX(); + + value = value - TRIM_DURATION; + value = usToTicks(value); // convert to ticks after compensating for interrupt overhead + servos[channel].ticks = value; + } +} + +int Servo::read() // return the value as degrees +{ + return map(readMicroseconds()+1, SERVO_MIN(), SERVO_MAX(), 0, 180); +} + +int Servo::readMicroseconds() +{ + unsigned int pulsewidth; + if (this->servoIndex != INVALID_SERVO) + pulsewidth = ticksToUs(servos[this->servoIndex].ticks) + TRIM_DURATION; + else + pulsewidth = 0; + + return pulsewidth; +} + +bool Servo::attached() +{ + return servos[this->servoIndex].Pin.isActive; +} + + + diff --git a/hardware/arduino/sam/libraries/Servo/Servo.h b/hardware/arduino/sam/libraries/Servo/Servo.h index 4fdaf9c18d1..c932c91bbbe 100644 --- a/hardware/arduino/sam/libraries/Servo/Servo.h +++ b/hardware/arduino/sam/libraries/Servo/Servo.h @@ -1,155 +1,155 @@ -/* - Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - Copyright (c) 2009 Michael Margolis. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/* - - A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - The servos are pulsed in the background using the value most recently written using the write() method - - Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - The sequence used to sieze timers is defined in timers.h - - The methods are: - - Servo - Class for manipulating servo motors connected to Arduino pins. - - attach(pin ) - Attaches a servo motor to an i/o pin. - attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - default min is 544, max is 2400 - - write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - writeMicroseconds() - Sets the servo pulse width in microseconds - read() - Gets the last written servo pulse width as an angle between 0 and 180. - readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - attached() - Returns true if there is a servo attached. - detach() - Stops an attached servos from pulsing its i/o pin. - */ - -#ifndef Servo_h -#define Servo_h - -#include - -/* - * Defines for 16 bit timers used with Servo library - * - * If _useTimerX is defined then TimerX is a 16 bit timer on the current board - * timer16_Sequence_t enumerates the sequence that the timers should be allocated - * _Nbr_16timers indicates how many 16 bit timers are available. - */ - -// For SAM3X: -#define _useTimer1 -#define _useTimer2 -#define _useTimer3 -#define _useTimer4 -#define _useTimer5 - -/* - TC0, chan 0 => TC0_Handler - TC0, chan 1 => TC1_Handler - TC0, chan 2 => TC2_Handler - TC1, chan 0 => TC3_Handler - TC1, chan 1 => TC4_Handler - TC1, chan 2 => TC5_Handler - TC2, chan 0 => TC6_Handler - TC2, chan 1 => TC7_Handler - TC2, chan 2 => TC8_Handler - */ - -#if defined (_useTimer1) -#define TC_FOR_TIMER1 TC1 -#define CHANNEL_FOR_TIMER1 0 -#define ID_TC_FOR_TIMER1 ID_TC3 -#define IRQn_FOR_TIMER1 TC3_IRQn -#define HANDLER_FOR_TIMER1 TC3_Handler -#endif -#if defined (_useTimer2) -#define TC_FOR_TIMER2 TC1 -#define CHANNEL_FOR_TIMER2 1 -#define ID_TC_FOR_TIMER2 ID_TC4 -#define IRQn_FOR_TIMER2 TC4_IRQn -#define HANDLER_FOR_TIMER2 TC4_Handler -#endif -#if defined (_useTimer3) -#define TC_FOR_TIMER3 TC1 -#define CHANNEL_FOR_TIMER3 2 -#define ID_TC_FOR_TIMER3 ID_TC5 -#define IRQn_FOR_TIMER3 TC5_IRQn -#define HANDLER_FOR_TIMER3 TC5_Handler -#endif -#if defined (_useTimer4) -#define TC_FOR_TIMER4 TC0 -#define CHANNEL_FOR_TIMER4 2 -#define ID_TC_FOR_TIMER4 ID_TC2 -#define IRQn_FOR_TIMER4 TC2_IRQn -#define HANDLER_FOR_TIMER4 TC2_Handler -#endif -#if defined (_useTimer5) -#define TC_FOR_TIMER5 TC0 -#define CHANNEL_FOR_TIMER5 0 -#define ID_TC_FOR_TIMER5 ID_TC0 -#define IRQn_FOR_TIMER5 TC0_IRQn -#define HANDLER_FOR_TIMER5 TC0_Handler -#endif - -typedef enum { _timer1, _timer2, _timer3, _timer4, _timer5, _Nbr_16timers } timer16_Sequence_t ; - -#define Servo_VERSION 2 // software version of this library - -#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo (0.544ms) -#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo (2,4ms) -#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached (1.5ms) -#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds (20ms) - -#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer -#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER) - -#define INVALID_SERVO 255 // flag indicating an invalid servo index - -typedef struct { - uint8_t nbr :6 ; // a pin number from 0 to 63 - uint8_t isActive :1 ; // true if this channel is enabled, pin not pulsed if false -} ServoPin_t ; - -typedef struct { - ServoPin_t Pin; - volatile unsigned int ticks; -} servo_t; - -class Servo -{ -public: - Servo(); - uint8_t attach(int pin); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure - uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. - void detach(); - void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds - void writeMicroseconds(int value); // Write pulse width in microseconds - int read(); // returns current pulse width as an angle between 0 and 180 degrees - int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) - bool attached(); // return true if this servo is attached, otherwise false -private: - uint8_t servoIndex; // index into the channel data for this servo - int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH - int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH -}; - -#endif +/* + Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + Copyright (c) 2009 Michael Margolis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + + A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + The servos are pulsed in the background using the value most recently written using the write() method + + Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + The sequence used to sieze timers is defined in timers.h + + The methods are: + + Servo - Class for manipulating servo motors connected to Arduino pins. + + attach(pin ) - Attaches a servo motor to an i/o pin. + attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds + default min is 544, max is 2400 + + write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + writeMicroseconds() - Sets the servo pulse width in microseconds + read() - Gets the last written servo pulse width as an angle between 0 and 180. + readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + attached() - Returns true if there is a servo attached. + detach() - Stops an attached servos from pulsing its i/o pin. + */ + +#ifndef Servo_h +#define Servo_h + +#include + +/* + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 16 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many 16 bit timers are available. + */ + +// For SAM3X: +#define _useTimer1 +#define _useTimer2 +#define _useTimer3 +#define _useTimer4 +#define _useTimer5 + +/* + TC0, chan 0 => TC0_Handler + TC0, chan 1 => TC1_Handler + TC0, chan 2 => TC2_Handler + TC1, chan 0 => TC3_Handler + TC1, chan 1 => TC4_Handler + TC1, chan 2 => TC5_Handler + TC2, chan 0 => TC6_Handler + TC2, chan 1 => TC7_Handler + TC2, chan 2 => TC8_Handler + */ + +#if defined (_useTimer1) +#define TC_FOR_TIMER1 TC1 +#define CHANNEL_FOR_TIMER1 0 +#define ID_TC_FOR_TIMER1 ID_TC3 +#define IRQn_FOR_TIMER1 TC3_IRQn +#define HANDLER_FOR_TIMER1 TC3_Handler +#endif +#if defined (_useTimer2) +#define TC_FOR_TIMER2 TC1 +#define CHANNEL_FOR_TIMER2 1 +#define ID_TC_FOR_TIMER2 ID_TC4 +#define IRQn_FOR_TIMER2 TC4_IRQn +#define HANDLER_FOR_TIMER2 TC4_Handler +#endif +#if defined (_useTimer3) +#define TC_FOR_TIMER3 TC1 +#define CHANNEL_FOR_TIMER3 2 +#define ID_TC_FOR_TIMER3 ID_TC5 +#define IRQn_FOR_TIMER3 TC5_IRQn +#define HANDLER_FOR_TIMER3 TC5_Handler +#endif +#if defined (_useTimer4) +#define TC_FOR_TIMER4 TC0 +#define CHANNEL_FOR_TIMER4 2 +#define ID_TC_FOR_TIMER4 ID_TC2 +#define IRQn_FOR_TIMER4 TC2_IRQn +#define HANDLER_FOR_TIMER4 TC2_Handler +#endif +#if defined (_useTimer5) +#define TC_FOR_TIMER5 TC0 +#define CHANNEL_FOR_TIMER5 0 +#define ID_TC_FOR_TIMER5 ID_TC0 +#define IRQn_FOR_TIMER5 TC0_IRQn +#define HANDLER_FOR_TIMER5 TC0_Handler +#endif + +typedef enum { _timer1, _timer2, _timer3, _timer4, _timer5, _Nbr_16timers } timer16_Sequence_t ; + +#define Servo_VERSION 2 // software version of this library + +#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo (0.544ms) +#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo (2,4ms) +#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached (1.5ms) +#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds (20ms) + +#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer +#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER) + +#define INVALID_SERVO 255 // flag indicating an invalid servo index + +typedef struct { + uint8_t nbr :6 ; // a pin number from 0 to 63 + uint8_t isActive :1 ; // true if this channel is enabled, pin not pulsed if false +} ServoPin_t ; + +typedef struct { + ServoPin_t Pin; + volatile unsigned int ticks; +} servo_t; + +class Servo +{ +public: + Servo(); + uint8_t attach(int pin); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure + uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // Write pulse width in microseconds + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) + bool attached(); // return true if this servo is attached, otherwise false +private: + uint8_t servoIndex; // index into the channel data for this servo + int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH + int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH +}; + +#endif diff --git a/hardware/arduino/sam/libraries/USBHost/README b/hardware/arduino/sam/libraries/USBHost/README index 51a0d145dad..2b43e09527b 100644 --- a/hardware/arduino/sam/libraries/USBHost/README +++ b/hardware/arduino/sam/libraries/USBHost/README @@ -1,7 +1,7 @@ -This is the most reliable library to control the USB host chip MAX3421E. It is used to handle the communication between the Arduino ADK board and Android devices supporting Accessory mode. It of course works with other devices, but documenting that is outside our scope. - -It is of course based in the original by CircuitsAtHome.com and has been patched by Follower (RancidBacon.com) - -CircuitsAtHome has discontinued the development of this project. The Arduino Team commissioned a patch to the library to make it reliable up to a 99%. -CircuitsAtHome revision of the code can be found at https://github.com/felis/USB_Host_Shield_2.0. However the Arduino Team does not recommend using that library, yet, with ADK compatible boards, as v1 is much more stable. - +This is the most reliable library to control the USB host chip MAX3421E. It is used to handle the communication between the Arduino ADK board and Android devices supporting Accessory mode. It of course works with other devices, but documenting that is outside our scope. + +It is of course based in the original by CircuitsAtHome.com and has been patched by Follower (RancidBacon.com) + +CircuitsAtHome has discontinued the development of this project. The Arduino Team commissioned a patch to the library to make it reliable up to a 99%. +CircuitsAtHome revision of the code can be found at https://github.com/felis/USB_Host_Shield_2.0. However the Arduino Team does not recommend using that library, yet, with ADK compatible boards, as v1 is much more stable. + diff --git a/hardware/arduino/sam/libraries/USBHost/Usb.cpp b/hardware/arduino/sam/libraries/USBHost/Usb.cpp index ce74b48900c..528c1d682d1 100644 --- a/hardware/arduino/sam/libraries/USBHost/Usb.cpp +++ b/hardware/arduino/sam/libraries/USBHost/Usb.cpp @@ -1,856 +1,856 @@ -/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This software may be distributed and modified under the terms of the GNU -General Public License version 2 (GPL2) as published by the Free Software -Foundation and appearing in the file GPL2.TXT included in the packaging of -this file. Please note that GPL2 Section 2[b] requires that all works based -on this software must also be made publicly available under the terms of -the GPL2 ("Copyleft"). - -Contact information -------------------- - -Circuits At Home, LTD -Web : http://www.circuitsathome.com -e-mail : support@circuitsathome.com -*/ - -/* USB functions */ - -#include "Arduino.h" -#include "Usb.h" -#include - -static uint32_t usb_error = 0; -static uint32_t usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; - -/** - * \brief USBHost class constructor. - */ -USBHost::USBHost() : bmHubPre(0) -{ - // Set up state machine - usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; - - // Init host stack - init(); -} - -/** - * \brief Initialize USBHost class. - */ -void USBHost::init() -{ - devConfigIndex = 0; - bmHubPre = 0; -} - - -/** - * \brief Get USBHost state. - * - * \return USB enumeration status (see USBHost::task). - */ -uint32_t USBHost::getUsbTaskState(void) -{ - return (usb_task_state); -} - -/** - * \brief Set USB state. - * - * \param state New USBHost status to be set. - */ -void USBHost::setUsbTaskState(uint32_t state) -{ - usb_task_state = state; -} - -/** - * \brief Get endpoint info from USB device address and device endpoint. - * - * \note This function should be used to know which host pipe is being used for - * the corresponding device endpoint. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * - * \return Pointer to an EpInfo structure. - */ -EpInfo* USBHost::getEpInfoEntry(uint32_t addr, uint32_t ep) -{ - UsbDevice *p = addrPool.GetUsbDevicePtr(addr); - - if (!p || !p->epinfo) - return NULL; - - EpInfo *pep = p->epinfo; - - for (uint32_t i = 0; i < p->epcount; i++) - { - if (pep->deviceEpNum == ep) - return pep; - - pep++; - } - - return NULL; -} - -/** - * \brief Set device endpoint entry. - * - * \note Each device is different and has a different number of endpoints. - * This function sets endpoint record structure to the device using address - * addr in the address pool. - * - * \param ul_pipe Pipe address. - * \param ul_token_type Token type. - * - * \retval 0 on success. - * \retval USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL device not found. - */ -uint32_t USBHost::setEpInfoEntry(uint32_t addr, uint32_t epcount, EpInfo* eprecord_ptr) -{ - if (!eprecord_ptr) - return USB_ERROR_INVALID_ARGUMENT; - - UsbDevice *p = addrPool.GetUsbDevicePtr(addr); - - if (!p) - return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - p->address = addr; - p->epinfo = eprecord_ptr; - p->epcount = epcount; - - return 0; -} - -/** - * \brief Set host pipe target address and set ppep pointer to the endpoint - * structure matching the specified USB device address and endpoint. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param ppep Endpoint info structure pointer set by setPipeAddress. - * \param nak_limit Maximum number of NAK permitted. - * - * \retval 0 on success. - * \retval USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL device not found. - * \retval USB_ERROR_EPINFO_IS_NULL no endpoint structure found for this device. - * \retval USB_ERROR_EP_NOT_FOUND_IN_TBL the specified device endpoint cannot be found. - */ -uint32_t USBHost::setPipeAddress(uint32_t addr, uint32_t ep, EpInfo **ppep, uint32_t &nak_limit) -{ - UsbDevice *p = addrPool.GetUsbDevicePtr(addr); - - if (!p) - return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - if (!p->epinfo) - return USB_ERROR_EPINFO_IS_NULL; - - *ppep = getEpInfoEntry(addr, ep); - - if (!*ppep) - return USB_ERROR_EP_NOT_FOUND_IN_TBL; - - nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER ) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower)); - nak_limit--; - - // Set peripheral address - TRACE_USBHOST(printf(" => SetAddress deviceEP=%lu configued as hostPIPE=%lu sending to address=%lu\r\n", ep, (*ppep)->hostPipeNum, addr);) - uhd_configure_address((*ppep)->hostPipeNum, addr); - - return 0; -} - -/** - * \brief Send a control request. - * Sets address, endpoint, fills control packet with necessary data, dispatches - * control packet, and initiates bulk IN transfer depending on request. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param bmReqType Request direction. - * \param bRequest Request type. - * \param wValLo Value low. - * \param wValHi Value high. - * \param wInd Index field. - * \param total Request length. - * \param nbytes Number of bytes to read. - * \param dataptr Data pointer. - * \param p USB class reader. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::ctrlReq(uint32_t addr, uint32_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint32_t nbytes, uint8_t* dataptr, USBReadParser *p) -{ - // Request direction, IN or OUT - uint32_t direction = 0; - uint32_t rcode = 0; - SETUP_PKT setup_pkt; - - EpInfo *pep = 0; - uint32_t nak_limit; - - TRACE_USBHOST(printf(" => ctrlReq\r\n");) - - // Set peripheral address - rcode = setPipeAddress(addr, ep, &pep, nak_limit); - if (rcode) - return rcode; - - // Allocate Pipe0 with default 64 bytes size if not already initialized - // TODO : perform a get device descriptor first to get device endpoint size (else data can be missed if device ep0 > host pipe0) - rcode = UHD_Pipe0_Alloc(0, 64); - if (rcode) - { - TRACE_USBHOST(printf("/!\\ USBHost::ctrlReq : EP0 allocation error: %lu\r\n", rcode);) - return (rcode); - } - - // Determine request direction - direction = ((bmReqType & 0x80 ) > 0); - - // Fill in setup packet - setup_pkt.ReqType_u.bmRequestType = bmReqType; - setup_pkt.bRequest = bRequest; - setup_pkt.wVal_u.wValueLo = wValLo; - setup_pkt.wVal_u.wValueHi = wValHi; - setup_pkt.wIndex = wInd; - setup_pkt.wLength = total; - - // Configure and write the setup packet into the FIFO - uhd_configure_pipe_token(0, tokSETUP); - UHD_Pipe_Write(pep->hostPipeNum, 8, (uint8_t *)&setup_pkt); - - // Dispatch packet - rcode = dispatchPkt(tokSETUP, pep->hostPipeNum, nak_limit); - if (rcode) - { - // Return HRSLT if not zero - TRACE_USBHOST(printf("/!\\ USBHost::ctrlReq : Setup packet error: %lu\r\n", rcode);) - return (rcode); - } - - // Data stage (if present) - if (dataptr != 0) - { - if (direction) - { - // IN transfer - TRACE_USBHOST(printf(" => ctrlData IN\r\n");) - uint32_t left = total; - - while (left) - { - // Bytes read into buffer - uint32_t read = nbytes; - - rcode = InTransfer(pep, nak_limit, &read, dataptr); - if (rcode) - return rcode; - - // Invoke callback function if inTransfer completed successfuly and callback function pointer is specified - if (!rcode && p) - ((USBReadParser*)p)->Parse(read, dataptr, total - left); - - left -= read; - - if (read < nbytes) - break; - } - } - else - { - // OUT transfer - TRACE_USBHOST(printf(" => ctrlData OUT\r\n");) - rcode = OutTransfer(pep, nak_limit, nbytes, dataptr); - } - - if (rcode) - { - TRACE_USBHOST(printf("/!\\ USBHost::ctrlData : Data packet error: %lu\r\n", rcode);) - return (rcode); - } - } - - // Status stage - return dispatchPkt((direction) ? tokOUTHS : tokINHS, pep->hostPipeNum, nak_limit); -} - -/** - * \brief Perform IN request to the specified USB device. - * - * \note This function handles multiple packets (if necessary) and can - * receive a maximum of 'nbytesptr' bytes. It keep sending INs and writes data - * to memory area pointed by 'data'. The actual amount of received bytes is - * stored in 'nbytesptr'. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param nbytesptr Receive buffer size. It is set to the amount of received - * bytes when the function returns. - * \param data Buffer to store received data. - * - * \return 0 on success, error code otherwise. - */ - uint32_t USBHost::inTransfer(uint32_t addr, uint32_t ep, uint32_t *nbytesptr, uint8_t* data) -{ - EpInfo *pep = NULL; - uint32_t nak_limit = 0; - - uint32_t rcode = setPipeAddress(addr, ep, &pep, nak_limit); - - if (rcode) - { - return rcode; - } - - return InTransfer(pep, nak_limit, nbytesptr, data); -} - -uint32_t USBHost::InTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t *nbytesptr, uint8_t* data) -{ - uint32_t rcode = 0; - uint32_t pktsize = 0; - uint32_t nbytes = *nbytesptr; - uint32_t maxpktsize = pep->maxPktSize; - - *nbytesptr = 0; - - while (1) - { - // Use a 'return' to exit this loop - // IN packet to EP-'endpoint'. Function takes care of NAKS. - rcode = dispatchPkt(tokIN, pep->hostPipeNum, nak_limit); - if (rcode) - { - if (rcode == 1) - { - // Pipe freeze is mandatory to avoid sending IN endlessly (else reception becomes messy then) - uhd_freeze_pipe(pep->hostPipeNum); - } - // Should be 1, indicating NAK. Else return error code. - return rcode; - } - - // Number of received bytes - pktsize = uhd_byte_count(pep->hostPipeNum); - if (nbytes < pktsize) - { - TRACE_USBHOST(printf("/!\\ USBHost::InTransfer : receive buffer is too small, size=%lu, expected=%lu\r\n", nbytes, pktsize);) - } - data += UHD_Pipe_Read(pep->hostPipeNum, pktsize, data); - - // Add this packet's byte count to total transfer length - *nbytesptr += pktsize; - - // The transfer is complete under two conditions: - // 1. The device sent a short packet (L.T. maxPacketSize) - // 2. 'nbytes' have been transferred. - if ((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) - { - return 0; - } - } -} - -/** - * \brief Perform OUT request to the specified USB device. - * - * \note This function handles multiple packets (if necessary) and sends - * 'nbytes' bytes. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param nbytes Buffer size to be sent. - * \param data Buffer to send. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::outTransfer(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* data) -{ - EpInfo *pep = NULL; - uint32_t nak_limit = 0; - - uint32_t rcode = setPipeAddress(addr, ep, &pep, nak_limit); - - if (rcode) - { - return rcode; - } - - return OutTransfer(pep, nak_limit, nbytes, data); -} - -uint32_t USBHost::OutTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t nbytes, uint8_t *data) -{ - uint32_t rcode = 0; - uint32_t bytes_tosend = 0; - uint32_t bytes_left = nbytes; - uint32_t maxpktsize = pep->maxPktSize; - - if (maxpktsize < 1) - return USB_ERROR_INVALID_MAX_PKT_SIZE; - - while (bytes_left) - { - bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left; - - // Write FIFO - UHD_Pipe_Write(pep->hostPipeNum, bytes_tosend, data); - - // Use a 'return' to exit this loop - // OUT packet to EP-'endpoint'. Function takes care of NAKS. - rcode = dispatchPkt(tokOUT, pep->hostPipeNum, nak_limit); - if (rcode) - { - // Should be 0, indicating ACK. Else return error code. - return rcode; - } - - bytes_left -= bytes_tosend; - data += bytes_tosend; - } - - // Should be 0 in all cases - return rcode; -} - -/** - * \brief Dispatch USB packet. - * - * \note Ensure peripheral address is set and relevant buffer is loaded/empty. - * If NAK, tries to re-send up to nak_limit times. - * If nak_limit == 0, do not count NAKs, exit after timeout. - * - * \param token Token type (Setup, In or Out). - * \param hostPipeNum Host pipe number to use for sending USB packet. - * \param nak_limit Maximum number of NAK permitted. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::dispatchPkt(uint32_t token, uint32_t hostPipeNum, uint32_t nak_limit) -{ - uint32_t timeout = millis() + USB_XFER_TIMEOUT; - uint32_t nak_count = 0; - uint32_t rcode = USB_ERROR_TRANSFER_TIMEOUT; - - TRACE_USBHOST(printf(" => dispatchPkt token=%lu pipe=%lu nak_limit=%lu\r\n", token, hostPipeNum, nak_limit);) - - // Launch the transfer - UHD_Pipe_Send(hostPipeNum, token); - - // Check timeout but don't hold timeout if VBUS is lost - while ((timeout > millis()) && (UHD_GetVBUSState() == UHD_STATE_CONNECTED)) - { - // Wait for transfer completion - if (UHD_Pipe_Is_Transfer_Complete(hostPipeNum, token)) - { - return 0; - } - - // Is NAK received? - if (Is_uhd_nak_received(hostPipeNum)) - { - uhd_ack_nak_received(hostPipeNum); - nak_count++; - - if (nak_limit && (nak_count == nak_limit)) - { - // Return NAK - return 1; - } - } - } - - return rcode; -} - -/** - * \brief Configure device using known device classes. - * The device get a new address even if its class remain unknown. - * - * \param parent USB device address of the device's parent (0 if root). - * \param port USB device base address (see AddressPoolImpl). - * \param lowspeed Device speed. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::Configuring(uint32_t parent, uint32_t port, uint32_t lowspeed) -{ - uint32_t rcode = 0; - - for (; devConfigIndex < USB_NUMDEVICES; ++devConfigIndex) - { - if (!devConfig[devConfigIndex]) - continue; - - rcode = devConfig[devConfigIndex]->Init(parent, port, lowspeed); - - if (!rcode) - { - TRACE_USBHOST(printf("USBHost::Configuring : found device class!\r\n");) - devConfigIndex = 0; - return 0; - } - - - if (rcode == USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED) - { - TRACE_USBHOST(printf("USBHost::Configuring : ERROR : device not supported!\r\n");) - } - else if (rcode == USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE) - { - TRACE_USBHOST(printf("USBHost::Configuring : ERROR : class instance already in use!\r\n");) - } - else - { - // in case of an error devConfigIndex should be reset to 0 - // in order to start from the very beginning the next time - // the program gets here - if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) - devConfigIndex = 0; - - return rcode; - } - } - - // Device class is not supported by any of the registered classes - devConfigIndex = 0; - - rcode = DefaultAddressing(parent, port, lowspeed); - - return rcode; -} - -/** - * \brief Configure device with unknown USB class. - * - * \param parent USB device address of the device's parent (0 if root). - * \param port USB device base address (see AddressPoolImpl). - * \param lowspeed Device speed. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::DefaultAddressing(uint32_t parent, uint32_t port, uint32_t lowspeed) -{ - uint32_t rcode = 0; - UsbDevice *p0 = 0, *p = 0; - - // Get pointer to pseudo device with address 0 assigned - p0 = addrPool.GetUsbDevicePtr(0); - - if (!p0) - return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - if (!p0->epinfo) - return USB_ERROR_EPINFO_IS_NULL; - - p0->lowspeed = (lowspeed) ? 1 : 0; - - // Allocate new address according to device class - uint32_t bAddress = addrPool.AllocAddress(parent, 0, port); - - if (!bAddress) - return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL; - - p = addrPool.GetUsbDevicePtr(bAddress); - - if (!p) - return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - p->lowspeed = lowspeed; - - // Assign new address to the device - rcode = setAddr(0, 0, bAddress); - - if (rcode) - { - TRACE_USBHOST(printf("/!\\ USBHost::DefaultAddressing : Set address failed with code: %lu\r\n", rcode);) - addrPool.FreeAddress(bAddress); - bAddress = 0; - return rcode; - } - - return 0; -} - -/** - * \brief Release device and free associated resources. - * - * \param addr USB device address. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::ReleaseDevice(uint32_t addr) -{ - if (!addr) - return 0; - - for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) - { - if (devConfig[i]->GetAddress() == addr) - { - return devConfig[i]->Release(); - } - } - - return 0; -} - -/** - * \brief Get device descriptor. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param nbytes Buffer size. - * \param dataptr Buffer to store received descriptor. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::getDevDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* dataptr) -{ - return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, 0)); -} - -/** - * \brief Get configuration descriptor. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param nbytes Buffer size. - * \param conf Configuration number. - * \param dataptr Buffer to store received descriptor. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::getConfDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint32_t conf, uint8_t* dataptr) -{ - return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, 0)); -} - -/** - * \brief Get configuration descriptor and extract endpoints using USBReadParser object. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param conf Configuration number. - * \param p USBReadParser object pointer used to extract endpoints. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::getConfDescr(uint32_t addr, uint32_t ep, uint32_t conf, USBReadParser *p) -{ - const uint32_t bufSize = 64; - uint8_t buf[bufSize]; - - uint32_t ret = getConfDescr(addr, ep, 8, conf, buf); - - if (ret) - return ret; - - uint32_t total = ((USB_CONFIGURATION_DESCRIPTOR*)buf)->wTotalLength; - delay(100); - - return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p)); -} - -/** - * \brief Get string descriptor. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param nbytes Buffer size. - * \param index String index. - * \param langid Language ID. - * \param dataptr Buffer to store received descriptor. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::getStrDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr) -{ - return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nbytes, nbytes, dataptr, 0)); -} - -/** - * \brief Set USB device address. - * - * \param oldaddr Current USB device address. - * \param ep USB device endpoint number. - * \param addr New USB device address to be set. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::setAddr(uint32_t oldaddr, uint32_t ep, uint32_t newaddr) -{ - TRACE_USBHOST(printf(" => USBHost::setAddr\r\n");) - return ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, 0, 0); -} - -/** - * \brief Set configuration. - * - * \param addr USB device address. - * \param ep USB device endpoint number. - * \param conf_value New configuration value to be set. - * - * \return 0 on success, error code otherwise. - */ -uint32_t USBHost::setConf(uint32_t addr, uint32_t ep, uint32_t conf_value) -{ - return (ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, 0, 0)); -} - -/** - * \brief USB main task, responsible for enumeration and clean up stage. - * - * \note Must be periodically called from loop(). - */ -void USBHost::Task(void) -{ - uint32_t rcode = 0; - volatile uint32_t tmpdata = 0; - static uint32_t delay = 0; - uint32_t lowspeed = 0; - - // Update USB task state on Vbus change - tmpdata = UHD_GetVBUSState(); - switch (tmpdata) - { - case UHD_STATE_ERROR: - // Illegal state - usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL; - lowspeed = 0; - break; - - case UHD_STATE_DISCONNECTED: - // Disconnected state - if ((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED) - { - usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; - lowspeed = 0; - } - break; - - case UHD_STATE_CONNECTED: - // Attached state - if ((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) - { - delay = millis() + USB_SETTLE_DELAY; - usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE; - //FIXME TODO: lowspeed = 0 ou 1; already done by hardware? - } - break; - } - - // Poll connected devices (if required) - for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) - if (devConfig[i]) - rcode = devConfig[i]->Poll(); - - // Perform USB enumeration stage and clean up - switch (usb_task_state) - { - case USB_DETACHED_SUBSTATE_INITIALIZE: - TRACE_USBHOST(printf(" + USB_DETACHED_SUBSTATE_INITIALIZE\r\n");) - - // Init USB stack and driver - UHD_Init(); - init(); - - // Free all USB resources - for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) - if (devConfig[i]) - rcode = devConfig[i]->Release(); - - usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE; - break; - - case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: - // Nothing to do - break; - - case USB_DETACHED_SUBSTATE_ILLEGAL: - // Nothing to do - break; - - case USB_ATTACHED_SUBSTATE_SETTLE: - // Settle time for just attached device - if (delay < millis()) - { - TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_SETTLE\r\n");) - usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE; - } - break; - - case USB_ATTACHED_SUBSTATE_RESET_DEVICE: - TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_RESET_DEVICE\r\n");) - - // Trigger Bus Reset - UHD_BusReset(); - usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE; - break; - - case USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE: - if (Is_uhd_reset_sent()) - { - TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE\r\n");) - - // Clear Bus Reset flag - uhd_ack_reset_sent(); - - // Enable Start Of Frame generation - uhd_enable_sof(); - - usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF; - - // Wait 20ms after Bus Reset (USB spec) - delay = millis() + 20; - } - break; - - case USB_ATTACHED_SUBSTATE_WAIT_SOF: - // Wait for SOF received first - if (Is_uhd_sof()) - { - if (delay < millis()) - { - TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_WAIT_SOF\r\n");) - - // 20ms waiting elapsed - usb_task_state = USB_STATE_CONFIGURING; - } - } - break; - - case USB_STATE_CONFIGURING: - TRACE_USBHOST(printf(" + USB_STATE_CONFIGURING\r\n");) - rcode = Configuring(0, 0, lowspeed); - - if (rcode) - { - TRACE_USBHOST(printf("/!\\ USBHost::Task : USB_STATE_CONFIGURING failed with code: %lu\r\n", rcode);) - if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) - { - usb_error = rcode; - usb_task_state = USB_STATE_ERROR; - } - } - else - { - usb_task_state = USB_STATE_RUNNING; - TRACE_USBHOST(printf(" + USB_STATE_RUNNING\r\n");) - } - break; - - case USB_STATE_RUNNING: - break; - - case USB_STATE_ERROR: - break; - } -} +/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +This software may be distributed and modified under the terms of the GNU +General Public License version 2 (GPL2) as published by the Free Software +Foundation and appearing in the file GPL2.TXT included in the packaging of +this file. Please note that GPL2 Section 2[b] requires that all works based +on this software must also be made publicly available under the terms of +the GPL2 ("Copyleft"). + +Contact information +------------------- + +Circuits At Home, LTD +Web : http://www.circuitsathome.com +e-mail : support@circuitsathome.com +*/ + +/* USB functions */ + +#include "Arduino.h" +#include "Usb.h" +#include + +static uint32_t usb_error = 0; +static uint32_t usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; + +/** + * \brief USBHost class constructor. + */ +USBHost::USBHost() : bmHubPre(0) +{ + // Set up state machine + usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; + + // Init host stack + init(); +} + +/** + * \brief Initialize USBHost class. + */ +void USBHost::init() +{ + devConfigIndex = 0; + bmHubPre = 0; +} + + +/** + * \brief Get USBHost state. + * + * \return USB enumeration status (see USBHost::task). + */ +uint32_t USBHost::getUsbTaskState(void) +{ + return (usb_task_state); +} + +/** + * \brief Set USB state. + * + * \param state New USBHost status to be set. + */ +void USBHost::setUsbTaskState(uint32_t state) +{ + usb_task_state = state; +} + +/** + * \brief Get endpoint info from USB device address and device endpoint. + * + * \note This function should be used to know which host pipe is being used for + * the corresponding device endpoint. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * + * \return Pointer to an EpInfo structure. + */ +EpInfo* USBHost::getEpInfoEntry(uint32_t addr, uint32_t ep) +{ + UsbDevice *p = addrPool.GetUsbDevicePtr(addr); + + if (!p || !p->epinfo) + return NULL; + + EpInfo *pep = p->epinfo; + + for (uint32_t i = 0; i < p->epcount; i++) + { + if (pep->deviceEpNum == ep) + return pep; + + pep++; + } + + return NULL; +} + +/** + * \brief Set device endpoint entry. + * + * \note Each device is different and has a different number of endpoints. + * This function sets endpoint record structure to the device using address + * addr in the address pool. + * + * \param ul_pipe Pipe address. + * \param ul_token_type Token type. + * + * \retval 0 on success. + * \retval USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL device not found. + */ +uint32_t USBHost::setEpInfoEntry(uint32_t addr, uint32_t epcount, EpInfo* eprecord_ptr) +{ + if (!eprecord_ptr) + return USB_ERROR_INVALID_ARGUMENT; + + UsbDevice *p = addrPool.GetUsbDevicePtr(addr); + + if (!p) + return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + p->address = addr; + p->epinfo = eprecord_ptr; + p->epcount = epcount; + + return 0; +} + +/** + * \brief Set host pipe target address and set ppep pointer to the endpoint + * structure matching the specified USB device address and endpoint. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param ppep Endpoint info structure pointer set by setPipeAddress. + * \param nak_limit Maximum number of NAK permitted. + * + * \retval 0 on success. + * \retval USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL device not found. + * \retval USB_ERROR_EPINFO_IS_NULL no endpoint structure found for this device. + * \retval USB_ERROR_EP_NOT_FOUND_IN_TBL the specified device endpoint cannot be found. + */ +uint32_t USBHost::setPipeAddress(uint32_t addr, uint32_t ep, EpInfo **ppep, uint32_t &nak_limit) +{ + UsbDevice *p = addrPool.GetUsbDevicePtr(addr); + + if (!p) + return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + if (!p->epinfo) + return USB_ERROR_EPINFO_IS_NULL; + + *ppep = getEpInfoEntry(addr, ep); + + if (!*ppep) + return USB_ERROR_EP_NOT_FOUND_IN_TBL; + + nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER ) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower)); + nak_limit--; + + // Set peripheral address + TRACE_USBHOST(printf(" => SetAddress deviceEP=%lu configued as hostPIPE=%lu sending to address=%lu\r\n", ep, (*ppep)->hostPipeNum, addr);) + uhd_configure_address((*ppep)->hostPipeNum, addr); + + return 0; +} + +/** + * \brief Send a control request. + * Sets address, endpoint, fills control packet with necessary data, dispatches + * control packet, and initiates bulk IN transfer depending on request. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param bmReqType Request direction. + * \param bRequest Request type. + * \param wValLo Value low. + * \param wValHi Value high. + * \param wInd Index field. + * \param total Request length. + * \param nbytes Number of bytes to read. + * \param dataptr Data pointer. + * \param p USB class reader. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::ctrlReq(uint32_t addr, uint32_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint32_t nbytes, uint8_t* dataptr, USBReadParser *p) +{ + // Request direction, IN or OUT + uint32_t direction = 0; + uint32_t rcode = 0; + SETUP_PKT setup_pkt; + + EpInfo *pep = 0; + uint32_t nak_limit; + + TRACE_USBHOST(printf(" => ctrlReq\r\n");) + + // Set peripheral address + rcode = setPipeAddress(addr, ep, &pep, nak_limit); + if (rcode) + return rcode; + + // Allocate Pipe0 with default 64 bytes size if not already initialized + // TODO : perform a get device descriptor first to get device endpoint size (else data can be missed if device ep0 > host pipe0) + rcode = UHD_Pipe0_Alloc(0, 64); + if (rcode) + { + TRACE_USBHOST(printf("/!\\ USBHost::ctrlReq : EP0 allocation error: %lu\r\n", rcode);) + return (rcode); + } + + // Determine request direction + direction = ((bmReqType & 0x80 ) > 0); + + // Fill in setup packet + setup_pkt.ReqType_u.bmRequestType = bmReqType; + setup_pkt.bRequest = bRequest; + setup_pkt.wVal_u.wValueLo = wValLo; + setup_pkt.wVal_u.wValueHi = wValHi; + setup_pkt.wIndex = wInd; + setup_pkt.wLength = total; + + // Configure and write the setup packet into the FIFO + uhd_configure_pipe_token(0, tokSETUP); + UHD_Pipe_Write(pep->hostPipeNum, 8, (uint8_t *)&setup_pkt); + + // Dispatch packet + rcode = dispatchPkt(tokSETUP, pep->hostPipeNum, nak_limit); + if (rcode) + { + // Return HRSLT if not zero + TRACE_USBHOST(printf("/!\\ USBHost::ctrlReq : Setup packet error: %lu\r\n", rcode);) + return (rcode); + } + + // Data stage (if present) + if (dataptr != 0) + { + if (direction) + { + // IN transfer + TRACE_USBHOST(printf(" => ctrlData IN\r\n");) + uint32_t left = total; + + while (left) + { + // Bytes read into buffer + uint32_t read = nbytes; + + rcode = InTransfer(pep, nak_limit, &read, dataptr); + if (rcode) + return rcode; + + // Invoke callback function if inTransfer completed successfuly and callback function pointer is specified + if (!rcode && p) + ((USBReadParser*)p)->Parse(read, dataptr, total - left); + + left -= read; + + if (read < nbytes) + break; + } + } + else + { + // OUT transfer + TRACE_USBHOST(printf(" => ctrlData OUT\r\n");) + rcode = OutTransfer(pep, nak_limit, nbytes, dataptr); + } + + if (rcode) + { + TRACE_USBHOST(printf("/!\\ USBHost::ctrlData : Data packet error: %lu\r\n", rcode);) + return (rcode); + } + } + + // Status stage + return dispatchPkt((direction) ? tokOUTHS : tokINHS, pep->hostPipeNum, nak_limit); +} + +/** + * \brief Perform IN request to the specified USB device. + * + * \note This function handles multiple packets (if necessary) and can + * receive a maximum of 'nbytesptr' bytes. It keep sending INs and writes data + * to memory area pointed by 'data'. The actual amount of received bytes is + * stored in 'nbytesptr'. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param nbytesptr Receive buffer size. It is set to the amount of received + * bytes when the function returns. + * \param data Buffer to store received data. + * + * \return 0 on success, error code otherwise. + */ + uint32_t USBHost::inTransfer(uint32_t addr, uint32_t ep, uint32_t *nbytesptr, uint8_t* data) +{ + EpInfo *pep = NULL; + uint32_t nak_limit = 0; + + uint32_t rcode = setPipeAddress(addr, ep, &pep, nak_limit); + + if (rcode) + { + return rcode; + } + + return InTransfer(pep, nak_limit, nbytesptr, data); +} + +uint32_t USBHost::InTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t *nbytesptr, uint8_t* data) +{ + uint32_t rcode = 0; + uint32_t pktsize = 0; + uint32_t nbytes = *nbytesptr; + uint32_t maxpktsize = pep->maxPktSize; + + *nbytesptr = 0; + + while (1) + { + // Use a 'return' to exit this loop + // IN packet to EP-'endpoint'. Function takes care of NAKS. + rcode = dispatchPkt(tokIN, pep->hostPipeNum, nak_limit); + if (rcode) + { + if (rcode == 1) + { + // Pipe freeze is mandatory to avoid sending IN endlessly (else reception becomes messy then) + uhd_freeze_pipe(pep->hostPipeNum); + } + // Should be 1, indicating NAK. Else return error code. + return rcode; + } + + // Number of received bytes + pktsize = uhd_byte_count(pep->hostPipeNum); + if (nbytes < pktsize) + { + TRACE_USBHOST(printf("/!\\ USBHost::InTransfer : receive buffer is too small, size=%lu, expected=%lu\r\n", nbytes, pktsize);) + } + data += UHD_Pipe_Read(pep->hostPipeNum, pktsize, data); + + // Add this packet's byte count to total transfer length + *nbytesptr += pktsize; + + // The transfer is complete under two conditions: + // 1. The device sent a short packet (L.T. maxPacketSize) + // 2. 'nbytes' have been transferred. + if ((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) + { + return 0; + } + } +} + +/** + * \brief Perform OUT request to the specified USB device. + * + * \note This function handles multiple packets (if necessary) and sends + * 'nbytes' bytes. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param nbytes Buffer size to be sent. + * \param data Buffer to send. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::outTransfer(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* data) +{ + EpInfo *pep = NULL; + uint32_t nak_limit = 0; + + uint32_t rcode = setPipeAddress(addr, ep, &pep, nak_limit); + + if (rcode) + { + return rcode; + } + + return OutTransfer(pep, nak_limit, nbytes, data); +} + +uint32_t USBHost::OutTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t nbytes, uint8_t *data) +{ + uint32_t rcode = 0; + uint32_t bytes_tosend = 0; + uint32_t bytes_left = nbytes; + uint32_t maxpktsize = pep->maxPktSize; + + if (maxpktsize < 1) + return USB_ERROR_INVALID_MAX_PKT_SIZE; + + while (bytes_left) + { + bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left; + + // Write FIFO + UHD_Pipe_Write(pep->hostPipeNum, bytes_tosend, data); + + // Use a 'return' to exit this loop + // OUT packet to EP-'endpoint'. Function takes care of NAKS. + rcode = dispatchPkt(tokOUT, pep->hostPipeNum, nak_limit); + if (rcode) + { + // Should be 0, indicating ACK. Else return error code. + return rcode; + } + + bytes_left -= bytes_tosend; + data += bytes_tosend; + } + + // Should be 0 in all cases + return rcode; +} + +/** + * \brief Dispatch USB packet. + * + * \note Ensure peripheral address is set and relevant buffer is loaded/empty. + * If NAK, tries to re-send up to nak_limit times. + * If nak_limit == 0, do not count NAKs, exit after timeout. + * + * \param token Token type (Setup, In or Out). + * \param hostPipeNum Host pipe number to use for sending USB packet. + * \param nak_limit Maximum number of NAK permitted. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::dispatchPkt(uint32_t token, uint32_t hostPipeNum, uint32_t nak_limit) +{ + uint32_t timeout = millis() + USB_XFER_TIMEOUT; + uint32_t nak_count = 0; + uint32_t rcode = USB_ERROR_TRANSFER_TIMEOUT; + + TRACE_USBHOST(printf(" => dispatchPkt token=%lu pipe=%lu nak_limit=%lu\r\n", token, hostPipeNum, nak_limit);) + + // Launch the transfer + UHD_Pipe_Send(hostPipeNum, token); + + // Check timeout but don't hold timeout if VBUS is lost + while ((timeout > millis()) && (UHD_GetVBUSState() == UHD_STATE_CONNECTED)) + { + // Wait for transfer completion + if (UHD_Pipe_Is_Transfer_Complete(hostPipeNum, token)) + { + return 0; + } + + // Is NAK received? + if (Is_uhd_nak_received(hostPipeNum)) + { + uhd_ack_nak_received(hostPipeNum); + nak_count++; + + if (nak_limit && (nak_count == nak_limit)) + { + // Return NAK + return 1; + } + } + } + + return rcode; +} + +/** + * \brief Configure device using known device classes. + * The device get a new address even if its class remain unknown. + * + * \param parent USB device address of the device's parent (0 if root). + * \param port USB device base address (see AddressPoolImpl). + * \param lowspeed Device speed. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::Configuring(uint32_t parent, uint32_t port, uint32_t lowspeed) +{ + uint32_t rcode = 0; + + for (; devConfigIndex < USB_NUMDEVICES; ++devConfigIndex) + { + if (!devConfig[devConfigIndex]) + continue; + + rcode = devConfig[devConfigIndex]->Init(parent, port, lowspeed); + + if (!rcode) + { + TRACE_USBHOST(printf("USBHost::Configuring : found device class!\r\n");) + devConfigIndex = 0; + return 0; + } + + + if (rcode == USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED) + { + TRACE_USBHOST(printf("USBHost::Configuring : ERROR : device not supported!\r\n");) + } + else if (rcode == USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE) + { + TRACE_USBHOST(printf("USBHost::Configuring : ERROR : class instance already in use!\r\n");) + } + else + { + // in case of an error devConfigIndex should be reset to 0 + // in order to start from the very beginning the next time + // the program gets here + if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) + devConfigIndex = 0; + + return rcode; + } + } + + // Device class is not supported by any of the registered classes + devConfigIndex = 0; + + rcode = DefaultAddressing(parent, port, lowspeed); + + return rcode; +} + +/** + * \brief Configure device with unknown USB class. + * + * \param parent USB device address of the device's parent (0 if root). + * \param port USB device base address (see AddressPoolImpl). + * \param lowspeed Device speed. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::DefaultAddressing(uint32_t parent, uint32_t port, uint32_t lowspeed) +{ + uint32_t rcode = 0; + UsbDevice *p0 = 0, *p = 0; + + // Get pointer to pseudo device with address 0 assigned + p0 = addrPool.GetUsbDevicePtr(0); + + if (!p0) + return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + if (!p0->epinfo) + return USB_ERROR_EPINFO_IS_NULL; + + p0->lowspeed = (lowspeed) ? 1 : 0; + + // Allocate new address according to device class + uint32_t bAddress = addrPool.AllocAddress(parent, 0, port); + + if (!bAddress) + return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL; + + p = addrPool.GetUsbDevicePtr(bAddress); + + if (!p) + return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + p->lowspeed = lowspeed; + + // Assign new address to the device + rcode = setAddr(0, 0, bAddress); + + if (rcode) + { + TRACE_USBHOST(printf("/!\\ USBHost::DefaultAddressing : Set address failed with code: %lu\r\n", rcode);) + addrPool.FreeAddress(bAddress); + bAddress = 0; + return rcode; + } + + return 0; +} + +/** + * \brief Release device and free associated resources. + * + * \param addr USB device address. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::ReleaseDevice(uint32_t addr) +{ + if (!addr) + return 0; + + for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) + { + if (devConfig[i]->GetAddress() == addr) + { + return devConfig[i]->Release(); + } + } + + return 0; +} + +/** + * \brief Get device descriptor. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param nbytes Buffer size. + * \param dataptr Buffer to store received descriptor. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::getDevDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* dataptr) +{ + return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, 0)); +} + +/** + * \brief Get configuration descriptor. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param nbytes Buffer size. + * \param conf Configuration number. + * \param dataptr Buffer to store received descriptor. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::getConfDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint32_t conf, uint8_t* dataptr) +{ + return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, 0)); +} + +/** + * \brief Get configuration descriptor and extract endpoints using USBReadParser object. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param conf Configuration number. + * \param p USBReadParser object pointer used to extract endpoints. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::getConfDescr(uint32_t addr, uint32_t ep, uint32_t conf, USBReadParser *p) +{ + const uint32_t bufSize = 64; + uint8_t buf[bufSize]; + + uint32_t ret = getConfDescr(addr, ep, 8, conf, buf); + + if (ret) + return ret; + + uint32_t total = ((USB_CONFIGURATION_DESCRIPTOR*)buf)->wTotalLength; + delay(100); + + return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p)); +} + +/** + * \brief Get string descriptor. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param nbytes Buffer size. + * \param index String index. + * \param langid Language ID. + * \param dataptr Buffer to store received descriptor. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::getStrDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr) +{ + return (ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nbytes, nbytes, dataptr, 0)); +} + +/** + * \brief Set USB device address. + * + * \param oldaddr Current USB device address. + * \param ep USB device endpoint number. + * \param addr New USB device address to be set. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::setAddr(uint32_t oldaddr, uint32_t ep, uint32_t newaddr) +{ + TRACE_USBHOST(printf(" => USBHost::setAddr\r\n");) + return ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, 0, 0); +} + +/** + * \brief Set configuration. + * + * \param addr USB device address. + * \param ep USB device endpoint number. + * \param conf_value New configuration value to be set. + * + * \return 0 on success, error code otherwise. + */ +uint32_t USBHost::setConf(uint32_t addr, uint32_t ep, uint32_t conf_value) +{ + return (ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, 0, 0)); +} + +/** + * \brief USB main task, responsible for enumeration and clean up stage. + * + * \note Must be periodically called from loop(). + */ +void USBHost::Task(void) +{ + uint32_t rcode = 0; + volatile uint32_t tmpdata = 0; + static uint32_t delay = 0; + uint32_t lowspeed = 0; + + // Update USB task state on Vbus change + tmpdata = UHD_GetVBUSState(); + switch (tmpdata) + { + case UHD_STATE_ERROR: + // Illegal state + usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL; + lowspeed = 0; + break; + + case UHD_STATE_DISCONNECTED: + // Disconnected state + if ((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED) + { + usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; + lowspeed = 0; + } + break; + + case UHD_STATE_CONNECTED: + // Attached state + if ((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) + { + delay = millis() + USB_SETTLE_DELAY; + usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE; + //FIXME TODO: lowspeed = 0 ou 1; already done by hardware? + } + break; + } + + // Poll connected devices (if required) + for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) + if (devConfig[i]) + rcode = devConfig[i]->Poll(); + + // Perform USB enumeration stage and clean up + switch (usb_task_state) + { + case USB_DETACHED_SUBSTATE_INITIALIZE: + TRACE_USBHOST(printf(" + USB_DETACHED_SUBSTATE_INITIALIZE\r\n");) + + // Init USB stack and driver + UHD_Init(); + init(); + + // Free all USB resources + for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) + if (devConfig[i]) + rcode = devConfig[i]->Release(); + + usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE; + break; + + case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: + // Nothing to do + break; + + case USB_DETACHED_SUBSTATE_ILLEGAL: + // Nothing to do + break; + + case USB_ATTACHED_SUBSTATE_SETTLE: + // Settle time for just attached device + if (delay < millis()) + { + TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_SETTLE\r\n");) + usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE; + } + break; + + case USB_ATTACHED_SUBSTATE_RESET_DEVICE: + TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_RESET_DEVICE\r\n");) + + // Trigger Bus Reset + UHD_BusReset(); + usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE; + break; + + case USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE: + if (Is_uhd_reset_sent()) + { + TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE\r\n");) + + // Clear Bus Reset flag + uhd_ack_reset_sent(); + + // Enable Start Of Frame generation + uhd_enable_sof(); + + usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF; + + // Wait 20ms after Bus Reset (USB spec) + delay = millis() + 20; + } + break; + + case USB_ATTACHED_SUBSTATE_WAIT_SOF: + // Wait for SOF received first + if (Is_uhd_sof()) + { + if (delay < millis()) + { + TRACE_USBHOST(printf(" + USB_ATTACHED_SUBSTATE_WAIT_SOF\r\n");) + + // 20ms waiting elapsed + usb_task_state = USB_STATE_CONFIGURING; + } + } + break; + + case USB_STATE_CONFIGURING: + TRACE_USBHOST(printf(" + USB_STATE_CONFIGURING\r\n");) + rcode = Configuring(0, 0, lowspeed); + + if (rcode) + { + TRACE_USBHOST(printf("/!\\ USBHost::Task : USB_STATE_CONFIGURING failed with code: %lu\r\n", rcode);) + if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) + { + usb_error = rcode; + usb_task_state = USB_STATE_ERROR; + } + } + else + { + usb_task_state = USB_STATE_RUNNING; + TRACE_USBHOST(printf(" + USB_STATE_RUNNING\r\n");) + } + break; + + case USB_STATE_RUNNING: + break; + + case USB_STATE_ERROR: + break; + } +} diff --git a/hardware/arduino/sam/libraries/USBHost/Usb.h b/hardware/arduino/sam/libraries/USBHost/Usb.h index 9b1203d7054..e205c449115 100644 --- a/hardware/arduino/sam/libraries/USBHost/Usb.h +++ b/hardware/arduino/sam/libraries/USBHost/Usb.h @@ -1,230 +1,230 @@ -/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This software may be distributed and modified under the terms of the GNU -General Public License version 2 (GPL2) as published by the Free Software -Foundation and appearing in the file GPL2.TXT included in the packaging of -this file. Please note that GPL2 Section 2[b] requires that all works based -on this software must also be made publicly available under the terms of -the GPL2 ("Copyleft"). - -Contact information -------------------- - -Circuits At Home, LTD -Web : http://www.circuitsathome.com -e-mail : support@circuitsathome.com -*/ -/* USB functions */ - -#ifndef USB_H_INCLUDED -#define USB_H_INCLUDED - -//#define TRACE_USBHOST(x) x -#define TRACE_USBHOST(x) - -#include -#include "usb_ch9.h" -#include "address.h" - -/* Common setup data constant combinations */ -#define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE // Get descriptor request type -#define bmREQ_SET USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE // Set request type for all but 'set feature' and 'set interface' -#define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE // Get interface request type - -// USB Device Classes -#define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors -#define USB_CLASS_AUDIO 0x01 // Audio -#define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control -#define USB_CLASS_HID 0x03 // HID -#define USB_CLASS_PHYSICAL 0x05 // Physical -#define USB_CLASS_IMAGE 0x06 // Image -#define USB_CLASS_PRINTER 0x07 // Printer -#define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage -#define USB_CLASS_HUB 0x09 // Hub -#define USB_CLASS_CDC_DATA 0x0a // CDC-Data -#define USB_CLASS_SMART_CARD 0x0b // Smart-Card -#define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security -#define USB_CLASS_VIDEO 0x0e // Video -#define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare -#define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device -#define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller -#define USB_CLASS_MISC 0xef // Miscellaneous -#define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific -#define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific - -// Additional Error Codes -#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1 -#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2 -#define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3 -#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4 -#define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5 -#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6 -#define USB_ERROR_EPINFO_IS_NULL 0xD7 -#define USB_ERROR_INVALID_ARGUMENT 0xD8 -#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9 -#define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA -#define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB -#define USB_ERROR_TRANSFER_TIMEOUT 0xFF - -#define USB_XFER_TIMEOUT 5000 //USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec -//#define USB_NAK_LIMIT 32000 //NAK limit for a transfer. 0 means NAKs are not counted -#define USB_RETRY_LIMIT 3 //retry limit for a transfer -#define USB_SETTLE_DELAY 200 //settle delay in milliseconds - -#define USB_NUMDEVICES 16 //number of USB devices -//#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller -#define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms - -/* USB state machine states */ -#define USB_STATE_MASK 0xf0 - -#define USB_STATE_DETACHED 0x10 -#define USB_DETACHED_SUBSTATE_INITIALIZE 0x11 -#define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12 -#define USB_DETACHED_SUBSTATE_ILLEGAL 0x13 -#define USB_ATTACHED_SUBSTATE_SETTLE 0x20 -#define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30 -#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40 -#define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50 -#define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60 -#define USB_STATE_ADDRESSING 0x70 -#define USB_STATE_CONFIGURING 0x80 -#define USB_STATE_RUNNING 0x90 -#define USB_STATE_ERROR 0xa0 -#define USB_STATE_MASK 0xf0 - -// USB Setup Packet Structure -typedef struct -{ - union - { // offset description - uint8_t bmRequestType; // 0 Bit-map of request type - struct - { - uint8_t recipient: 5; // Recipient of the request - uint8_t type: 2; // Type of request - uint8_t direction: 1; // Direction of data X-fer - }; - } ReqType_u; - uint8_t bRequest; // 1 Request - union - { - uint16_t wValue; // 2 Depends on bRequest - struct - { - uint8_t wValueLo; - uint8_t wValueHi; - }; - } wVal_u; - uint16_t wIndex; // 4 Depends on bRequest - uint16_t wLength; // 6 Depends on bRequest -} SETUP_PKT, *PSETUP_PKT; - -/** - * \class USBReadParser - * - * \brief Base class used for USB descriptor parsing. - */ -class USBReadParser -{ -public: - virtual void Parse(const uint32_t len, const uint8_t *pbuf, const uint32_t &offset) = 0; -}; - -/** - * \class USBDeviceConfig - * - * \brief Device configuration class used for managing device life cycle. - */ -class USBDeviceConfig -{ -public: - //! @brief Perform final enumeration stage. - virtual uint32_t Init(uint32_t parent, uint32_t port, uint32_t lowspeed) = 0; - - //! @brief Free USB allocated resources (pipes and address). - virtual uint32_t Release() = 0; - - //! @brief Poll USB device. Call is made for each connected USB device on USBHost.task() call. - virtual uint32_t Poll() = 0; - - //! @brief Retrieve USB device address. - virtual uint32_t GetAddress() = 0; -}; - -/** - * \class USBHost - * - * \brief Main USB host class. - */ -class USBHost -{ - AddressPoolImpl addrPool; - USBDeviceConfig* devConfig[USB_NUMDEVICES]; - uint32_t devConfigIndex; - uint32_t bmHubPre; - - public: - USBHost(void); - - //void SetHubPreMask() { bmHubPre |= bmHUBPRE; }; - //void ResetHubPreMask() { bmHubPre &= (~bmHUBPRE); }; - - AddressPool& GetAddressPool() - { - return (AddressPool&)addrPool; - }; - - uint32_t RegisterDeviceClass(USBDeviceConfig *pdev) - { - for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) - { - if (!devConfig[i]) - { - devConfig[i] = pdev; - return 0; - } - } - return USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS; - }; - - void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) - { - addrPool.ForEachUsbDevice(pfunc); - }; - - uint32_t getUsbTaskState(void); - void setUsbTaskState(uint32_t state); - - EpInfo* getEpInfoEntry(uint32_t addr, uint32_t ep); - uint32_t setEpInfoEntry(uint32_t addr, uint32_t epcount, EpInfo* eprecord_ptr); - - /* Control requests */ - uint32_t getDevDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* dataptr); - uint32_t getConfDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint32_t conf, uint8_t* dataptr); - uint32_t getConfDescr(uint32_t addr, uint32_t ep, uint32_t conf, USBReadParser *p); - uint32_t getStrDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); - uint32_t setAddr(uint32_t oldaddr, uint32_t ep, uint32_t newaddr); - uint32_t setConf(uint32_t addr, uint32_t ep, uint32_t conf_value); - uint32_t ctrlReq(uint32_t addr, uint32_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, - uint16_t wInd, uint16_t total, uint32_t nbytes, uint8_t* dataptr, USBReadParser *p); - - /* Transfer requests */ - uint32_t inTransfer(uint32_t addr, uint32_t ep, uint32_t *nbytesptr, uint8_t* data); - uint32_t outTransfer(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* data); - uint32_t dispatchPkt(uint32_t token, uint32_t ep, uint32_t nak_limit); - - void Task(void); - - uint32_t DefaultAddressing(uint32_t parent, uint32_t port, uint32_t lowspeed); - uint32_t Configuring(uint32_t parent, uint32_t port, uint32_t lowspeed); - uint32_t ReleaseDevice(uint32_t addr); - - private: - void init(); - uint32_t setPipeAddress(uint32_t addr, uint32_t ep, EpInfo **ppep, uint32_t &nak_limit); - uint32_t OutTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t nbytes, uint8_t *data); - uint32_t InTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t *nbytesptr, uint8_t* data); -}; - +/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +This software may be distributed and modified under the terms of the GNU +General Public License version 2 (GPL2) as published by the Free Software +Foundation and appearing in the file GPL2.TXT included in the packaging of +this file. Please note that GPL2 Section 2[b] requires that all works based +on this software must also be made publicly available under the terms of +the GPL2 ("Copyleft"). + +Contact information +------------------- + +Circuits At Home, LTD +Web : http://www.circuitsathome.com +e-mail : support@circuitsathome.com +*/ +/* USB functions */ + +#ifndef USB_H_INCLUDED +#define USB_H_INCLUDED + +//#define TRACE_USBHOST(x) x +#define TRACE_USBHOST(x) + +#include +#include "usb_ch9.h" +#include "address.h" + +/* Common setup data constant combinations */ +#define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE // Get descriptor request type +#define bmREQ_SET USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE // Set request type for all but 'set feature' and 'set interface' +#define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE // Get interface request type + +// USB Device Classes +#define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors +#define USB_CLASS_AUDIO 0x01 // Audio +#define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control +#define USB_CLASS_HID 0x03 // HID +#define USB_CLASS_PHYSICAL 0x05 // Physical +#define USB_CLASS_IMAGE 0x06 // Image +#define USB_CLASS_PRINTER 0x07 // Printer +#define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage +#define USB_CLASS_HUB 0x09 // Hub +#define USB_CLASS_CDC_DATA 0x0a // CDC-Data +#define USB_CLASS_SMART_CARD 0x0b // Smart-Card +#define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security +#define USB_CLASS_VIDEO 0x0e // Video +#define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare +#define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device +#define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller +#define USB_CLASS_MISC 0xef // Miscellaneous +#define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific +#define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific + +// Additional Error Codes +#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1 +#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2 +#define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3 +#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4 +#define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5 +#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6 +#define USB_ERROR_EPINFO_IS_NULL 0xD7 +#define USB_ERROR_INVALID_ARGUMENT 0xD8 +#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9 +#define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA +#define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB +#define USB_ERROR_TRANSFER_TIMEOUT 0xFF + +#define USB_XFER_TIMEOUT 5000 //USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec +//#define USB_NAK_LIMIT 32000 //NAK limit for a transfer. 0 means NAKs are not counted +#define USB_RETRY_LIMIT 3 //retry limit for a transfer +#define USB_SETTLE_DELAY 200 //settle delay in milliseconds + +#define USB_NUMDEVICES 16 //number of USB devices +//#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller +#define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms + +/* USB state machine states */ +#define USB_STATE_MASK 0xf0 + +#define USB_STATE_DETACHED 0x10 +#define USB_DETACHED_SUBSTATE_INITIALIZE 0x11 +#define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12 +#define USB_DETACHED_SUBSTATE_ILLEGAL 0x13 +#define USB_ATTACHED_SUBSTATE_SETTLE 0x20 +#define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30 +#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40 +#define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50 +#define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60 +#define USB_STATE_ADDRESSING 0x70 +#define USB_STATE_CONFIGURING 0x80 +#define USB_STATE_RUNNING 0x90 +#define USB_STATE_ERROR 0xa0 +#define USB_STATE_MASK 0xf0 + +// USB Setup Packet Structure +typedef struct +{ + union + { // offset description + uint8_t bmRequestType; // 0 Bit-map of request type + struct + { + uint8_t recipient: 5; // Recipient of the request + uint8_t type: 2; // Type of request + uint8_t direction: 1; // Direction of data X-fer + }; + } ReqType_u; + uint8_t bRequest; // 1 Request + union + { + uint16_t wValue; // 2 Depends on bRequest + struct + { + uint8_t wValueLo; + uint8_t wValueHi; + }; + } wVal_u; + uint16_t wIndex; // 4 Depends on bRequest + uint16_t wLength; // 6 Depends on bRequest +} SETUP_PKT, *PSETUP_PKT; + +/** + * \class USBReadParser + * + * \brief Base class used for USB descriptor parsing. + */ +class USBReadParser +{ +public: + virtual void Parse(const uint32_t len, const uint8_t *pbuf, const uint32_t &offset) = 0; +}; + +/** + * \class USBDeviceConfig + * + * \brief Device configuration class used for managing device life cycle. + */ +class USBDeviceConfig +{ +public: + //! @brief Perform final enumeration stage. + virtual uint32_t Init(uint32_t parent, uint32_t port, uint32_t lowspeed) = 0; + + //! @brief Free USB allocated resources (pipes and address). + virtual uint32_t Release() = 0; + + //! @brief Poll USB device. Call is made for each connected USB device on USBHost.task() call. + virtual uint32_t Poll() = 0; + + //! @brief Retrieve USB device address. + virtual uint32_t GetAddress() = 0; +}; + +/** + * \class USBHost + * + * \brief Main USB host class. + */ +class USBHost +{ + AddressPoolImpl addrPool; + USBDeviceConfig* devConfig[USB_NUMDEVICES]; + uint32_t devConfigIndex; + uint32_t bmHubPre; + + public: + USBHost(void); + + //void SetHubPreMask() { bmHubPre |= bmHUBPRE; }; + //void ResetHubPreMask() { bmHubPre &= (~bmHUBPRE); }; + + AddressPool& GetAddressPool() + { + return (AddressPool&)addrPool; + }; + + uint32_t RegisterDeviceClass(USBDeviceConfig *pdev) + { + for (uint32_t i = 0; i < USB_NUMDEVICES; ++i) + { + if (!devConfig[i]) + { + devConfig[i] = pdev; + return 0; + } + } + return USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS; + }; + + void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) + { + addrPool.ForEachUsbDevice(pfunc); + }; + + uint32_t getUsbTaskState(void); + void setUsbTaskState(uint32_t state); + + EpInfo* getEpInfoEntry(uint32_t addr, uint32_t ep); + uint32_t setEpInfoEntry(uint32_t addr, uint32_t epcount, EpInfo* eprecord_ptr); + + /* Control requests */ + uint32_t getDevDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* dataptr); + uint32_t getConfDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint32_t conf, uint8_t* dataptr); + uint32_t getConfDescr(uint32_t addr, uint32_t ep, uint32_t conf, USBReadParser *p); + uint32_t getStrDescr(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); + uint32_t setAddr(uint32_t oldaddr, uint32_t ep, uint32_t newaddr); + uint32_t setConf(uint32_t addr, uint32_t ep, uint32_t conf_value); + uint32_t ctrlReq(uint32_t addr, uint32_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, + uint16_t wInd, uint16_t total, uint32_t nbytes, uint8_t* dataptr, USBReadParser *p); + + /* Transfer requests */ + uint32_t inTransfer(uint32_t addr, uint32_t ep, uint32_t *nbytesptr, uint8_t* data); + uint32_t outTransfer(uint32_t addr, uint32_t ep, uint32_t nbytes, uint8_t* data); + uint32_t dispatchPkt(uint32_t token, uint32_t ep, uint32_t nak_limit); + + void Task(void); + + uint32_t DefaultAddressing(uint32_t parent, uint32_t port, uint32_t lowspeed); + uint32_t Configuring(uint32_t parent, uint32_t port, uint32_t lowspeed); + uint32_t ReleaseDevice(uint32_t addr); + + private: + void init(); + uint32_t setPipeAddress(uint32_t addr, uint32_t ep, EpInfo **ppep, uint32_t &nak_limit); + uint32_t OutTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t nbytes, uint8_t *data); + uint32_t InTransfer(EpInfo *pep, uint32_t nak_limit, uint32_t *nbytesptr, uint8_t* data); +}; + #endif /* USB_H_INCLUDED */ diff --git a/hardware/arduino/sam/libraries/WiFi/utility/server_drv.cpp b/hardware/arduino/sam/libraries/WiFi/utility/server_drv.cpp index ce03604b4f9..05c3a17cb6f 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/server_drv.cpp +++ b/hardware/arduino/sam/libraries/WiFi/utility/server_drv.cpp @@ -1,260 +1,260 @@ -//#define _DEBUG_ - -#include "server_drv.h" - -#include "Arduino.h" -#include "spi_drv.h" - -extern "C" { -#include "wl_types.h" -#include "debug.h" -} - - -// Start server TCP on port specified -void ServerDrv::startServer(uint16_t port, uint8_t sock) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(START_SERVER_TCP_CMD, PARAM_NUMS_2); - SpiDrv::sendParam(port); - SpiDrv::sendParam(&sock, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(START_SERVER_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); -} - -// Start server TCP on port specified -void ServerDrv::startClient(uint32_t ipAddress, uint16_t port, uint8_t sock) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(START_CLIENT_TCP_CMD, PARAM_NUMS_3); - SpiDrv::sendParam((uint8_t*)&ipAddress, sizeof(ipAddress)); - SpiDrv::sendParam(port); - SpiDrv::sendParam(&sock, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(START_CLIENT_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); -} - -// Start server TCP on port specified -void ServerDrv::stopClient(uint8_t sock) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(STOP_CLIENT_TCP_CMD, PARAM_NUMS_1); - SpiDrv::sendParam(&sock, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(STOP_CLIENT_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); -} - - -uint8_t ServerDrv::getServerState(uint8_t sock) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(GET_STATE_TCP_CMD, PARAM_NUMS_1); - SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(GET_STATE_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - return _data; -} - -uint8_t ServerDrv::getClientState(uint8_t sock) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(GET_CLIENT_STATE_TCP_CMD, PARAM_NUMS_1); - SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(GET_CLIENT_STATE_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - return _data; -} - -uint8_t ServerDrv::availData(uint8_t sock) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(AVAIL_DATA_TCP_CMD, PARAM_NUMS_1); - SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(AVAIL_DATA_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - - if (_dataLen!=0) - { - return (_data == 1); - } - return false; -} - -bool ServerDrv::getData(uint8_t sock, uint8_t *data, uint8_t peek) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(GET_DATA_TCP_CMD, PARAM_NUMS_2); - SpiDrv::sendParam(&sock, sizeof(sock)); - SpiDrv::sendParam(peek, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseData8(GET_DATA_TCP_CMD, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - if (_dataLen!=0) - { - *data = _data; - return true; - } - return false; -} - -bool ServerDrv::getDataBuf(uint8_t sock, uint8_t *_data, uint16_t *_dataLen) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(GET_DATABUF_TCP_CMD, PARAM_NUMS_1); - SpiDrv::sendBuffer(&sock, sizeof(sock), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - if (!SpiDrv::waitResponseData16(GET_DATABUF_TCP_CMD, _data, _dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - if (*_dataLen!=0) - { - return true; - } - return false; -} - - -bool ServerDrv::sendData(uint8_t sock, const uint8_t *data, uint16_t len) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(SEND_DATA_TCP_CMD, PARAM_NUMS_2); - SpiDrv::sendBuffer(&sock, sizeof(sock)); - SpiDrv::sendBuffer((uint8_t *)data, len, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseData8(SEND_DATA_TCP_CMD, &_data, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - if (_dataLen!=0) - { - return (_data == 1); - } - return false; -} - - -uint8_t ServerDrv::checkDataSent(uint8_t sock) -{ - const uint16_t TIMEOUT_DATA_SENT = 25; - uint16_t timeout = 0; - uint8_t _data = 0; - uint8_t _dataLen = 0; - - do { - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(DATA_SENT_TCP_CMD, PARAM_NUMS_1); - SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - if (!SpiDrv::waitResponseCmd(DATA_SENT_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse isDataSent"); - } - SpiDrv::spiSlaveDeselect(); - - if (_data) timeout = 0; - else{ - ++timeout; - delay(100); - } - - }while((_data==0)&&(timeout -#include "wifi_spi.h" - -class ServerDrv -{ -public: - // Start server TCP on port specified - static void startServer(uint16_t port, uint8_t sock); - - static void startClient(uint32_t ipAddress, uint16_t port, uint8_t sock); - - static void stopClient(uint8_t sock); - - static uint8_t getServerState(uint8_t sock); - - static uint8_t getClientState(uint8_t sock); - - static bool getData(uint8_t sock, uint8_t *data, uint8_t peek = 0); - - static bool getDataBuf(uint8_t sock, uint8_t *data, uint16_t *len); - - static bool sendData(uint8_t sock, const uint8_t *data, uint16_t len); - - static uint8_t availData(uint8_t sock); - - static uint8_t checkDataSent(uint8_t sock); -}; - -extern ServerDrv serverDrv; - -#endif +#ifndef Server_Drv_h +#define Server_Drv_h + +#include +#include "wifi_spi.h" + +class ServerDrv +{ +public: + // Start server TCP on port specified + static void startServer(uint16_t port, uint8_t sock); + + static void startClient(uint32_t ipAddress, uint16_t port, uint8_t sock); + + static void stopClient(uint8_t sock); + + static uint8_t getServerState(uint8_t sock); + + static uint8_t getClientState(uint8_t sock); + + static bool getData(uint8_t sock, uint8_t *data, uint8_t peek = 0); + + static bool getDataBuf(uint8_t sock, uint8_t *data, uint16_t *len); + + static bool sendData(uint8_t sock, const uint8_t *data, uint16_t len); + + static uint8_t availData(uint8_t sock); + + static uint8_t checkDataSent(uint8_t sock); +}; + +extern ServerDrv serverDrv; + +#endif diff --git a/hardware/arduino/sam/libraries/WiFi/utility/socket.c b/hardware/arduino/sam/libraries/WiFi/utility/socket.c index 665073b04de..0eddd4abed2 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/socket.c +++ b/hardware/arduino/sam/libraries/WiFi/utility/socket.c @@ -1,20 +1,20 @@ -/* -* -@file socket.c -@brief define function of socket API -* -*/ -#include -#include "socket.h" - -SOCKET socket(uint8 protocol) {return 0;} // Opens a socket(TCP or UDP or IP_RAW mode) -void close(SOCKET s) {} // Close socket -uint8 connect(SOCKET s, uint8 * addr, uint16 port) {return 0;} // Establish TCP connection (Active connection) -void disconnect(SOCKET s) {} // disconnect the connection -uint8 listen(SOCKET s) { return 0;} // Establish TCP connection (Passive connection) -uint16 send(SOCKET s, const uint8 * buf, uint16 len) { return 0;} // Send data (TCP) -uint16 recv(SOCKET s, uint8 * buf, uint16 len) {return 0;} // Receive data (TCP) -uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port) {return 0;} // Send data (UDP/IP RAW) -uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port) {return 0;} // Receive data (UDP/IP RAW) - -uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len) {return 0;} +/* +* +@file socket.c +@brief define function of socket API +* +*/ +#include +#include "socket.h" + +SOCKET socket(uint8 protocol) {return 0;} // Opens a socket(TCP or UDP or IP_RAW mode) +void close(SOCKET s) {} // Close socket +uint8 connect(SOCKET s, uint8 * addr, uint16 port) {return 0;} // Establish TCP connection (Active connection) +void disconnect(SOCKET s) {} // disconnect the connection +uint8 listen(SOCKET s) { return 0;} // Establish TCP connection (Passive connection) +uint16 send(SOCKET s, const uint8 * buf, uint16 len) { return 0;} // Send data (TCP) +uint16 recv(SOCKET s, uint8 * buf, uint16 len) {return 0;} // Receive data (TCP) +uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port) {return 0;} // Send data (UDP/IP RAW) +uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port) {return 0;} // Receive data (UDP/IP RAW) + +uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len) {return 0;} diff --git a/hardware/arduino/sam/libraries/WiFi/utility/socket.h b/hardware/arduino/sam/libraries/WiFi/utility/socket.h index cd7e1640af0..bd9229fd7d6 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/socket.h +++ b/hardware/arduino/sam/libraries/WiFi/utility/socket.h @@ -1,87 +1,87 @@ -/* -* -@file socket.h -@brief define function of socket API -* -*/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -#define TCP_SOCKET 1 -#define UDP_SOCKET 2 -#define RAW_SOCKET 3 - -#define SOCK_NOT_AVAIL 255 - -#include "wl_definitions.h" -/** - * The 8-bit signed data type. - */ -typedef char int8; -/** - * The volatile 8-bit signed data type. - */ -typedef volatile char vint8; -/** - * The 8-bit unsigned data type. - */ -typedef unsigned char uint8; -/** - * The volatile 8-bit unsigned data type. - */ -typedef volatile unsigned char vuint8; - -/** - * The 16-bit signed data type. - */ -typedef int int16; -/** - * The volatile 16-bit signed data type. - */ -typedef volatile int vint16; -/** - * The 16-bit unsigned data type. - */ -typedef unsigned int uint16; -/** - * The volatile 16-bit unsigned data type. - */ -typedef volatile unsigned int vuint16; -/** - * The 32-bit signed data type. - */ -typedef long int32; -/** - * The volatile 32-bit signed data type. - */ -typedef volatile long vint32; -/** - * The 32-bit unsigned data type. - */ -typedef unsigned long uint32; -/** - * The volatile 32-bit unsigned data type. - */ -typedef volatile unsigned long vuint32; - -/* bsd */ -typedef uint8 u_char; /**< 8-bit value */ -typedef uint16_t SOCKET; -//typedef uint16 u_short; /**< 16-bit value */ -typedef uint16 u_int; /**< 16-bit value */ -typedef uint32 u_long; /**< 32-bit value */ - -extern SOCKET socket(uint8 protocol); // Opens a socket(TCP or UDP or IP_RAW mode) -extern void close(SOCKET s); // Close socket -extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) -extern void disconnect(SOCKET s); // disconnect the connection -extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) -extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) -extern uint16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) -extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) -extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) - -extern uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len); -#endif -/* _SOCKET_H_ */ +/* +* +@file socket.h +@brief define function of socket API +* +*/ + +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +#define TCP_SOCKET 1 +#define UDP_SOCKET 2 +#define RAW_SOCKET 3 + +#define SOCK_NOT_AVAIL 255 + +#include "wl_definitions.h" +/** + * The 8-bit signed data type. + */ +typedef char int8; +/** + * The volatile 8-bit signed data type. + */ +typedef volatile char vint8; +/** + * The 8-bit unsigned data type. + */ +typedef unsigned char uint8; +/** + * The volatile 8-bit unsigned data type. + */ +typedef volatile unsigned char vuint8; + +/** + * The 16-bit signed data type. + */ +typedef int int16; +/** + * The volatile 16-bit signed data type. + */ +typedef volatile int vint16; +/** + * The 16-bit unsigned data type. + */ +typedef unsigned int uint16; +/** + * The volatile 16-bit unsigned data type. + */ +typedef volatile unsigned int vuint16; +/** + * The 32-bit signed data type. + */ +typedef long int32; +/** + * The volatile 32-bit signed data type. + */ +typedef volatile long vint32; +/** + * The 32-bit unsigned data type. + */ +typedef unsigned long uint32; +/** + * The volatile 32-bit unsigned data type. + */ +typedef volatile unsigned long vuint32; + +/* bsd */ +typedef uint8 u_char; /**< 8-bit value */ +typedef uint16_t SOCKET; +//typedef uint16 u_short; /**< 16-bit value */ +typedef uint16 u_int; /**< 16-bit value */ +typedef uint32 u_long; /**< 32-bit value */ + +extern SOCKET socket(uint8 protocol); // Opens a socket(TCP or UDP or IP_RAW mode) +extern void close(SOCKET s); // Close socket +extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) +extern void disconnect(SOCKET s); // disconnect the connection +extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) +extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) +extern uint16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) +extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) +extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) + +extern uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len); +#endif +/* _SOCKET_H_ */ diff --git a/hardware/arduino/sam/libraries/WiFi/utility/spi_drv.h b/hardware/arduino/sam/libraries/WiFi/utility/spi_drv.h index 5c2e7063fae..8cafb1b3b4f 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/spi_drv.h +++ b/hardware/arduino/sam/libraries/WiFi/utility/spi_drv.h @@ -1,83 +1,83 @@ -#ifndef SPI_Drv_h -#define SPI_Drv_h - -#include -#include "wifi_spi.h" - -#define SPI_START_CMD_DELAY 12 - -#define NO_LAST_PARAM 0 -#define LAST_PARAM 1 - -#define DUMMY_DATA 0xFF - -#define WAIT_FOR_SLAVE_SELECT() \ - SpiDrv::waitForSlaveReady(); \ - SpiDrv::spiSlaveSelect(); - - - -class SpiDrv -{ -private: - //static bool waitSlaveReady(); - static void waitForSlaveSign(); - static void getParam(uint8_t* param); -public: - - static void begin(); - - static void end(); - - static void spiDriverInit(); - - static void spiSlaveSelect(); - - static void spiSlaveDeselect(); - - static char spiTransfer(volatile char data); - - static void waitForSlaveReady(); - - //static int waitSpiChar(char waitChar, char* readChar); - - static int waitSpiChar(unsigned char waitChar); - - static int readAndCheckChar(char checkChar, char* readChar); - - static char readChar(); - - static int waitResponseParams(uint8_t cmd, uint8_t numParam, tParam* params); - - static int waitResponseCmd(uint8_t cmd, uint8_t numParam, uint8_t* param, uint8_t* param_len); - - static int waitResponseData8(uint8_t cmd, uint8_t* param, uint8_t* param_len); - - static int waitResponseData16(uint8_t cmd, uint8_t* param, uint16_t* param_len); - /* - static int waitResponse(uint8_t cmd, tParam* params, uint8_t* numParamRead, uint8_t maxNumParams); - - static int waitResponse(uint8_t cmd, uint8_t numParam, uint8_t* param, uint16_t* param_len); -*/ - static int waitResponse(uint8_t cmd, uint8_t* numParamRead, uint8_t** params, uint8_t maxNumParams); - - static void sendParam(uint8_t* param, uint8_t param_len, uint8_t lastParam = NO_LAST_PARAM); - - static void sendParamLen8(uint8_t param_len); - - static void sendParamLen16(uint16_t param_len); - - static uint8_t readParamLen8(uint8_t* param_len = NULL); - - static uint16_t readParamLen16(uint16_t* param_len = NULL); - - static void sendBuffer(uint8_t* param, uint16_t param_len, uint8_t lastParam = NO_LAST_PARAM); - - static void sendParam(uint16_t param, uint8_t lastParam = NO_LAST_PARAM); - - static void sendCmd(uint8_t cmd, uint8_t numParam); -}; - -extern SpiDrv spiDrv; - -#endif +#ifndef SPI_Drv_h +#define SPI_Drv_h + +#include +#include "wifi_spi.h" + +#define SPI_START_CMD_DELAY 12 + +#define NO_LAST_PARAM 0 +#define LAST_PARAM 1 + +#define DUMMY_DATA 0xFF + +#define WAIT_FOR_SLAVE_SELECT() \ + SpiDrv::waitForSlaveReady(); \ + SpiDrv::spiSlaveSelect(); + + + +class SpiDrv +{ +private: + //static bool waitSlaveReady(); + static void waitForSlaveSign(); + static void getParam(uint8_t* param); +public: + + static void begin(); + + static void end(); + + static void spiDriverInit(); + + static void spiSlaveSelect(); + + static void spiSlaveDeselect(); + + static char spiTransfer(volatile char data); + + static void waitForSlaveReady(); + + //static int waitSpiChar(char waitChar, char* readChar); + + static int waitSpiChar(unsigned char waitChar); + + static int readAndCheckChar(char checkChar, char* readChar); + + static char readChar(); + + static int waitResponseParams(uint8_t cmd, uint8_t numParam, tParam* params); + + static int waitResponseCmd(uint8_t cmd, uint8_t numParam, uint8_t* param, uint8_t* param_len); + + static int waitResponseData8(uint8_t cmd, uint8_t* param, uint8_t* param_len); + + static int waitResponseData16(uint8_t cmd, uint8_t* param, uint16_t* param_len); + /* + static int waitResponse(uint8_t cmd, tParam* params, uint8_t* numParamRead, uint8_t maxNumParams); + + static int waitResponse(uint8_t cmd, uint8_t numParam, uint8_t* param, uint16_t* param_len); +*/ + static int waitResponse(uint8_t cmd, uint8_t* numParamRead, uint8_t** params, uint8_t maxNumParams); + + static void sendParam(uint8_t* param, uint8_t param_len, uint8_t lastParam = NO_LAST_PARAM); + + static void sendParamLen8(uint8_t param_len); + + static void sendParamLen16(uint16_t param_len); + + static uint8_t readParamLen8(uint8_t* param_len = NULL); + + static uint16_t readParamLen16(uint16_t* param_len = NULL); + + static void sendBuffer(uint8_t* param, uint16_t param_len, uint8_t lastParam = NO_LAST_PARAM); + + static void sendParam(uint16_t param, uint8_t lastParam = NO_LAST_PARAM); + + static void sendCmd(uint8_t cmd, uint8_t numParam); +}; + +extern SpiDrv spiDrv; + +#endif diff --git a/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.cpp b/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.cpp index 1ca169682c3..01023d7787c 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.cpp +++ b/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.cpp @@ -1,491 +1,491 @@ -#include -#include -#include - -#include "Arduino.h" -#include "spi_drv.h" -#include "wifi_drv.h" - -#define _DEBUG_ - -extern "C" { -#include "wifi_spi.h" -#include "wl_types.h" -#include "debug.h" -} - -// Array of data to cache the information related to the networks discovered -char WiFiDrv::_networkSsid[][WL_SSID_MAX_LENGTH] = {{"1"},{"2"},{"3"},{"4"},{"5"}}; -int32_t WiFiDrv::_networkRssi[WL_NETWORKS_LIST_MAXNUM] = { 0 }; -uint8_t WiFiDrv::_networkEncr[WL_NETWORKS_LIST_MAXNUM] = { 0 }; - -// Cached values of retrieved data -char WiFiDrv::_ssid[] = {0}; -uint8_t WiFiDrv::_bssid[] = {0}; -uint8_t WiFiDrv::_mac[] = {0}; -uint8_t WiFiDrv::_localIp[] = {0}; -uint8_t WiFiDrv::_subnetMask[] = {0}; -uint8_t WiFiDrv::_gatewayIp[] = {0}; -// Firmware version -char WiFiDrv::fwVersion[] = {0}; - - -// Private Methods - -void WiFiDrv::getNetworkData(uint8_t *ip, uint8_t *mask, uint8_t *gwip) -{ - tParam params[PARAM_NUMS_3] = { {0, (char*)ip}, {0, (char*)mask}, {0, (char*)gwip}}; - - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_IPADDR_CMD, PARAM_NUMS_1); - - uint8_t _dummy = DUMMY_DATA; - SpiDrv::sendParam(&_dummy, sizeof(_dummy), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - SpiDrv::waitResponseParams(GET_IPADDR_CMD, PARAM_NUMS_3, params); - - SpiDrv::spiSlaveDeselect(); -} - -// Public Methods - - -void WiFiDrv::wifiDriverInit() -{ - SpiDrv::begin(); -} - -int8_t WiFiDrv::wifiSetNetwork(char* ssid, uint8_t ssid_len) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(SET_NET_CMD, PARAM_NUMS_1); - SpiDrv::sendParam((uint8_t*)ssid, ssid_len, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(SET_NET_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - _data = WL_FAILURE; - } - SpiDrv::spiSlaveDeselect(); - - return(_data == WIFI_SPI_ACK) ? WL_SUCCESS : WL_FAILURE; -} - -int8_t WiFiDrv::wifiSetPassphrase(char* ssid, uint8_t ssid_len, const char *passphrase, const uint8_t len) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(SET_PASSPHRASE_CMD, PARAM_NUMS_2); - SpiDrv::sendParam((uint8_t*)ssid, ssid_len, NO_LAST_PARAM); - SpiDrv::sendParam((uint8_t*)passphrase, len, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(SET_PASSPHRASE_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - _data = WL_FAILURE; - } - SpiDrv::spiSlaveDeselect(); - return _data; -} - - -int8_t WiFiDrv::wifiSetKey(char* ssid, uint8_t ssid_len, uint8_t key_idx, const void *key, const uint8_t len) -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(SET_KEY_CMD, PARAM_NUMS_3); - SpiDrv::sendParam((uint8_t*)ssid, ssid_len, NO_LAST_PARAM); - SpiDrv::sendParam(&key_idx, KEY_IDX_LEN, NO_LAST_PARAM); - SpiDrv::sendParam((uint8_t*)key, len, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(SET_KEY_CMD, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - _data = WL_FAILURE; - } - SpiDrv::spiSlaveDeselect(); - return _data; -} - -int8_t WiFiDrv::disconnect() -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(DISCONNECT_CMD, PARAM_NUMS_1); - - uint8_t _dummy = DUMMY_DATA; - SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - int8_t result = SpiDrv::waitResponseCmd(DISCONNECT_CMD, PARAM_NUMS_1, &_data, &_dataLen); - - SpiDrv::spiSlaveDeselect(); - - return result; -} - -uint8_t WiFiDrv::getConnectionStatus() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_CONN_STATUS_CMD, PARAM_NUMS_0); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = -1; - uint8_t _dataLen = 0; - SpiDrv::waitResponseCmd(GET_CONN_STATUS_CMD, PARAM_NUMS_1, &_data, &_dataLen); - - SpiDrv::spiSlaveDeselect(); - - return _data; -} - -uint8_t* WiFiDrv::getMacAddress() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_MACADDR_CMD, PARAM_NUMS_1); - - uint8_t _dummy = DUMMY_DATA; - SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _dataLen = 0; - SpiDrv::waitResponseCmd(GET_MACADDR_CMD, PARAM_NUMS_1, _mac, &_dataLen); - - SpiDrv::spiSlaveDeselect(); - - return _mac; -} - -void WiFiDrv::getIpAddress(IPAddress& ip) -{ - getNetworkData(_localIp, _subnetMask, _gatewayIp); - ip = _localIp; -} - - void WiFiDrv::getSubnetMask(IPAddress& mask) - { - getNetworkData(_localIp, _subnetMask, _gatewayIp); - mask = _subnetMask; - } - - void WiFiDrv::getGatewayIP(IPAddress& ip) - { - getNetworkData(_localIp, _subnetMask, _gatewayIp); - ip = _gatewayIp; - } - -char* WiFiDrv::getCurrentSSID() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_CURR_SSID_CMD, PARAM_NUMS_1); - - uint8_t _dummy = DUMMY_DATA; - SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _dataLen = 0; - SpiDrv::waitResponseCmd(GET_CURR_SSID_CMD, PARAM_NUMS_1, (uint8_t*)_ssid, &_dataLen); - - SpiDrv::spiSlaveDeselect(); - - return _ssid; -} - -uint8_t* WiFiDrv::getCurrentBSSID() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_CURR_BSSID_CMD, PARAM_NUMS_1); - - uint8_t _dummy = DUMMY_DATA; - SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _dataLen = 0; - SpiDrv::waitResponseCmd(GET_CURR_BSSID_CMD, PARAM_NUMS_1, _bssid, &_dataLen); - - SpiDrv::spiSlaveDeselect(); - - return _bssid; -} - -int32_t WiFiDrv::getCurrentRSSI() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_CURR_RSSI_CMD, PARAM_NUMS_1); - - uint8_t _dummy = DUMMY_DATA; - SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _dataLen = 0; - int32_t rssi = 0; - SpiDrv::waitResponseCmd(GET_CURR_RSSI_CMD, PARAM_NUMS_1, (uint8_t*)&rssi, &_dataLen); - - SpiDrv::spiSlaveDeselect(); - - return rssi; -} - -uint8_t WiFiDrv::getCurrentEncryptionType() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_CURR_ENCT_CMD, PARAM_NUMS_1); - - uint8_t _dummy = DUMMY_DATA; - SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t dataLen = 0; - uint8_t encType = 0; - SpiDrv::waitResponseCmd(GET_CURR_ENCT_CMD, PARAM_NUMS_1, (uint8_t*)&encType, &dataLen); - - SpiDrv::spiSlaveDeselect(); - - return encType; -} - -int8_t WiFiDrv::startScanNetworks() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(START_SCAN_NETWORKS, PARAM_NUMS_0); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - - if (!SpiDrv::waitResponseCmd(START_SCAN_NETWORKS, PARAM_NUMS_1, &_data, &_dataLen)) - { - WARN("error waitResponse"); - _data = WL_FAILURE; - } - - SpiDrv::spiSlaveDeselect(); - - return (_data == WL_FAILURE)? _data : WL_SUCCESS; -} - - -uint8_t WiFiDrv::getScanNetworks() -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(SCAN_NETWORKS, PARAM_NUMS_0); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t ssidListNum = 0; - SpiDrv::waitResponse(SCAN_NETWORKS, &ssidListNum, (uint8_t**)_networkSsid, WL_NETWORKS_LIST_MAXNUM); - - SpiDrv::spiSlaveDeselect(); - - return ssidListNum; -} - -char* WiFiDrv::getSSIDNetoworks(uint8_t networkItem) -{ - if (networkItem >= WL_NETWORKS_LIST_MAXNUM) - return NULL; - - return _networkSsid[networkItem]; -} - -uint8_t WiFiDrv::getEncTypeNetowrks(uint8_t networkItem) -{ - if (networkItem >= WL_NETWORKS_LIST_MAXNUM) - return NULL; - - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_IDX_ENCT_CMD, PARAM_NUMS_1); - - SpiDrv::sendParam(&networkItem, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t dataLen = 0; - uint8_t encType = 0; - SpiDrv::waitResponseCmd(GET_IDX_ENCT_CMD, PARAM_NUMS_1, (uint8_t*)&encType, &dataLen); - - SpiDrv::spiSlaveDeselect(); - - return encType; -} - -int32_t WiFiDrv::getRSSINetoworks(uint8_t networkItem) -{ - if (networkItem >= WL_NETWORKS_LIST_MAXNUM) - return NULL; - int32_t networkRssi = 0; - - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(GET_IDX_RSSI_CMD, PARAM_NUMS_1); - - SpiDrv::sendParam(&networkItem, 1, LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t dataLen = 0; - SpiDrv::waitResponseCmd(GET_IDX_RSSI_CMD, PARAM_NUMS_1, (uint8_t*)&networkRssi, &dataLen); - - SpiDrv::spiSlaveDeselect(); - - return networkRssi; -} - -uint8_t WiFiDrv::reqHostByName(const char* aHostname) -{ - WAIT_FOR_SLAVE_SELECT(); - - // Send Command - SpiDrv::sendCmd(REQ_HOST_BY_NAME_CMD, PARAM_NUMS_1); - SpiDrv::sendParam((uint8_t*)aHostname, strlen(aHostname), LAST_PARAM); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _data = 0; - uint8_t _dataLen = 0; - uint8_t result = SpiDrv::waitResponseCmd(REQ_HOST_BY_NAME_CMD, PARAM_NUMS_1, &_data, &_dataLen); - - SpiDrv::spiSlaveDeselect(); - - return result; -} - -int WiFiDrv::getHostByName(IPAddress& aResult) -{ - uint8_t _ipAddr[WL_IPV4_LENGTH]; - IPAddress dummy(0xFF,0xFF,0xFF,0xFF); - int result = 0; - - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(GET_HOST_BY_NAME_CMD, PARAM_NUMS_0); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(GET_HOST_BY_NAME_CMD, PARAM_NUMS_1, _ipAddr, &_dataLen)) - { - WARN("error waitResponse"); - }else{ - aResult = _ipAddr; - result = (aResult != dummy); - } - SpiDrv::spiSlaveDeselect(); - return result; -} - -int WiFiDrv::getHostByName(const char* aHostname, IPAddress& aResult) -{ - uint8_t retry = 10; - if (reqHostByName(aHostname)) - { - while(!getHostByName(aResult) && --retry > 0) - { - delay(1000); - } - }else{ - return 0; - } - return (retry>0); -} - -char* WiFiDrv::getFwVersion() -{ - WAIT_FOR_SLAVE_SELECT(); - // Send Command - SpiDrv::sendCmd(GET_FW_VERSION_CMD, PARAM_NUMS_0); - - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - - // Wait for reply - uint8_t _dataLen = 0; - if (!SpiDrv::waitResponseCmd(GET_FW_VERSION_CMD, PARAM_NUMS_1, (uint8_t*)fwVersion, &_dataLen)) - { - WARN("error waitResponse"); - } - SpiDrv::spiSlaveDeselect(); - return fwVersion; -} - -WiFiDrv wiFiDrv; +#include +#include +#include + +#include "Arduino.h" +#include "spi_drv.h" +#include "wifi_drv.h" + +#define _DEBUG_ + +extern "C" { +#include "wifi_spi.h" +#include "wl_types.h" +#include "debug.h" +} + +// Array of data to cache the information related to the networks discovered +char WiFiDrv::_networkSsid[][WL_SSID_MAX_LENGTH] = {{"1"},{"2"},{"3"},{"4"},{"5"}}; +int32_t WiFiDrv::_networkRssi[WL_NETWORKS_LIST_MAXNUM] = { 0 }; +uint8_t WiFiDrv::_networkEncr[WL_NETWORKS_LIST_MAXNUM] = { 0 }; + +// Cached values of retrieved data +char WiFiDrv::_ssid[] = {0}; +uint8_t WiFiDrv::_bssid[] = {0}; +uint8_t WiFiDrv::_mac[] = {0}; +uint8_t WiFiDrv::_localIp[] = {0}; +uint8_t WiFiDrv::_subnetMask[] = {0}; +uint8_t WiFiDrv::_gatewayIp[] = {0}; +// Firmware version +char WiFiDrv::fwVersion[] = {0}; + + +// Private Methods + +void WiFiDrv::getNetworkData(uint8_t *ip, uint8_t *mask, uint8_t *gwip) +{ + tParam params[PARAM_NUMS_3] = { {0, (char*)ip}, {0, (char*)mask}, {0, (char*)gwip}}; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_IPADDR_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, sizeof(_dummy), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + SpiDrv::waitResponseParams(GET_IPADDR_CMD, PARAM_NUMS_3, params); + + SpiDrv::spiSlaveDeselect(); +} + +// Public Methods + + +void WiFiDrv::wifiDriverInit() +{ + SpiDrv::begin(); +} + +int8_t WiFiDrv::wifiSetNetwork(char* ssid, uint8_t ssid_len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_NET_CMD, PARAM_NUMS_1); + SpiDrv::sendParam((uint8_t*)ssid, ssid_len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_NET_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); + + return(_data == WIFI_SPI_ACK) ? WL_SUCCESS : WL_FAILURE; +} + +int8_t WiFiDrv::wifiSetPassphrase(char* ssid, uint8_t ssid_len, const char *passphrase, const uint8_t len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_PASSPHRASE_CMD, PARAM_NUMS_2); + SpiDrv::sendParam((uint8_t*)ssid, ssid_len, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)passphrase, len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_PASSPHRASE_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); + return _data; +} + + +int8_t WiFiDrv::wifiSetKey(char* ssid, uint8_t ssid_len, uint8_t key_idx, const void *key, const uint8_t len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_KEY_CMD, PARAM_NUMS_3); + SpiDrv::sendParam((uint8_t*)ssid, ssid_len, NO_LAST_PARAM); + SpiDrv::sendParam(&key_idx, KEY_IDX_LEN, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)key, len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_KEY_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); + return _data; +} + +int8_t WiFiDrv::disconnect() +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(DISCONNECT_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + int8_t result = SpiDrv::waitResponseCmd(DISCONNECT_CMD, PARAM_NUMS_1, &_data, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return result; +} + +uint8_t WiFiDrv::getConnectionStatus() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CONN_STATUS_CMD, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = -1; + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_CONN_STATUS_CMD, PARAM_NUMS_1, &_data, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _data; +} + +uint8_t* WiFiDrv::getMacAddress() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_MACADDR_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_MACADDR_CMD, PARAM_NUMS_1, _mac, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _mac; +} + +void WiFiDrv::getIpAddress(IPAddress& ip) +{ + getNetworkData(_localIp, _subnetMask, _gatewayIp); + ip = _localIp; +} + + void WiFiDrv::getSubnetMask(IPAddress& mask) + { + getNetworkData(_localIp, _subnetMask, _gatewayIp); + mask = _subnetMask; + } + + void WiFiDrv::getGatewayIP(IPAddress& ip) + { + getNetworkData(_localIp, _subnetMask, _gatewayIp); + ip = _gatewayIp; + } + +char* WiFiDrv::getCurrentSSID() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_SSID_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_CURR_SSID_CMD, PARAM_NUMS_1, (uint8_t*)_ssid, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _ssid; +} + +uint8_t* WiFiDrv::getCurrentBSSID() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_BSSID_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_CURR_BSSID_CMD, PARAM_NUMS_1, _bssid, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _bssid; +} + +int32_t WiFiDrv::getCurrentRSSI() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_RSSI_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + int32_t rssi = 0; + SpiDrv::waitResponseCmd(GET_CURR_RSSI_CMD, PARAM_NUMS_1, (uint8_t*)&rssi, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return rssi; +} + +uint8_t WiFiDrv::getCurrentEncryptionType() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_ENCT_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t dataLen = 0; + uint8_t encType = 0; + SpiDrv::waitResponseCmd(GET_CURR_ENCT_CMD, PARAM_NUMS_1, (uint8_t*)&encType, &dataLen); + + SpiDrv::spiSlaveDeselect(); + + return encType; +} + +int8_t WiFiDrv::startScanNetworks() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(START_SCAN_NETWORKS, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + + if (!SpiDrv::waitResponseCmd(START_SCAN_NETWORKS, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + + SpiDrv::spiSlaveDeselect(); + + return (_data == WL_FAILURE)? _data : WL_SUCCESS; +} + + +uint8_t WiFiDrv::getScanNetworks() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(SCAN_NETWORKS, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t ssidListNum = 0; + SpiDrv::waitResponse(SCAN_NETWORKS, &ssidListNum, (uint8_t**)_networkSsid, WL_NETWORKS_LIST_MAXNUM); + + SpiDrv::spiSlaveDeselect(); + + return ssidListNum; +} + +char* WiFiDrv::getSSIDNetoworks(uint8_t networkItem) +{ + if (networkItem >= WL_NETWORKS_LIST_MAXNUM) + return NULL; + + return _networkSsid[networkItem]; +} + +uint8_t WiFiDrv::getEncTypeNetowrks(uint8_t networkItem) +{ + if (networkItem >= WL_NETWORKS_LIST_MAXNUM) + return NULL; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_IDX_ENCT_CMD, PARAM_NUMS_1); + + SpiDrv::sendParam(&networkItem, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t dataLen = 0; + uint8_t encType = 0; + SpiDrv::waitResponseCmd(GET_IDX_ENCT_CMD, PARAM_NUMS_1, (uint8_t*)&encType, &dataLen); + + SpiDrv::spiSlaveDeselect(); + + return encType; +} + +int32_t WiFiDrv::getRSSINetoworks(uint8_t networkItem) +{ + if (networkItem >= WL_NETWORKS_LIST_MAXNUM) + return NULL; + int32_t networkRssi = 0; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_IDX_RSSI_CMD, PARAM_NUMS_1); + + SpiDrv::sendParam(&networkItem, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t dataLen = 0; + SpiDrv::waitResponseCmd(GET_IDX_RSSI_CMD, PARAM_NUMS_1, (uint8_t*)&networkRssi, &dataLen); + + SpiDrv::spiSlaveDeselect(); + + return networkRssi; +} + +uint8_t WiFiDrv::reqHostByName(const char* aHostname) +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(REQ_HOST_BY_NAME_CMD, PARAM_NUMS_1); + SpiDrv::sendParam((uint8_t*)aHostname, strlen(aHostname), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + uint8_t result = SpiDrv::waitResponseCmd(REQ_HOST_BY_NAME_CMD, PARAM_NUMS_1, &_data, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return result; +} + +int WiFiDrv::getHostByName(IPAddress& aResult) +{ + uint8_t _ipAddr[WL_IPV4_LENGTH]; + IPAddress dummy(0xFF,0xFF,0xFF,0xFF); + int result = 0; + + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_HOST_BY_NAME_CMD, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(GET_HOST_BY_NAME_CMD, PARAM_NUMS_1, _ipAddr, &_dataLen)) + { + WARN("error waitResponse"); + }else{ + aResult = _ipAddr; + result = (aResult != dummy); + } + SpiDrv::spiSlaveDeselect(); + return result; +} + +int WiFiDrv::getHostByName(const char* aHostname, IPAddress& aResult) +{ + uint8_t retry = 10; + if (reqHostByName(aHostname)) + { + while(!getHostByName(aResult) && --retry > 0) + { + delay(1000); + } + }else{ + return 0; + } + return (retry>0); +} + +char* WiFiDrv::getFwVersion() +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_FW_VERSION_CMD, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(GET_FW_VERSION_CMD, PARAM_NUMS_1, (uint8_t*)fwVersion, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + return fwVersion; +} + +WiFiDrv wiFiDrv; diff --git a/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.h b/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.h index c4f04dbe73a..8aeb8aeee1c 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.h +++ b/hardware/arduino/sam/libraries/WiFi/utility/wifi_drv.h @@ -1,219 +1,219 @@ -#ifndef WiFi_Drv_h -#define WiFi_Drv_h - -#include -#include "wifi_spi.h" -#include "IPAddress.h" - -// Key index length -#define KEY_IDX_LEN 1 -// 5 secs of delay to have the connection established -#define WL_DELAY_START_CONNECTION 5000 -// firmware version string length -#define WL_FW_VER_LENGTH 6 - -class WiFiDrv -{ -private: - // settings of requested network - static char _networkSsid[WL_NETWORKS_LIST_MAXNUM][WL_SSID_MAX_LENGTH]; - static int32_t _networkRssi[WL_NETWORKS_LIST_MAXNUM]; - static uint8_t _networkEncr[WL_NETWORKS_LIST_MAXNUM]; - - // firmware version string in the format a.b.c - static char fwVersion[WL_FW_VER_LENGTH]; - - // settings of current selected network - static char _ssid[WL_SSID_MAX_LENGTH]; - static uint8_t _bssid[WL_MAC_ADDR_LENGTH]; - static uint8_t _mac[WL_MAC_ADDR_LENGTH]; - static uint8_t _localIp[WL_IPV4_LENGTH]; - static uint8_t _subnetMask[WL_IPV4_LENGTH]; - static uint8_t _gatewayIp[WL_IPV4_LENGTH]; - - /* - * Get network Data information - */ - static void getNetworkData(uint8_t *ip, uint8_t *mask, uint8_t *gwip); - - static uint8_t reqHostByName(const char* aHostname); - - static int getHostByName(IPAddress& aResult); - -public: - - /* - * Driver initialization - */ - static void wifiDriverInit(); - - /* - * Set the desired network which the connection manager should try to - * connect to. - * - * The ssid of the desired network should be specified. - * - * param ssid: The ssid of the desired network. - * param ssid_len: Lenght of ssid string. - * return: WL_SUCCESS or WL_FAILURE - */ - static int8_t wifiSetNetwork(char* ssid, uint8_t ssid_len); - - /* Start Wifi connection with passphrase - * the most secure supported mode will be automatically selected - * - * param ssid: Pointer to the SSID string. - * param ssid_len: Lenght of ssid string. - * param passphrase: Passphrase. Valid characters in a passphrase - * must be between ASCII 32-126 (decimal). - * param len: Lenght of passphrase string. - * return: WL_SUCCESS or WL_FAILURE - */ - static int8_t wifiSetPassphrase(char* ssid, uint8_t ssid_len, const char *passphrase, const uint8_t len); - - /* Start Wifi connection with WEP encryption. - * Configure a key into the device. The key type (WEP-40, WEP-104) - * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). - * - * param ssid: Pointer to the SSID string. - * param ssid_len: Lenght of ssid string. - * param key_idx: The key index to set. Valid values are 0-3. - * param key: Key input buffer. - * param len: Lenght of key string. - * return: WL_SUCCESS or WL_FAILURE - */ - static int8_t wifiSetKey(char* ssid, uint8_t ssid_len, uint8_t key_idx, const void *key, const uint8_t len); - - /* - * Disconnect from the network - * - * return: WL_SUCCESS or WL_FAILURE - */ - static int8_t disconnect(); - - /* - * Disconnect from the network - * - * return: one value of wl_status_t enum - */ - static uint8_t getConnectionStatus(); - - /* - * Get the interface MAC address. - * - * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - */ - static uint8_t* getMacAddress(); - - /* - * Get the interface IP address. - * - * return: copy the ip address value in IPAddress object - */ - static void getIpAddress(IPAddress& ip); - - /* - * Get the interface subnet mask address. - * - * return: copy the subnet mask address value in IPAddress object - */ - static void getSubnetMask(IPAddress& mask); - - /* - * Get the gateway ip address. - * - * return: copy the gateway ip address value in IPAddress object - */ - static void getGatewayIP(IPAddress& ip); - - /* - * Return the current SSID associated with the network - * - * return: ssid string - */ - static char* getCurrentSSID(); - - /* - * Return the current BSSID associated with the network. - * It is the MAC address of the Access Point - * - * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - */ - static uint8_t* getCurrentBSSID(); - - /* - * Return the current RSSI /Received Signal Strength in dBm) - * associated with the network - * - * return: signed value - */ - static int32_t getCurrentRSSI(); - - /* - * Return the Encryption Type associated with the network - * - * return: one value of wl_enc_type enum - */ - static uint8_t getCurrentEncryptionType(); - - /* - * Start scan WiFi networks available - * - * return: Number of discovered networks - */ - static int8_t startScanNetworks(); - - /* - * Get the networks available - * - * return: Number of discovered networks - */ - static uint8_t getScanNetworks(); - - /* - * Return the SSID discovered during the network scan. - * - * param networkItem: specify from which network item want to get the information - * - * return: ssid string of the specified item on the networks scanned list - */ - static char* getSSIDNetoworks(uint8_t networkItem); - - /* - * Return the RSSI of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: signed value of RSSI of the specified item on the networks scanned list - */ - static int32_t getRSSINetoworks(uint8_t networkItem); - - /* - * Return the encryption type of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list - */ - static uint8_t getEncTypeNetowrks(uint8_t networkItem); - - /* - * Resolve the given hostname to an IP address. - * param aHostname: Name to be resolved - * param aResult: IPAddress structure to store the returned IP address - * result: 1 if aIPAddrString was successfully converted to an IP address, - * else error code - */ - static int getHostByName(const char* aHostname, IPAddress& aResult); - - /* - * Get the firmware version - * result: version as string with this format a.b.c - */ - static char* getFwVersion(); - -}; - -extern WiFiDrv wiFiDrv; - -#endif +#ifndef WiFi_Drv_h +#define WiFi_Drv_h + +#include +#include "wifi_spi.h" +#include "IPAddress.h" + +// Key index length +#define KEY_IDX_LEN 1 +// 5 secs of delay to have the connection established +#define WL_DELAY_START_CONNECTION 5000 +// firmware version string length +#define WL_FW_VER_LENGTH 6 + +class WiFiDrv +{ +private: + // settings of requested network + static char _networkSsid[WL_NETWORKS_LIST_MAXNUM][WL_SSID_MAX_LENGTH]; + static int32_t _networkRssi[WL_NETWORKS_LIST_MAXNUM]; + static uint8_t _networkEncr[WL_NETWORKS_LIST_MAXNUM]; + + // firmware version string in the format a.b.c + static char fwVersion[WL_FW_VER_LENGTH]; + + // settings of current selected network + static char _ssid[WL_SSID_MAX_LENGTH]; + static uint8_t _bssid[WL_MAC_ADDR_LENGTH]; + static uint8_t _mac[WL_MAC_ADDR_LENGTH]; + static uint8_t _localIp[WL_IPV4_LENGTH]; + static uint8_t _subnetMask[WL_IPV4_LENGTH]; + static uint8_t _gatewayIp[WL_IPV4_LENGTH]; + + /* + * Get network Data information + */ + static void getNetworkData(uint8_t *ip, uint8_t *mask, uint8_t *gwip); + + static uint8_t reqHostByName(const char* aHostname); + + static int getHostByName(IPAddress& aResult); + +public: + + /* + * Driver initialization + */ + static void wifiDriverInit(); + + /* + * Set the desired network which the connection manager should try to + * connect to. + * + * The ssid of the desired network should be specified. + * + * param ssid: The ssid of the desired network. + * param ssid_len: Lenght of ssid string. + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t wifiSetNetwork(char* ssid, uint8_t ssid_len); + + /* Start Wifi connection with passphrase + * the most secure supported mode will be automatically selected + * + * param ssid: Pointer to the SSID string. + * param ssid_len: Lenght of ssid string. + * param passphrase: Passphrase. Valid characters in a passphrase + * must be between ASCII 32-126 (decimal). + * param len: Lenght of passphrase string. + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t wifiSetPassphrase(char* ssid, uint8_t ssid_len, const char *passphrase, const uint8_t len); + + /* Start Wifi connection with WEP encryption. + * Configure a key into the device. The key type (WEP-40, WEP-104) + * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). + * + * param ssid: Pointer to the SSID string. + * param ssid_len: Lenght of ssid string. + * param key_idx: The key index to set. Valid values are 0-3. + * param key: Key input buffer. + * param len: Lenght of key string. + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t wifiSetKey(char* ssid, uint8_t ssid_len, uint8_t key_idx, const void *key, const uint8_t len); + + /* + * Disconnect from the network + * + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t disconnect(); + + /* + * Disconnect from the network + * + * return: one value of wl_status_t enum + */ + static uint8_t getConnectionStatus(); + + /* + * Get the interface MAC address. + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ + static uint8_t* getMacAddress(); + + /* + * Get the interface IP address. + * + * return: copy the ip address value in IPAddress object + */ + static void getIpAddress(IPAddress& ip); + + /* + * Get the interface subnet mask address. + * + * return: copy the subnet mask address value in IPAddress object + */ + static void getSubnetMask(IPAddress& mask); + + /* + * Get the gateway ip address. + * + * return: copy the gateway ip address value in IPAddress object + */ + static void getGatewayIP(IPAddress& ip); + + /* + * Return the current SSID associated with the network + * + * return: ssid string + */ + static char* getCurrentSSID(); + + /* + * Return the current BSSID associated with the network. + * It is the MAC address of the Access Point + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ + static uint8_t* getCurrentBSSID(); + + /* + * Return the current RSSI /Received Signal Strength in dBm) + * associated with the network + * + * return: signed value + */ + static int32_t getCurrentRSSI(); + + /* + * Return the Encryption Type associated with the network + * + * return: one value of wl_enc_type enum + */ + static uint8_t getCurrentEncryptionType(); + + /* + * Start scan WiFi networks available + * + * return: Number of discovered networks + */ + static int8_t startScanNetworks(); + + /* + * Get the networks available + * + * return: Number of discovered networks + */ + static uint8_t getScanNetworks(); + + /* + * Return the SSID discovered during the network scan. + * + * param networkItem: specify from which network item want to get the information + * + * return: ssid string of the specified item on the networks scanned list + */ + static char* getSSIDNetoworks(uint8_t networkItem); + + /* + * Return the RSSI of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: signed value of RSSI of the specified item on the networks scanned list + */ + static int32_t getRSSINetoworks(uint8_t networkItem); + + /* + * Return the encryption type of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ + static uint8_t getEncTypeNetowrks(uint8_t networkItem); + + /* + * Resolve the given hostname to an IP address. + * param aHostname: Name to be resolved + * param aResult: IPAddress structure to store the returned IP address + * result: 1 if aIPAddrString was successfully converted to an IP address, + * else error code + */ + static int getHostByName(const char* aHostname, IPAddress& aResult); + + /* + * Get the firmware version + * result: version as string with this format a.b.c + */ + static char* getFwVersion(); + +}; + +extern WiFiDrv wiFiDrv; + +#endif diff --git a/hardware/arduino/sam/libraries/WiFi/utility/wifi_spi.h b/hardware/arduino/sam/libraries/WiFi/utility/wifi_spi.h index bf479e2ec0e..adf8befab46 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/wifi_spi.h +++ b/hardware/arduino/sam/libraries/WiFi/utility/wifi_spi.h @@ -1,144 +1,144 @@ -#ifndef WiFi_Spi_h -#define WiFi_Spi_h - -#include "wl_definitions.h" - -#define CMD_FLAG 0 -#define REPLY_FLAG 1<<7 -#define DATA_FLAG 0x40 - -#define WIFI_SPI_ACK 1 -#define WIFI_SPI_ERR 0xFF - -#define TIMEOUT_CHAR 1000 - -//#define MAX_SOCK_NUM 4 /**< Maxmium number of socket */ -#define NO_SOCKET_AVAIL 255 - -#define START_CMD 0xE0 -#define END_CMD 0xEE -#define ERR_CMD 0xEF - -enum { - SET_NET_CMD = 0x10, - SET_PASSPHRASE_CMD = 0x11, - SET_KEY_CMD = 0x12, - TEST_CMD = 0x13, - - GET_CONN_STATUS_CMD = 0x20, - GET_IPADDR_CMD = 0x21, - GET_MACADDR_CMD = 0x22, - GET_CURR_SSID_CMD = 0x23, - GET_CURR_BSSID_CMD = 0x24, - GET_CURR_RSSI_CMD = 0x25, - GET_CURR_ENCT_CMD = 0x26, - SCAN_NETWORKS = 0x27, - START_SERVER_TCP_CMD= 0x28, - GET_STATE_TCP_CMD = 0x29, - DATA_SENT_TCP_CMD = 0x2A, - AVAIL_DATA_TCP_CMD = 0x2B, - GET_DATA_TCP_CMD = 0x2C, - START_CLIENT_TCP_CMD= 0x2D, - STOP_CLIENT_TCP_CMD = 0x2E, - GET_CLIENT_STATE_TCP_CMD= 0x2F, - DISCONNECT_CMD = 0x30, - GET_IDX_SSID_CMD = 0x31, - GET_IDX_RSSI_CMD = 0x32, - GET_IDX_ENCT_CMD = 0x33, - REQ_HOST_BY_NAME_CMD= 0x34, - GET_HOST_BY_NAME_CMD= 0x35, - START_SCAN_NETWORKS = 0x36, - GET_FW_VERSION_CMD = 0x37, - - // All command with DATA_FLAG 0x40 send a 16bit Len - - SEND_DATA_TCP_CMD = 0x44, - GET_DATABUF_TCP_CMD = 0x45, -}; - - -enum wl_tcp_state { - CLOSED = 0, - LISTEN = 1, - SYN_SENT = 2, - SYN_RCVD = 3, - ESTABLISHED = 4, - FIN_WAIT_1 = 5, - FIN_WAIT_2 = 6, - CLOSE_WAIT = 7, - CLOSING = 8, - LAST_ACK = 9, - TIME_WAIT = 10 -}; - - -enum numParams{ - PARAM_NUMS_0, - PARAM_NUMS_1, - PARAM_NUMS_2, - PARAM_NUMS_3, - PARAM_NUMS_4, - PARAM_NUMS_5, - MAX_PARAM_NUMS -}; - -#define MAX_PARAMS MAX_PARAM_NUMS-1 -#define PARAM_LEN_SIZE 1 - -typedef struct __attribute__((__packed__)) -{ - uint8_t paramLen; - char* param; -}tParam; - -typedef struct __attribute__((__packed__)) -{ - uint16_t dataLen; - char* data; -}tDataParam; - - -typedef struct __attribute__((__packed__)) -{ - unsigned char cmd; - unsigned char tcmd; - unsigned char nParam; - tParam params[MAX_PARAMS]; -}tSpiMsg; - -typedef struct __attribute__((__packed__)) -{ - unsigned char cmd; - unsigned char tcmd; - unsigned char nParam; - tDataParam params[MAX_PARAMS]; -}tSpiMsgData; - - -typedef struct __attribute__((__packed__)) -{ - unsigned char cmd; - unsigned char tcmd; - //unsigned char totLen; - unsigned char nParam; -}tSpiHdr; - -typedef struct __attribute__((__packed__)) -{ - uint8_t paramLen; - uint32_t param; -}tLongParam; - -typedef struct __attribute__((__packed__)) -{ - uint8_t paramLen; - uint16_t param; -}tIntParam; - -typedef struct __attribute__((__packed__)) -{ - uint8_t paramLen; - uint8_t param; -}tByteParam; - -#endif +#ifndef WiFi_Spi_h +#define WiFi_Spi_h + +#include "wl_definitions.h" + +#define CMD_FLAG 0 +#define REPLY_FLAG 1<<7 +#define DATA_FLAG 0x40 + +#define WIFI_SPI_ACK 1 +#define WIFI_SPI_ERR 0xFF + +#define TIMEOUT_CHAR 1000 + +//#define MAX_SOCK_NUM 4 /**< Maxmium number of socket */ +#define NO_SOCKET_AVAIL 255 + +#define START_CMD 0xE0 +#define END_CMD 0xEE +#define ERR_CMD 0xEF + +enum { + SET_NET_CMD = 0x10, + SET_PASSPHRASE_CMD = 0x11, + SET_KEY_CMD = 0x12, + TEST_CMD = 0x13, + + GET_CONN_STATUS_CMD = 0x20, + GET_IPADDR_CMD = 0x21, + GET_MACADDR_CMD = 0x22, + GET_CURR_SSID_CMD = 0x23, + GET_CURR_BSSID_CMD = 0x24, + GET_CURR_RSSI_CMD = 0x25, + GET_CURR_ENCT_CMD = 0x26, + SCAN_NETWORKS = 0x27, + START_SERVER_TCP_CMD= 0x28, + GET_STATE_TCP_CMD = 0x29, + DATA_SENT_TCP_CMD = 0x2A, + AVAIL_DATA_TCP_CMD = 0x2B, + GET_DATA_TCP_CMD = 0x2C, + START_CLIENT_TCP_CMD= 0x2D, + STOP_CLIENT_TCP_CMD = 0x2E, + GET_CLIENT_STATE_TCP_CMD= 0x2F, + DISCONNECT_CMD = 0x30, + GET_IDX_SSID_CMD = 0x31, + GET_IDX_RSSI_CMD = 0x32, + GET_IDX_ENCT_CMD = 0x33, + REQ_HOST_BY_NAME_CMD= 0x34, + GET_HOST_BY_NAME_CMD= 0x35, + START_SCAN_NETWORKS = 0x36, + GET_FW_VERSION_CMD = 0x37, + + // All command with DATA_FLAG 0x40 send a 16bit Len + + SEND_DATA_TCP_CMD = 0x44, + GET_DATABUF_TCP_CMD = 0x45, +}; + + +enum wl_tcp_state { + CLOSED = 0, + LISTEN = 1, + SYN_SENT = 2, + SYN_RCVD = 3, + ESTABLISHED = 4, + FIN_WAIT_1 = 5, + FIN_WAIT_2 = 6, + CLOSE_WAIT = 7, + CLOSING = 8, + LAST_ACK = 9, + TIME_WAIT = 10 +}; + + +enum numParams{ + PARAM_NUMS_0, + PARAM_NUMS_1, + PARAM_NUMS_2, + PARAM_NUMS_3, + PARAM_NUMS_4, + PARAM_NUMS_5, + MAX_PARAM_NUMS +}; + +#define MAX_PARAMS MAX_PARAM_NUMS-1 +#define PARAM_LEN_SIZE 1 + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + char* param; +}tParam; + +typedef struct __attribute__((__packed__)) +{ + uint16_t dataLen; + char* data; +}tDataParam; + + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + unsigned char nParam; + tParam params[MAX_PARAMS]; +}tSpiMsg; + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + unsigned char nParam; + tDataParam params[MAX_PARAMS]; +}tSpiMsgData; + + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + //unsigned char totLen; + unsigned char nParam; +}tSpiHdr; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint32_t param; +}tLongParam; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint16_t param; +}tIntParam; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint8_t param; +}tByteParam; + +#endif diff --git a/hardware/arduino/sam/libraries/WiFi/utility/wl_types.h b/hardware/arduino/sam/libraries/WiFi/utility/wl_types.h index 82b309d7f96..5eed7eeb9ea 100644 --- a/hardware/arduino/sam/libraries/WiFi/utility/wl_types.h +++ b/hardware/arduino/sam/libraries/WiFi/utility/wl_types.h @@ -1,31 +1,31 @@ -/* - * wl_types.h - * - * Created on: Jul 30, 2010 - * Author: dlafauci - */ - - -#ifndef _WL_TYPES_H_ -#define _WL_TYPES_H_ - -#include - -typedef enum { - WL_FAILURE = -1, - WL_SUCCESS = 1, -} wl_error_code_t; - -/* Authentication modes */ -enum wl_auth_mode { - AUTH_MODE_INVALID, - AUTH_MODE_AUTO, - AUTH_MODE_OPEN_SYSTEM, - AUTH_MODE_SHARED_KEY, - AUTH_MODE_WPA, - AUTH_MODE_WPA2, - AUTH_MODE_WPA_PSK, - AUTH_MODE_WPA2_PSK -}; - -#endif //_WL_TYPES_H_ +/* + * wl_types.h + * + * Created on: Jul 30, 2010 + * Author: dlafauci + */ + + +#ifndef _WL_TYPES_H_ +#define _WL_TYPES_H_ + +#include + +typedef enum { + WL_FAILURE = -1, + WL_SUCCESS = 1, +} wl_error_code_t; + +/* Authentication modes */ +enum wl_auth_mode { + AUTH_MODE_INVALID, + AUTH_MODE_AUTO, + AUTH_MODE_OPEN_SYSTEM, + AUTH_MODE_SHARED_KEY, + AUTH_MODE_WPA, + AUTH_MODE_WPA2, + AUTH_MODE_WPA_PSK, + AUTH_MODE_WPA2_PSK +}; + +#endif //_WL_TYPES_H_ diff --git a/libraries/SD/utility/FatStructs.h b/libraries/SD/utility/FatStructs.h index 8a2d9ebcc1c..32ccd6b8433 100644 --- a/libraries/SD/utility/FatStructs.h +++ b/libraries/SD/utility/FatStructs.h @@ -1,418 +1,418 @@ -/* Arduino SdFat Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ -#ifndef FatStructs_h -#define FatStructs_h -/** - * \file - * FAT file structures - */ -/* - * mostly from Microsoft document fatgen103.doc - * http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx - */ -//------------------------------------------------------------------------------ -/** Value for byte 510 of boot block or MBR */ -uint8_t const BOOTSIG0 = 0X55; -/** Value for byte 511 of boot block or MBR */ -uint8_t const BOOTSIG1 = 0XAA; -//------------------------------------------------------------------------------ -/** - * \struct partitionTable - * \brief MBR partition table entry - * - * A partition table entry for a MBR formatted storage device. - * The MBR partition table has four entries. - */ -struct partitionTable { - /** - * Boot Indicator . Indicates whether the volume is the active - * partition. Legal values include: 0X00. Do not use for booting. - * 0X80 Active partition. - */ - uint8_t boot; - /** - * Head part of Cylinder-head-sector address of the first block in - * the partition. Legal values are 0-255. Only used in old PC BIOS. - */ - uint8_t beginHead; - /** - * Sector part of Cylinder-head-sector address of the first block in - * the partition. Legal values are 1-63. Only used in old PC BIOS. - */ - unsigned beginSector : 6; - /** High bits cylinder for first block in partition. */ - unsigned beginCylinderHigh : 2; - /** - * Combine beginCylinderLow with beginCylinderHigh. Legal values - * are 0-1023. Only used in old PC BIOS. - */ - uint8_t beginCylinderLow; - /** - * Partition type. See defines that begin with PART_TYPE_ for - * some Microsoft partition types. - */ - uint8_t type; - /** - * head part of cylinder-head-sector address of the last sector in the - * partition. Legal values are 0-255. Only used in old PC BIOS. - */ - uint8_t endHead; - /** - * Sector part of cylinder-head-sector address of the last sector in - * the partition. Legal values are 1-63. Only used in old PC BIOS. - */ - unsigned endSector : 6; - /** High bits of end cylinder */ - unsigned endCylinderHigh : 2; - /** - * Combine endCylinderLow with endCylinderHigh. Legal values - * are 0-1023. Only used in old PC BIOS. - */ - uint8_t endCylinderLow; - /** Logical block address of the first block in the partition. */ - uint32_t firstSector; - /** Length of the partition, in blocks. */ - uint32_t totalSectors; -} __attribute__((packed)); -/** Type name for partitionTable */ -typedef struct partitionTable part_t; -//------------------------------------------------------------------------------ -/** - * \struct masterBootRecord - * - * \brief Master Boot Record - * - * The first block of a storage device that is formatted with a MBR. - */ -struct masterBootRecord { - /** Code Area for master boot program. */ - uint8_t codeArea[440]; - /** Optional WindowsNT disk signature. May contain more boot code. */ - uint32_t diskSignature; - /** Usually zero but may be more boot code. */ - uint16_t usuallyZero; - /** Partition tables. */ - part_t part[4]; - /** First MBR signature byte. Must be 0X55 */ - uint8_t mbrSig0; - /** Second MBR signature byte. Must be 0XAA */ - uint8_t mbrSig1; -} __attribute__((packed)); -/** Type name for masterBootRecord */ -typedef struct masterBootRecord mbr_t; -//------------------------------------------------------------------------------ -/** - * \struct biosParmBlock - * - * \brief BIOS parameter block - * - * The BIOS parameter block describes the physical layout of a FAT volume. - */ -struct biosParmBlock { - /** - * Count of bytes per sector. This value may take on only the - * following values: 512, 1024, 2048 or 4096 - */ - uint16_t bytesPerSector; - /** - * Number of sectors per allocation unit. This value must be a - * power of 2 that is greater than 0. The legal values are - * 1, 2, 4, 8, 16, 32, 64, and 128. - */ - uint8_t sectorsPerCluster; - /** - * Number of sectors before the first FAT. - * This value must not be zero. - */ - uint16_t reservedSectorCount; - /** The count of FAT data structures on the volume. This field should - * always contain the value 2 for any FAT volume of any type. - */ - uint8_t fatCount; - /** - * For FAT12 and FAT16 volumes, this field contains the count of - * 32-byte directory entries in the root directory. For FAT32 volumes, - * this field must be set to 0. For FAT12 and FAT16 volumes, this - * value should always specify a count that when multiplied by 32 - * results in a multiple of bytesPerSector. FAT16 volumes should - * use the value 512. - */ - uint16_t rootDirEntryCount; - /** - * This field is the old 16-bit total count of sectors on the volume. - * This count includes the count of all sectors in all four regions - * of the volume. This field can be 0; if it is 0, then totalSectors32 - * must be non-zero. For FAT32 volumes, this field must be 0. For - * FAT12 and FAT16 volumes, this field contains the sector count, and - * totalSectors32 is 0 if the total sector count fits - * (is less than 0x10000). - */ - uint16_t totalSectors16; - /** - * This dates back to the old MS-DOS 1.x media determination and is - * no longer usually used for anything. 0xF8 is the standard value - * for fixed (non-removable) media. For removable media, 0xF0 is - * frequently used. Legal values are 0xF0 or 0xF8-0xFF. - */ - uint8_t mediaType; - /** - * Count of sectors occupied by one FAT on FAT12/FAT16 volumes. - * On FAT32 volumes this field must be 0, and sectorsPerFat32 - * contains the FAT size count. - */ - uint16_t sectorsPerFat16; - /** Sectors per track for interrupt 0x13. Not used otherwise. */ - uint16_t sectorsPerTrtack; - /** Number of heads for interrupt 0x13. Not used otherwise. */ - uint16_t headCount; - /** - * Count of hidden sectors preceding the partition that contains this - * FAT volume. This field is generally only relevant for media - * visible on interrupt 0x13. - */ - uint32_t hidddenSectors; - /** - * This field is the new 32-bit total count of sectors on the volume. - * This count includes the count of all sectors in all four regions - * of the volume. This field can be 0; if it is 0, then - * totalSectors16 must be non-zero. - */ - uint32_t totalSectors32; - /** - * Count of sectors occupied by one FAT on FAT32 volumes. - */ - uint32_t sectorsPerFat32; - /** - * This field is only defined for FAT32 media and does not exist on - * FAT12 and FAT16 media. - * Bits 0-3 -- Zero-based number of active FAT. - * Only valid if mirroring is disabled. - * Bits 4-6 -- Reserved. - * Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. - * -- 1 means only one FAT is active; it is the one referenced in bits 0-3. - * Bits 8-15 -- Reserved. - */ - uint16_t fat32Flags; - /** - * FAT32 version. High byte is major revision number. - * Low byte is minor revision number. Only 0.0 define. - */ - uint16_t fat32Version; - /** - * Cluster number of the first cluster of the root directory for FAT32. - * This usually 2 but not required to be 2. - */ - uint32_t fat32RootCluster; - /** - * Sector number of FSINFO structure in the reserved area of the - * FAT32 volume. Usually 1. - */ - uint16_t fat32FSInfo; - /** - * If non-zero, indicates the sector number in the reserved area - * of the volume of a copy of the boot record. Usually 6. - * No value other than 6 is recommended. - */ - uint16_t fat32BackBootBlock; - /** - * Reserved for future expansion. Code that formats FAT32 volumes - * should always set all of the bytes of this field to 0. - */ - uint8_t fat32Reserved[12]; -} __attribute__((packed)); -/** Type name for biosParmBlock */ -typedef struct biosParmBlock bpb_t; -//------------------------------------------------------------------------------ -/** - * \struct fat32BootSector - * - * \brief Boot sector for a FAT16 or FAT32 volume. - * - */ -struct fat32BootSector { - /** X86 jmp to boot program */ - uint8_t jmpToBootCode[3]; - /** informational only - don't depend on it */ - char oemName[8]; - /** BIOS Parameter Block */ - bpb_t bpb; - /** for int0x13 use value 0X80 for hard drive */ - uint8_t driveNumber; - /** used by Windows NT - should be zero for FAT */ - uint8_t reserved1; - /** 0X29 if next three fields are valid */ - uint8_t bootSignature; - /** usually generated by combining date and time */ - uint32_t volumeSerialNumber; - /** should match volume label in root dir */ - char volumeLabel[11]; - /** informational only - don't depend on it */ - char fileSystemType[8]; - /** X86 boot code */ - uint8_t bootCode[420]; - /** must be 0X55 */ - uint8_t bootSectorSig0; - /** must be 0XAA */ - uint8_t bootSectorSig1; -} __attribute__((packed)); -//------------------------------------------------------------------------------ -// End Of Chain values for FAT entries -/** FAT16 end of chain value used by Microsoft. */ -uint16_t const FAT16EOC = 0XFFFF; -/** Minimum value for FAT16 EOC. Use to test for EOC. */ -uint16_t const FAT16EOC_MIN = 0XFFF8; -/** FAT32 end of chain value used by Microsoft. */ -uint32_t const FAT32EOC = 0X0FFFFFFF; -/** Minimum value for FAT32 EOC. Use to test for EOC. */ -uint32_t const FAT32EOC_MIN = 0X0FFFFFF8; -/** Mask a for FAT32 entry. Entries are 28 bits. */ -uint32_t const FAT32MASK = 0X0FFFFFFF; - -/** Type name for fat32BootSector */ -typedef struct fat32BootSector fbs_t; -//------------------------------------------------------------------------------ -/** - * \struct directoryEntry - * \brief FAT short directory entry - * - * Short means short 8.3 name, not the entry size. - * - * Date Format. A FAT directory entry date stamp is a 16-bit field that is - * basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the - * format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the - * 16-bit word): - * - * Bits 9-15: Count of years from 1980, valid value range 0-127 - * inclusive (1980-2107). - * - * Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. - * - * Bits 0-4: Day of month, valid value range 1-31 inclusive. - * - * Time Format. A FAT directory entry time stamp is a 16-bit field that has - * a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the - * 16-bit word, bit 15 is the MSB of the 16-bit word). - * - * Bits 11-15: Hours, valid value range 0-23 inclusive. - * - * Bits 5-10: Minutes, valid value range 0-59 inclusive. - * - * Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). - * - * The valid time range is from Midnight 00:00:00 to 23:59:58. - */ -struct directoryEntry { - /** - * Short 8.3 name. - * The first eight bytes contain the file name with blank fill. - * The last three bytes contain the file extension with blank fill. - */ - uint8_t name[11]; - /** Entry attributes. - * - * The upper two bits of the attribute byte are reserved and should - * always be set to 0 when a file is created and never modified or - * looked at after that. See defines that begin with DIR_ATT_. - */ - uint8_t attributes; - /** - * Reserved for use by Windows NT. Set value to 0 when a file is - * created and never modify or look at it after that. - */ - uint8_t reservedNT; - /** - * The granularity of the seconds part of creationTime is 2 seconds - * so this field is a count of tenths of a second and its valid - * value range is 0-199 inclusive. (WHG note - seems to be hundredths) - */ - uint8_t creationTimeTenths; - /** Time file was created. */ - uint16_t creationTime; - /** Date file was created. */ - uint16_t creationDate; - /** - * Last access date. Note that there is no last access time, only - * a date. This is the date of last read or write. In the case of - * a write, this should be set to the same date as lastWriteDate. - */ - uint16_t lastAccessDate; - /** - * High word of this entry's first cluster number (always 0 for a - * FAT12 or FAT16 volume). - */ - uint16_t firstClusterHigh; - /** Time of last write. File creation is considered a write. */ - uint16_t lastWriteTime; - /** Date of last write. File creation is considered a write. */ - uint16_t lastWriteDate; - /** Low word of this entry's first cluster number. */ - uint16_t firstClusterLow; - /** 32-bit unsigned holding this file's size in bytes. */ - uint32_t fileSize; -} __attribute__((packed)); -//------------------------------------------------------------------------------ -// Definitions for directory entries -// -/** Type name for directoryEntry */ -typedef struct directoryEntry dir_t; -/** escape for name[0] = 0XE5 */ -uint8_t const DIR_NAME_0XE5 = 0X05; -/** name[0] value for entry that is free after being "deleted" */ -uint8_t const DIR_NAME_DELETED = 0XE5; -/** name[0] value for entry that is free and no allocated entries follow */ -uint8_t const DIR_NAME_FREE = 0X00; -/** file is read-only */ -uint8_t const DIR_ATT_READ_ONLY = 0X01; -/** File should hidden in directory listings */ -uint8_t const DIR_ATT_HIDDEN = 0X02; -/** Entry is for a system file */ -uint8_t const DIR_ATT_SYSTEM = 0X04; -/** Directory entry contains the volume label */ -uint8_t const DIR_ATT_VOLUME_ID = 0X08; -/** Entry is for a directory */ -uint8_t const DIR_ATT_DIRECTORY = 0X10; -/** Old DOS archive bit for backup support */ -uint8_t const DIR_ATT_ARCHIVE = 0X20; -/** Test value for long name entry. Test is - (d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. */ -uint8_t const DIR_ATT_LONG_NAME = 0X0F; -/** Test mask for long name entry */ -uint8_t const DIR_ATT_LONG_NAME_MASK = 0X3F; -/** defined attribute bits */ -uint8_t const DIR_ATT_DEFINED_BITS = 0X3F; -/** Directory entry is part of a long name */ -static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { - return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; -} -/** Mask for file/subdirectory tests */ -uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); -/** Directory entry is for a file */ -static inline uint8_t DIR_IS_FILE(const dir_t* dir) { - return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; -} -/** Directory entry is for a subdirectory */ -static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { - return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; -} -/** Directory entry is for a file or subdirectory */ -static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { - return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; -} -#endif // FatStructs_h +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef FatStructs_h +#define FatStructs_h +/** + * \file + * FAT file structures + */ +/* + * mostly from Microsoft document fatgen103.doc + * http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + */ +//------------------------------------------------------------------------------ +/** Value for byte 510 of boot block or MBR */ +uint8_t const BOOTSIG0 = 0X55; +/** Value for byte 511 of boot block or MBR */ +uint8_t const BOOTSIG1 = 0XAA; +//------------------------------------------------------------------------------ +/** + * \struct partitionTable + * \brief MBR partition table entry + * + * A partition table entry for a MBR formatted storage device. + * The MBR partition table has four entries. + */ +struct partitionTable { + /** + * Boot Indicator . Indicates whether the volume is the active + * partition. Legal values include: 0X00. Do not use for booting. + * 0X80 Active partition. + */ + uint8_t boot; + /** + * Head part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t beginHead; + /** + * Sector part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned beginSector : 6; + /** High bits cylinder for first block in partition. */ + unsigned beginCylinderHigh : 2; + /** + * Combine beginCylinderLow with beginCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t beginCylinderLow; + /** + * Partition type. See defines that begin with PART_TYPE_ for + * some Microsoft partition types. + */ + uint8_t type; + /** + * head part of cylinder-head-sector address of the last sector in the + * partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t endHead; + /** + * Sector part of cylinder-head-sector address of the last sector in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned endSector : 6; + /** High bits of end cylinder */ + unsigned endCylinderHigh : 2; + /** + * Combine endCylinderLow with endCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t endCylinderLow; + /** Logical block address of the first block in the partition. */ + uint32_t firstSector; + /** Length of the partition, in blocks. */ + uint32_t totalSectors; +} __attribute__((packed)); +/** Type name for partitionTable */ +typedef struct partitionTable part_t; +//------------------------------------------------------------------------------ +/** + * \struct masterBootRecord + * + * \brief Master Boot Record + * + * The first block of a storage device that is formatted with a MBR. + */ +struct masterBootRecord { + /** Code Area for master boot program. */ + uint8_t codeArea[440]; + /** Optional WindowsNT disk signature. May contain more boot code. */ + uint32_t diskSignature; + /** Usually zero but may be more boot code. */ + uint16_t usuallyZero; + /** Partition tables. */ + part_t part[4]; + /** First MBR signature byte. Must be 0X55 */ + uint8_t mbrSig0; + /** Second MBR signature byte. Must be 0XAA */ + uint8_t mbrSig1; +} __attribute__((packed)); +/** Type name for masterBootRecord */ +typedef struct masterBootRecord mbr_t; +//------------------------------------------------------------------------------ +/** + * \struct biosParmBlock + * + * \brief BIOS parameter block + * + * The BIOS parameter block describes the physical layout of a FAT volume. + */ +struct biosParmBlock { + /** + * Count of bytes per sector. This value may take on only the + * following values: 512, 1024, 2048 or 4096 + */ + uint16_t bytesPerSector; + /** + * Number of sectors per allocation unit. This value must be a + * power of 2 that is greater than 0. The legal values are + * 1, 2, 4, 8, 16, 32, 64, and 128. + */ + uint8_t sectorsPerCluster; + /** + * Number of sectors before the first FAT. + * This value must not be zero. + */ + uint16_t reservedSectorCount; + /** The count of FAT data structures on the volume. This field should + * always contain the value 2 for any FAT volume of any type. + */ + uint8_t fatCount; + /** + * For FAT12 and FAT16 volumes, this field contains the count of + * 32-byte directory entries in the root directory. For FAT32 volumes, + * this field must be set to 0. For FAT12 and FAT16 volumes, this + * value should always specify a count that when multiplied by 32 + * results in a multiple of bytesPerSector. FAT16 volumes should + * use the value 512. + */ + uint16_t rootDirEntryCount; + /** + * This field is the old 16-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then totalSectors32 + * must be non-zero. For FAT32 volumes, this field must be 0. For + * FAT12 and FAT16 volumes, this field contains the sector count, and + * totalSectors32 is 0 if the total sector count fits + * (is less than 0x10000). + */ + uint16_t totalSectors16; + /** + * This dates back to the old MS-DOS 1.x media determination and is + * no longer usually used for anything. 0xF8 is the standard value + * for fixed (non-removable) media. For removable media, 0xF0 is + * frequently used. Legal values are 0xF0 or 0xF8-0xFF. + */ + uint8_t mediaType; + /** + * Count of sectors occupied by one FAT on FAT12/FAT16 volumes. + * On FAT32 volumes this field must be 0, and sectorsPerFat32 + * contains the FAT size count. + */ + uint16_t sectorsPerFat16; + /** Sectors per track for interrupt 0x13. Not used otherwise. */ + uint16_t sectorsPerTrtack; + /** Number of heads for interrupt 0x13. Not used otherwise. */ + uint16_t headCount; + /** + * Count of hidden sectors preceding the partition that contains this + * FAT volume. This field is generally only relevant for media + * visible on interrupt 0x13. + */ + uint32_t hidddenSectors; + /** + * This field is the new 32-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then + * totalSectors16 must be non-zero. + */ + uint32_t totalSectors32; + /** + * Count of sectors occupied by one FAT on FAT32 volumes. + */ + uint32_t sectorsPerFat32; + /** + * This field is only defined for FAT32 media and does not exist on + * FAT12 and FAT16 media. + * Bits 0-3 -- Zero-based number of active FAT. + * Only valid if mirroring is disabled. + * Bits 4-6 -- Reserved. + * Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. + * -- 1 means only one FAT is active; it is the one referenced in bits 0-3. + * Bits 8-15 -- Reserved. + */ + uint16_t fat32Flags; + /** + * FAT32 version. High byte is major revision number. + * Low byte is minor revision number. Only 0.0 define. + */ + uint16_t fat32Version; + /** + * Cluster number of the first cluster of the root directory for FAT32. + * This usually 2 but not required to be 2. + */ + uint32_t fat32RootCluster; + /** + * Sector number of FSINFO structure in the reserved area of the + * FAT32 volume. Usually 1. + */ + uint16_t fat32FSInfo; + /** + * If non-zero, indicates the sector number in the reserved area + * of the volume of a copy of the boot record. Usually 6. + * No value other than 6 is recommended. + */ + uint16_t fat32BackBootBlock; + /** + * Reserved for future expansion. Code that formats FAT32 volumes + * should always set all of the bytes of this field to 0. + */ + uint8_t fat32Reserved[12]; +} __attribute__((packed)); +/** Type name for biosParmBlock */ +typedef struct biosParmBlock bpb_t; +//------------------------------------------------------------------------------ +/** + * \struct fat32BootSector + * + * \brief Boot sector for a FAT16 or FAT32 volume. + * + */ +struct fat32BootSector { + /** X86 jmp to boot program */ + uint8_t jmpToBootCode[3]; + /** informational only - don't depend on it */ + char oemName[8]; + /** BIOS Parameter Block */ + bpb_t bpb; + /** for int0x13 use value 0X80 for hard drive */ + uint8_t driveNumber; + /** used by Windows NT - should be zero for FAT */ + uint8_t reserved1; + /** 0X29 if next three fields are valid */ + uint8_t bootSignature; + /** usually generated by combining date and time */ + uint32_t volumeSerialNumber; + /** should match volume label in root dir */ + char volumeLabel[11]; + /** informational only - don't depend on it */ + char fileSystemType[8]; + /** X86 boot code */ + uint8_t bootCode[420]; + /** must be 0X55 */ + uint8_t bootSectorSig0; + /** must be 0XAA */ + uint8_t bootSectorSig1; +} __attribute__((packed)); +//------------------------------------------------------------------------------ +// End Of Chain values for FAT entries +/** FAT16 end of chain value used by Microsoft. */ +uint16_t const FAT16EOC = 0XFFFF; +/** Minimum value for FAT16 EOC. Use to test for EOC. */ +uint16_t const FAT16EOC_MIN = 0XFFF8; +/** FAT32 end of chain value used by Microsoft. */ +uint32_t const FAT32EOC = 0X0FFFFFFF; +/** Minimum value for FAT32 EOC. Use to test for EOC. */ +uint32_t const FAT32EOC_MIN = 0X0FFFFFF8; +/** Mask a for FAT32 entry. Entries are 28 bits. */ +uint32_t const FAT32MASK = 0X0FFFFFFF; + +/** Type name for fat32BootSector */ +typedef struct fat32BootSector fbs_t; +//------------------------------------------------------------------------------ +/** + * \struct directoryEntry + * \brief FAT short directory entry + * + * Short means short 8.3 name, not the entry size. + * + * Date Format. A FAT directory entry date stamp is a 16-bit field that is + * basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the + * format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the + * 16-bit word): + * + * Bits 9-15: Count of years from 1980, valid value range 0-127 + * inclusive (1980-2107). + * + * Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. + * + * Bits 0-4: Day of month, valid value range 1-31 inclusive. + * + * Time Format. A FAT directory entry time stamp is a 16-bit field that has + * a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the + * 16-bit word, bit 15 is the MSB of the 16-bit word). + * + * Bits 11-15: Hours, valid value range 0-23 inclusive. + * + * Bits 5-10: Minutes, valid value range 0-59 inclusive. + * + * Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). + * + * The valid time range is from Midnight 00:00:00 to 23:59:58. + */ +struct directoryEntry { + /** + * Short 8.3 name. + * The first eight bytes contain the file name with blank fill. + * The last three bytes contain the file extension with blank fill. + */ + uint8_t name[11]; + /** Entry attributes. + * + * The upper two bits of the attribute byte are reserved and should + * always be set to 0 when a file is created and never modified or + * looked at after that. See defines that begin with DIR_ATT_. + */ + uint8_t attributes; + /** + * Reserved for use by Windows NT. Set value to 0 when a file is + * created and never modify or look at it after that. + */ + uint8_t reservedNT; + /** + * The granularity of the seconds part of creationTime is 2 seconds + * so this field is a count of tenths of a second and its valid + * value range is 0-199 inclusive. (WHG note - seems to be hundredths) + */ + uint8_t creationTimeTenths; + /** Time file was created. */ + uint16_t creationTime; + /** Date file was created. */ + uint16_t creationDate; + /** + * Last access date. Note that there is no last access time, only + * a date. This is the date of last read or write. In the case of + * a write, this should be set to the same date as lastWriteDate. + */ + uint16_t lastAccessDate; + /** + * High word of this entry's first cluster number (always 0 for a + * FAT12 or FAT16 volume). + */ + uint16_t firstClusterHigh; + /** Time of last write. File creation is considered a write. */ + uint16_t lastWriteTime; + /** Date of last write. File creation is considered a write. */ + uint16_t lastWriteDate; + /** Low word of this entry's first cluster number. */ + uint16_t firstClusterLow; + /** 32-bit unsigned holding this file's size in bytes. */ + uint32_t fileSize; +} __attribute__((packed)); +//------------------------------------------------------------------------------ +// Definitions for directory entries +// +/** Type name for directoryEntry */ +typedef struct directoryEntry dir_t; +/** escape for name[0] = 0XE5 */ +uint8_t const DIR_NAME_0XE5 = 0X05; +/** name[0] value for entry that is free after being "deleted" */ +uint8_t const DIR_NAME_DELETED = 0XE5; +/** name[0] value for entry that is free and no allocated entries follow */ +uint8_t const DIR_NAME_FREE = 0X00; +/** file is read-only */ +uint8_t const DIR_ATT_READ_ONLY = 0X01; +/** File should hidden in directory listings */ +uint8_t const DIR_ATT_HIDDEN = 0X02; +/** Entry is for a system file */ +uint8_t const DIR_ATT_SYSTEM = 0X04; +/** Directory entry contains the volume label */ +uint8_t const DIR_ATT_VOLUME_ID = 0X08; +/** Entry is for a directory */ +uint8_t const DIR_ATT_DIRECTORY = 0X10; +/** Old DOS archive bit for backup support */ +uint8_t const DIR_ATT_ARCHIVE = 0X20; +/** Test value for long name entry. Test is + (d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. */ +uint8_t const DIR_ATT_LONG_NAME = 0X0F; +/** Test mask for long name entry */ +uint8_t const DIR_ATT_LONG_NAME_MASK = 0X3F; +/** defined attribute bits */ +uint8_t const DIR_ATT_DEFINED_BITS = 0X3F; +/** Directory entry is part of a long name */ +static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { + return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; +} +/** Mask for file/subdirectory tests */ +uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); +/** Directory entry is for a file */ +static inline uint8_t DIR_IS_FILE(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; +} +/** Directory entry is for a subdirectory */ +static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; +} +/** Directory entry is for a file or subdirectory */ +static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; +} +#endif // FatStructs_h diff --git a/libraries/SD/utility/Sd2Card.cpp b/libraries/SD/utility/Sd2Card.cpp index 9805833e4a1..9a4c0b245f9 100644 --- a/libraries/SD/utility/Sd2Card.cpp +++ b/libraries/SD/utility/Sd2Card.cpp @@ -1,685 +1,685 @@ -/* Arduino Sd2Card Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino Sd2Card Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino Sd2Card Library. If not, see - * . - */ -#define USE_SPI_LIB -#include -#include "Sd2Card.h" -//------------------------------------------------------------------------------ -#ifndef SOFTWARE_SPI -#ifdef USE_SPI_LIB -#include -#endif -// functions for hardware SPI -/** Send a byte to the card */ -static void spiSend(uint8_t b) { -#ifndef USE_SPI_LIB - SPDR = b; - while (!(SPSR & (1 << SPIF))); -#else - SPI.transfer(b); -#endif -} -/** Receive a byte from the card */ -static uint8_t spiRec(void) { -#ifndef USE_SPI_LIB - spiSend(0XFF); - return SPDR; -#else - return SPI.transfer(0xFF); -#endif -} -#else // SOFTWARE_SPI -//------------------------------------------------------------------------------ -/** nop to tune soft SPI timing */ -#define nop asm volatile ("nop\n\t") -//------------------------------------------------------------------------------ -/** Soft SPI receive */ -uint8_t spiRec(void) { - uint8_t data = 0; - // no interrupts during byte receive - about 8 us - cli(); - // output pin high - like sending 0XFF - fastDigitalWrite(SPI_MOSI_PIN, HIGH); - - for (uint8_t i = 0; i < 8; i++) { - fastDigitalWrite(SPI_SCK_PIN, HIGH); - - // adjust so SCK is nice - nop; - nop; - - data <<= 1; - - if (fastDigitalRead(SPI_MISO_PIN)) data |= 1; - - fastDigitalWrite(SPI_SCK_PIN, LOW); - } - // enable interrupts - sei(); - return data; -} -//------------------------------------------------------------------------------ -/** Soft SPI send */ -void spiSend(uint8_t data) { - // no interrupts during byte send - about 8 us - cli(); - for (uint8_t i = 0; i < 8; i++) { - fastDigitalWrite(SPI_SCK_PIN, LOW); - - fastDigitalWrite(SPI_MOSI_PIN, data & 0X80); - - data <<= 1; - - fastDigitalWrite(SPI_SCK_PIN, HIGH); - } - // hold SCK high for a few ns - nop; - nop; - nop; - nop; - - fastDigitalWrite(SPI_SCK_PIN, LOW); - // enable interrupts - sei(); -} -#endif // SOFTWARE_SPI -//------------------------------------------------------------------------------ -// send command and return error code. Return zero for OK -uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { - // end read if in partialBlockRead mode - readEnd(); - - // select card - chipSelectLow(); - - // wait up to 300 ms if busy - waitNotBusy(300); - - // send command - spiSend(cmd | 0x40); - - // send argument - for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); - - // send CRC - uint8_t crc = 0XFF; - if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 - if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA - spiSend(crc); - - // wait for response - for (uint8_t i = 0; ((status_ = spiRec()) & 0X80) && i != 0XFF; i++); - return status_; -} -//------------------------------------------------------------------------------ -/** - * Determine the size of an SD flash memory card. - * - * \return The number of 512 byte data blocks in the card - * or zero if an error occurs. - */ -uint32_t Sd2Card::cardSize(void) { - csd_t csd; - if (!readCSD(&csd)) return 0; - if (csd.v1.csd_ver == 0) { - uint8_t read_bl_len = csd.v1.read_bl_len; - uint16_t c_size = (csd.v1.c_size_high << 10) - | (csd.v1.c_size_mid << 2) | csd.v1.c_size_low; - uint8_t c_size_mult = (csd.v1.c_size_mult_high << 1) - | csd.v1.c_size_mult_low; - return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); - } else if (csd.v2.csd_ver == 1) { - uint32_t c_size = ((uint32_t)csd.v2.c_size_high << 16) - | (csd.v2.c_size_mid << 8) | csd.v2.c_size_low; - return (c_size + 1) << 10; - } else { - error(SD_CARD_ERROR_BAD_CSD); - return 0; - } -} -//------------------------------------------------------------------------------ -void Sd2Card::chipSelectHigh(void) { - digitalWrite(chipSelectPin_, HIGH); -} -//------------------------------------------------------------------------------ -void Sd2Card::chipSelectLow(void) { - digitalWrite(chipSelectPin_, LOW); -} -//------------------------------------------------------------------------------ -/** Erase a range of blocks. - * - * \param[in] firstBlock The address of the first block in the range. - * \param[in] lastBlock The address of the last block in the range. - * - * \note This function requests the SD card to do a flash erase for a - * range of blocks. The data on the card after an erase operation is - * either 0 or 1, depends on the card vendor. The card must support - * single block erase. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { - if (!eraseSingleBlockEnable()) { - error(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); - goto fail; - } - if (type_ != SD_CARD_TYPE_SDHC) { - firstBlock <<= 9; - lastBlock <<= 9; - } - if (cardCommand(CMD32, firstBlock) - || cardCommand(CMD33, lastBlock) - || cardCommand(CMD38, 0)) { - error(SD_CARD_ERROR_ERASE); - goto fail; - } - if (!waitNotBusy(SD_ERASE_TIMEOUT)) { - error(SD_CARD_ERROR_ERASE_TIMEOUT); - goto fail; - } - chipSelectHigh(); - return true; - - fail: - chipSelectHigh(); - return false; -} -//------------------------------------------------------------------------------ -/** Determine if card supports single block erase. - * - * \return The value one, true, is returned if single block erase is supported. - * The value zero, false, is returned if single block erase is not supported. - */ -uint8_t Sd2Card::eraseSingleBlockEnable(void) { - csd_t csd; - return readCSD(&csd) ? csd.v1.erase_blk_en : 0; -} -//------------------------------------------------------------------------------ -/** - * Initialize an SD flash memory card. - * - * \param[in] sckRateID SPI clock rate selector. See setSckRate(). - * \param[in] chipSelectPin SD chip select pin number. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. The reason for failure - * can be determined by calling errorCode() and errorData(). - */ -uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) { - errorCode_ = inBlock_ = partialBlockRead_ = type_ = 0; - chipSelectPin_ = chipSelectPin; - // 16-bit init start time allows over a minute - uint16_t t0 = (uint16_t)millis(); - uint32_t arg; - - // set pin modes - pinMode(chipSelectPin_, OUTPUT); - chipSelectHigh(); -#ifndef USE_SPI_LIB - pinMode(SPI_MISO_PIN, INPUT); - pinMode(SPI_MOSI_PIN, OUTPUT); - pinMode(SPI_SCK_PIN, OUTPUT); -#endif - -#ifndef SOFTWARE_SPI -#ifndef USE_SPI_LIB - // SS must be in output mode even it is not chip select - pinMode(SS_PIN, OUTPUT); - digitalWrite(SS_PIN, HIGH); // disable any SPI device using hardware SS pin - // Enable SPI, Master, clock rate f_osc/128 - SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); - // clear double speed - SPSR &= ~(1 << SPI2X); -#else // USE_SPI_LIB - SPI.begin(); -#ifdef SPI_CLOCK_DIV128 - SPI.setClockDivider(SPI_CLOCK_DIV128); -#else - SPI.setClockDivider(255); -#endif -#endif // USE_SPI_LIB -#endif // SOFTWARE_SPI - - // must supply min of 74 clock cycles with CS high. - for (uint8_t i = 0; i < 10; i++) spiSend(0XFF); - - chipSelectLow(); - - // command to go idle in SPI mode - while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { - if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { - error(SD_CARD_ERROR_CMD0); - goto fail; - } - } - // check SD version - if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { - type(SD_CARD_TYPE_SD1); - } else { - // only need last byte of r7 response - for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); - if (status_ != 0XAA) { - error(SD_CARD_ERROR_CMD8); - goto fail; - } - type(SD_CARD_TYPE_SD2); - } - // initialize card and send host supports SDHC if SD2 - arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; - - while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { - // check for timeout - if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { - error(SD_CARD_ERROR_ACMD41); - goto fail; - } - } - // if SD2 read OCR register to check for SDHC card - if (type() == SD_CARD_TYPE_SD2) { - if (cardCommand(CMD58, 0)) { - error(SD_CARD_ERROR_CMD58); - goto fail; - } - if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); - // discard rest of ocr - contains allowed voltage range - for (uint8_t i = 0; i < 3; i++) spiRec(); - } - chipSelectHigh(); - -#ifndef SOFTWARE_SPI - return setSckRate(sckRateID); -#else // SOFTWARE_SPI - return true; -#endif // SOFTWARE_SPI - - fail: - chipSelectHigh(); - return false; -} -//------------------------------------------------------------------------------ -/** - * Enable or disable partial block reads. - * - * Enabling partial block reads improves performance by allowing a block - * to be read over the SPI bus as several sub-blocks. Errors may occur - * if the time between reads is too long since the SD card may timeout. - * The SPI SS line will be held low until the entire block is read or - * readEnd() is called. - * - * Use this for applications like the Adafruit Wave Shield. - * - * \param[in] value The value TRUE (non-zero) or FALSE (zero).) - */ -void Sd2Card::partialBlockRead(uint8_t value) { - readEnd(); - partialBlockRead_ = value; -} -//------------------------------------------------------------------------------ -/** - * Read a 512 byte block from an SD card device. - * - * \param[in] block Logical block to be read. - * \param[out] dst Pointer to the location that will receive the data. - - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t Sd2Card::readBlock(uint32_t block, uint8_t* dst) { - return readData(block, 0, 512, dst); -} -//------------------------------------------------------------------------------ -/** - * Read part of a 512 byte block from an SD card. - * - * \param[in] block Logical block to be read. - * \param[in] offset Number of bytes to skip at start of block - * \param[out] dst Pointer to the location that will receive the data. - * \param[in] count Number of bytes to read - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t Sd2Card::readData(uint32_t block, - uint16_t offset, uint16_t count, uint8_t* dst) { - uint16_t n; - if (count == 0) return true; - if ((count + offset) > 512) { - goto fail; - } - if (!inBlock_ || block != block_ || offset < offset_) { - block_ = block; - // use address if not SDHC card - if (type()!= SD_CARD_TYPE_SDHC) block <<= 9; - if (cardCommand(CMD17, block)) { - error(SD_CARD_ERROR_CMD17); - goto fail; - } - if (!waitStartBlock()) { - goto fail; - } - offset_ = 0; - inBlock_ = 1; - } - -#ifdef OPTIMIZE_HARDWARE_SPI - // start first spi transfer - SPDR = 0XFF; - - // skip data before offset - for (;offset_ < offset; offset_++) { - while (!(SPSR & (1 << SPIF))); - SPDR = 0XFF; - } - // transfer data - n = count - 1; - for (uint16_t i = 0; i < n; i++) { - while (!(SPSR & (1 << SPIF))); - dst[i] = SPDR; - SPDR = 0XFF; - } - // wait for last byte - while (!(SPSR & (1 << SPIF))); - dst[n] = SPDR; - -#else // OPTIMIZE_HARDWARE_SPI - - // skip data before offset - for (;offset_ < offset; offset_++) { - spiRec(); - } - // transfer data - for (uint16_t i = 0; i < count; i++) { - dst[i] = spiRec(); - } -#endif // OPTIMIZE_HARDWARE_SPI - - offset_ += count; - if (!partialBlockRead_ || offset_ >= 512) { - // read rest of data, checksum and set chip select high - readEnd(); - } - return true; - - fail: - chipSelectHigh(); - return false; -} -//------------------------------------------------------------------------------ -/** Skip remaining data in a block when in partial block read mode. */ -void Sd2Card::readEnd(void) { - if (inBlock_) { - // skip data and crc -#ifdef OPTIMIZE_HARDWARE_SPI - // optimize skip for hardware - SPDR = 0XFF; - while (offset_++ < 513) { - while (!(SPSR & (1 << SPIF))); - SPDR = 0XFF; - } - // wait for last crc byte - while (!(SPSR & (1 << SPIF))); -#else // OPTIMIZE_HARDWARE_SPI - while (offset_++ < 514) spiRec(); -#endif // OPTIMIZE_HARDWARE_SPI - chipSelectHigh(); - inBlock_ = 0; - } -} -//------------------------------------------------------------------------------ -/** read CID or CSR register */ -uint8_t Sd2Card::readRegister(uint8_t cmd, void* buf) { - uint8_t* dst = reinterpret_cast(buf); - if (cardCommand(cmd, 0)) { - error(SD_CARD_ERROR_READ_REG); - goto fail; - } - if (!waitStartBlock()) goto fail; - // transfer data - for (uint16_t i = 0; i < 16; i++) dst[i] = spiRec(); - spiRec(); // get first crc byte - spiRec(); // get second crc byte - chipSelectHigh(); - return true; - - fail: - chipSelectHigh(); - return false; -} -//------------------------------------------------------------------------------ -/** - * Set the SPI clock rate. - * - * \param[in] sckRateID A value in the range [0, 6]. - * - * The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum - * SPI rate is F_CPU/2 for \a sckRateID = 0 and the minimum rate is F_CPU/128 - * for \a scsRateID = 6. - * - * \return The value one, true, is returned for success and the value zero, - * false, is returned for an invalid value of \a sckRateID. - */ -uint8_t Sd2Card::setSckRate(uint8_t sckRateID) { - if (sckRateID > 6) { - error(SD_CARD_ERROR_SCK_RATE); - return false; - } -#ifndef USE_SPI_LIB - // see avr processor datasheet for SPI register bit definitions - if ((sckRateID & 1) || sckRateID == 6) { - SPSR &= ~(1 << SPI2X); - } else { - SPSR |= (1 << SPI2X); - } - SPCR &= ~((1 < SD_READ_TIMEOUT) { - error(SD_CARD_ERROR_READ_TIMEOUT); - goto fail; - } - } - if (status_ != DATA_START_BLOCK) { - error(SD_CARD_ERROR_READ); - goto fail; - } - return true; - - fail: - chipSelectHigh(); - return false; -} -//------------------------------------------------------------------------------ -/** - * Writes a 512 byte block to an SD card. - * - * \param[in] blockNumber Logical block to be written. - * \param[in] src Pointer to the location of the data to be written. - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { -#if SD_PROTECT_BLOCK_ZERO - // don't allow write to first block - if (blockNumber == 0) { - error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); - goto fail; - } -#endif // SD_PROTECT_BLOCK_ZERO - - // use address if not SDHC card - if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; - if (cardCommand(CMD24, blockNumber)) { - error(SD_CARD_ERROR_CMD24); - goto fail; - } - if (!writeData(DATA_START_BLOCK, src)) goto fail; - - // wait for flash programming to complete - if (!waitNotBusy(SD_WRITE_TIMEOUT)) { - error(SD_CARD_ERROR_WRITE_TIMEOUT); - goto fail; - } - // response is r2 so get and check two bytes for nonzero - if (cardCommand(CMD13, 0) || spiRec()) { - error(SD_CARD_ERROR_WRITE_PROGRAMMING); - goto fail; - } - chipSelectHigh(); - return true; - - fail: - chipSelectHigh(); - return false; -} -//------------------------------------------------------------------------------ -/** Write one data block in a multiple block write sequence */ -uint8_t Sd2Card::writeData(const uint8_t* src) { - // wait for previous write to finish - if (!waitNotBusy(SD_WRITE_TIMEOUT)) { - error(SD_CARD_ERROR_WRITE_MULTIPLE); - chipSelectHigh(); - return false; - } - return writeData(WRITE_MULTIPLE_TOKEN, src); -} -//------------------------------------------------------------------------------ -// send one block of data for write block or write multiple blocks -uint8_t Sd2Card::writeData(uint8_t token, const uint8_t* src) { -#ifdef OPTIMIZE_HARDWARE_SPI - - // send data - optimized loop - SPDR = token; - - // send two byte per iteration - for (uint16_t i = 0; i < 512; i += 2) { - while (!(SPSR & (1 << SPIF))); - SPDR = src[i]; - while (!(SPSR & (1 << SPIF))); - SPDR = src[i+1]; - } - - // wait for last data byte - while (!(SPSR & (1 << SPIF))); - -#else // OPTIMIZE_HARDWARE_SPI - spiSend(token); - for (uint16_t i = 0; i < 512; i++) { - spiSend(src[i]); - } -#endif // OPTIMIZE_HARDWARE_SPI - spiSend(0xff); // dummy crc - spiSend(0xff); // dummy crc - - status_ = spiRec(); - if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { - error(SD_CARD_ERROR_WRITE); - chipSelectHigh(); - return false; - } - return true; -} -//------------------------------------------------------------------------------ -/** Start a write multiple blocks sequence. - * - * \param[in] blockNumber Address of first block in sequence. - * \param[in] eraseCount The number of blocks to be pre-erased. - * - * \note This function is used with writeData() and writeStop() - * for optimized multiple block writes. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { -#if SD_PROTECT_BLOCK_ZERO - // don't allow write to first block - if (blockNumber == 0) { - error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); - goto fail; - } -#endif // SD_PROTECT_BLOCK_ZERO - // send pre-erase count - if (cardAcmd(ACMD23, eraseCount)) { - error(SD_CARD_ERROR_ACMD23); - goto fail; - } - // use address if not SDHC card - if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; - if (cardCommand(CMD25, blockNumber)) { - error(SD_CARD_ERROR_CMD25); - goto fail; - } - return true; - - fail: - chipSelectHigh(); - return false; -} -//------------------------------------------------------------------------------ -/** End a write multiple blocks sequence. - * -* \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t Sd2Card::writeStop(void) { - if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; - spiSend(STOP_TRAN_TOKEN); - if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; - chipSelectHigh(); - return true; - - fail: - error(SD_CARD_ERROR_STOP_TRAN); - chipSelectHigh(); - return false; -} +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#define USE_SPI_LIB +#include +#include "Sd2Card.h" +//------------------------------------------------------------------------------ +#ifndef SOFTWARE_SPI +#ifdef USE_SPI_LIB +#include +#endif +// functions for hardware SPI +/** Send a byte to the card */ +static void spiSend(uint8_t b) { +#ifndef USE_SPI_LIB + SPDR = b; + while (!(SPSR & (1 << SPIF))); +#else + SPI.transfer(b); +#endif +} +/** Receive a byte from the card */ +static uint8_t spiRec(void) { +#ifndef USE_SPI_LIB + spiSend(0XFF); + return SPDR; +#else + return SPI.transfer(0xFF); +#endif +} +#else // SOFTWARE_SPI +//------------------------------------------------------------------------------ +/** nop to tune soft SPI timing */ +#define nop asm volatile ("nop\n\t") +//------------------------------------------------------------------------------ +/** Soft SPI receive */ +uint8_t spiRec(void) { + uint8_t data = 0; + // no interrupts during byte receive - about 8 us + cli(); + // output pin high - like sending 0XFF + fastDigitalWrite(SPI_MOSI_PIN, HIGH); + + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, HIGH); + + // adjust so SCK is nice + nop; + nop; + + data <<= 1; + + if (fastDigitalRead(SPI_MISO_PIN)) data |= 1; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + } + // enable interrupts + sei(); + return data; +} +//------------------------------------------------------------------------------ +/** Soft SPI send */ +void spiSend(uint8_t data) { + // no interrupts during byte send - about 8 us + cli(); + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, LOW); + + fastDigitalWrite(SPI_MOSI_PIN, data & 0X80); + + data <<= 1; + + fastDigitalWrite(SPI_SCK_PIN, HIGH); + } + // hold SCK high for a few ns + nop; + nop; + nop; + nop; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + // enable interrupts + sei(); +} +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +// send command and return error code. Return zero for OK +uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { + // end read if in partialBlockRead mode + readEnd(); + + // select card + chipSelectLow(); + + // wait up to 300 ms if busy + waitNotBusy(300); + + // send command + spiSend(cmd | 0x40); + + // send argument + for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); + + // send CRC + uint8_t crc = 0XFF; + if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 + if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA + spiSend(crc); + + // wait for response + for (uint8_t i = 0; ((status_ = spiRec()) & 0X80) && i != 0XFF; i++); + return status_; +} +//------------------------------------------------------------------------------ +/** + * Determine the size of an SD flash memory card. + * + * \return The number of 512 byte data blocks in the card + * or zero if an error occurs. + */ +uint32_t Sd2Card::cardSize(void) { + csd_t csd; + if (!readCSD(&csd)) return 0; + if (csd.v1.csd_ver == 0) { + uint8_t read_bl_len = csd.v1.read_bl_len; + uint16_t c_size = (csd.v1.c_size_high << 10) + | (csd.v1.c_size_mid << 2) | csd.v1.c_size_low; + uint8_t c_size_mult = (csd.v1.c_size_mult_high << 1) + | csd.v1.c_size_mult_low; + return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); + } else if (csd.v2.csd_ver == 1) { + uint32_t c_size = ((uint32_t)csd.v2.c_size_high << 16) + | (csd.v2.c_size_mid << 8) | csd.v2.c_size_low; + return (c_size + 1) << 10; + } else { + error(SD_CARD_ERROR_BAD_CSD); + return 0; + } +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectHigh(void) { + digitalWrite(chipSelectPin_, HIGH); +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectLow(void) { + digitalWrite(chipSelectPin_, LOW); +} +//------------------------------------------------------------------------------ +/** Erase a range of blocks. + * + * \param[in] firstBlock The address of the first block in the range. + * \param[in] lastBlock The address of the last block in the range. + * + * \note This function requests the SD card to do a flash erase for a + * range of blocks. The data on the card after an erase operation is + * either 0 or 1, depends on the card vendor. The card must support + * single block erase. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { + if (!eraseSingleBlockEnable()) { + error(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); + goto fail; + } + if (type_ != SD_CARD_TYPE_SDHC) { + firstBlock <<= 9; + lastBlock <<= 9; + } + if (cardCommand(CMD32, firstBlock) + || cardCommand(CMD33, lastBlock) + || cardCommand(CMD38, 0)) { + error(SD_CARD_ERROR_ERASE); + goto fail; + } + if (!waitNotBusy(SD_ERASE_TIMEOUT)) { + error(SD_CARD_ERROR_ERASE_TIMEOUT); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Determine if card supports single block erase. + * + * \return The value one, true, is returned if single block erase is supported. + * The value zero, false, is returned if single block erase is not supported. + */ +uint8_t Sd2Card::eraseSingleBlockEnable(void) { + csd_t csd; + return readCSD(&csd) ? csd.v1.erase_blk_en : 0; +} +//------------------------------------------------------------------------------ +/** + * Initialize an SD flash memory card. + * + * \param[in] sckRateID SPI clock rate selector. See setSckRate(). + * \param[in] chipSelectPin SD chip select pin number. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. The reason for failure + * can be determined by calling errorCode() and errorData(). + */ +uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) { + errorCode_ = inBlock_ = partialBlockRead_ = type_ = 0; + chipSelectPin_ = chipSelectPin; + // 16-bit init start time allows over a minute + uint16_t t0 = (uint16_t)millis(); + uint32_t arg; + + // set pin modes + pinMode(chipSelectPin_, OUTPUT); + chipSelectHigh(); +#ifndef USE_SPI_LIB + pinMode(SPI_MISO_PIN, INPUT); + pinMode(SPI_MOSI_PIN, OUTPUT); + pinMode(SPI_SCK_PIN, OUTPUT); +#endif + +#ifndef SOFTWARE_SPI +#ifndef USE_SPI_LIB + // SS must be in output mode even it is not chip select + pinMode(SS_PIN, OUTPUT); + digitalWrite(SS_PIN, HIGH); // disable any SPI device using hardware SS pin + // Enable SPI, Master, clock rate f_osc/128 + SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); + // clear double speed + SPSR &= ~(1 << SPI2X); +#else // USE_SPI_LIB + SPI.begin(); +#ifdef SPI_CLOCK_DIV128 + SPI.setClockDivider(SPI_CLOCK_DIV128); +#else + SPI.setClockDivider(255); +#endif +#endif // USE_SPI_LIB +#endif // SOFTWARE_SPI + + // must supply min of 74 clock cycles with CS high. + for (uint8_t i = 0; i < 10; i++) spiSend(0XFF); + + chipSelectLow(); + + // command to go idle in SPI mode + while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_CMD0); + goto fail; + } + } + // check SD version + if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { + type(SD_CARD_TYPE_SD1); + } else { + // only need last byte of r7 response + for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); + if (status_ != 0XAA) { + error(SD_CARD_ERROR_CMD8); + goto fail; + } + type(SD_CARD_TYPE_SD2); + } + // initialize card and send host supports SDHC if SD2 + arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; + + while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { + // check for timeout + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_ACMD41); + goto fail; + } + } + // if SD2 read OCR register to check for SDHC card + if (type() == SD_CARD_TYPE_SD2) { + if (cardCommand(CMD58, 0)) { + error(SD_CARD_ERROR_CMD58); + goto fail; + } + if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); + // discard rest of ocr - contains allowed voltage range + for (uint8_t i = 0; i < 3; i++) spiRec(); + } + chipSelectHigh(); + +#ifndef SOFTWARE_SPI + return setSckRate(sckRateID); +#else // SOFTWARE_SPI + return true; +#endif // SOFTWARE_SPI + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Enable or disable partial block reads. + * + * Enabling partial block reads improves performance by allowing a block + * to be read over the SPI bus as several sub-blocks. Errors may occur + * if the time between reads is too long since the SD card may timeout. + * The SPI SS line will be held low until the entire block is read or + * readEnd() is called. + * + * Use this for applications like the Adafruit Wave Shield. + * + * \param[in] value The value TRUE (non-zero) or FALSE (zero).) + */ +void Sd2Card::partialBlockRead(uint8_t value) { + readEnd(); + partialBlockRead_ = value; +} +//------------------------------------------------------------------------------ +/** + * Read a 512 byte block from an SD card device. + * + * \param[in] block Logical block to be read. + * \param[out] dst Pointer to the location that will receive the data. + + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::readBlock(uint32_t block, uint8_t* dst) { + return readData(block, 0, 512, dst); +} +//------------------------------------------------------------------------------ +/** + * Read part of a 512 byte block from an SD card. + * + * \param[in] block Logical block to be read. + * \param[in] offset Number of bytes to skip at start of block + * \param[out] dst Pointer to the location that will receive the data. + * \param[in] count Number of bytes to read + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::readData(uint32_t block, + uint16_t offset, uint16_t count, uint8_t* dst) { + uint16_t n; + if (count == 0) return true; + if ((count + offset) > 512) { + goto fail; + } + if (!inBlock_ || block != block_ || offset < offset_) { + block_ = block; + // use address if not SDHC card + if (type()!= SD_CARD_TYPE_SDHC) block <<= 9; + if (cardCommand(CMD17, block)) { + error(SD_CARD_ERROR_CMD17); + goto fail; + } + if (!waitStartBlock()) { + goto fail; + } + offset_ = 0; + inBlock_ = 1; + } + +#ifdef OPTIMIZE_HARDWARE_SPI + // start first spi transfer + SPDR = 0XFF; + + // skip data before offset + for (;offset_ < offset; offset_++) { + while (!(SPSR & (1 << SPIF))); + SPDR = 0XFF; + } + // transfer data + n = count - 1; + for (uint16_t i = 0; i < n; i++) { + while (!(SPSR & (1 << SPIF))); + dst[i] = SPDR; + SPDR = 0XFF; + } + // wait for last byte + while (!(SPSR & (1 << SPIF))); + dst[n] = SPDR; + +#else // OPTIMIZE_HARDWARE_SPI + + // skip data before offset + for (;offset_ < offset; offset_++) { + spiRec(); + } + // transfer data + for (uint16_t i = 0; i < count; i++) { + dst[i] = spiRec(); + } +#endif // OPTIMIZE_HARDWARE_SPI + + offset_ += count; + if (!partialBlockRead_ || offset_ >= 512) { + // read rest of data, checksum and set chip select high + readEnd(); + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Skip remaining data in a block when in partial block read mode. */ +void Sd2Card::readEnd(void) { + if (inBlock_) { + // skip data and crc +#ifdef OPTIMIZE_HARDWARE_SPI + // optimize skip for hardware + SPDR = 0XFF; + while (offset_++ < 513) { + while (!(SPSR & (1 << SPIF))); + SPDR = 0XFF; + } + // wait for last crc byte + while (!(SPSR & (1 << SPIF))); +#else // OPTIMIZE_HARDWARE_SPI + while (offset_++ < 514) spiRec(); +#endif // OPTIMIZE_HARDWARE_SPI + chipSelectHigh(); + inBlock_ = 0; + } +} +//------------------------------------------------------------------------------ +/** read CID or CSR register */ +uint8_t Sd2Card::readRegister(uint8_t cmd, void* buf) { + uint8_t* dst = reinterpret_cast(buf); + if (cardCommand(cmd, 0)) { + error(SD_CARD_ERROR_READ_REG); + goto fail; + } + if (!waitStartBlock()) goto fail; + // transfer data + for (uint16_t i = 0; i < 16; i++) dst[i] = spiRec(); + spiRec(); // get first crc byte + spiRec(); // get second crc byte + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Set the SPI clock rate. + * + * \param[in] sckRateID A value in the range [0, 6]. + * + * The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum + * SPI rate is F_CPU/2 for \a sckRateID = 0 and the minimum rate is F_CPU/128 + * for \a scsRateID = 6. + * + * \return The value one, true, is returned for success and the value zero, + * false, is returned for an invalid value of \a sckRateID. + */ +uint8_t Sd2Card::setSckRate(uint8_t sckRateID) { + if (sckRateID > 6) { + error(SD_CARD_ERROR_SCK_RATE); + return false; + } +#ifndef USE_SPI_LIB + // see avr processor datasheet for SPI register bit definitions + if ((sckRateID & 1) || sckRateID == 6) { + SPSR &= ~(1 << SPI2X); + } else { + SPSR |= (1 << SPI2X); + } + SPCR &= ~((1 < SD_READ_TIMEOUT) { + error(SD_CARD_ERROR_READ_TIMEOUT); + goto fail; + } + } + if (status_ != DATA_START_BLOCK) { + error(SD_CARD_ERROR_READ); + goto fail; + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Writes a 512 byte block to an SD card. + * + * \param[in] blockNumber Logical block to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { +#if SD_PROTECT_BLOCK_ZERO + // don't allow write to first block + if (blockNumber == 0) { + error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); + goto fail; + } +#endif // SD_PROTECT_BLOCK_ZERO + + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD24, blockNumber)) { + error(SD_CARD_ERROR_CMD24); + goto fail; + } + if (!writeData(DATA_START_BLOCK, src)) goto fail; + + // wait for flash programming to complete + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_TIMEOUT); + goto fail; + } + // response is r2 so get and check two bytes for nonzero + if (cardCommand(CMD13, 0) || spiRec()) { + error(SD_CARD_ERROR_WRITE_PROGRAMMING); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Write one data block in a multiple block write sequence */ +uint8_t Sd2Card::writeData(const uint8_t* src) { + // wait for previous write to finish + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_MULTIPLE); + chipSelectHigh(); + return false; + } + return writeData(WRITE_MULTIPLE_TOKEN, src); +} +//------------------------------------------------------------------------------ +// send one block of data for write block or write multiple blocks +uint8_t Sd2Card::writeData(uint8_t token, const uint8_t* src) { +#ifdef OPTIMIZE_HARDWARE_SPI + + // send data - optimized loop + SPDR = token; + + // send two byte per iteration + for (uint16_t i = 0; i < 512; i += 2) { + while (!(SPSR & (1 << SPIF))); + SPDR = src[i]; + while (!(SPSR & (1 << SPIF))); + SPDR = src[i+1]; + } + + // wait for last data byte + while (!(SPSR & (1 << SPIF))); + +#else // OPTIMIZE_HARDWARE_SPI + spiSend(token); + for (uint16_t i = 0; i < 512; i++) { + spiSend(src[i]); + } +#endif // OPTIMIZE_HARDWARE_SPI + spiSend(0xff); // dummy crc + spiSend(0xff); // dummy crc + + status_ = spiRec(); + if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { + error(SD_CARD_ERROR_WRITE); + chipSelectHigh(); + return false; + } + return true; +} +//------------------------------------------------------------------------------ +/** Start a write multiple blocks sequence. + * + * \param[in] blockNumber Address of first block in sequence. + * \param[in] eraseCount The number of blocks to be pre-erased. + * + * \note This function is used with writeData() and writeStop() + * for optimized multiple block writes. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { +#if SD_PROTECT_BLOCK_ZERO + // don't allow write to first block + if (blockNumber == 0) { + error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); + goto fail; + } +#endif // SD_PROTECT_BLOCK_ZERO + // send pre-erase count + if (cardAcmd(ACMD23, eraseCount)) { + error(SD_CARD_ERROR_ACMD23); + goto fail; + } + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD25, blockNumber)) { + error(SD_CARD_ERROR_CMD25); + goto fail; + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** End a write multiple blocks sequence. + * +* \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeStop(void) { + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + spiSend(STOP_TRAN_TOKEN); + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + chipSelectHigh(); + return true; + + fail: + error(SD_CARD_ERROR_STOP_TRAN); + chipSelectHigh(); + return false; +} diff --git a/libraries/SD/utility/Sd2Card.h b/libraries/SD/utility/Sd2Card.h index 989d3d8bf56..c30e26469c9 100644 --- a/libraries/SD/utility/Sd2Card.h +++ b/libraries/SD/utility/Sd2Card.h @@ -1,240 +1,240 @@ -/* Arduino Sd2Card Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino Sd2Card Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino Sd2Card Library. If not, see - * . - */ -#ifndef Sd2Card_h -#define Sd2Card_h -/** - * \file - * Sd2Card class - */ -#include "Sd2PinMap.h" -#include "SdInfo.h" -/** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ -uint8_t const SPI_FULL_SPEED = 0; -/** Set SCK rate to F_CPU/4. See Sd2Card::setSckRate(). */ -uint8_t const SPI_HALF_SPEED = 1; -/** Set SCK rate to F_CPU/8. Sd2Card::setSckRate(). */ -uint8_t const SPI_QUARTER_SPEED = 2; -/** - * USE_SPI_LIB: if set, use the SPI library bundled with Arduino IDE, otherwise +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef Sd2Card_h +#define Sd2Card_h +/** + * \file + * Sd2Card class + */ +#include "Sd2PinMap.h" +#include "SdInfo.h" +/** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ +uint8_t const SPI_FULL_SPEED = 0; +/** Set SCK rate to F_CPU/4. See Sd2Card::setSckRate(). */ +uint8_t const SPI_HALF_SPEED = 1; +/** Set SCK rate to F_CPU/8. Sd2Card::setSckRate(). */ +uint8_t const SPI_QUARTER_SPEED = 2; +/** + * USE_SPI_LIB: if set, use the SPI library bundled with Arduino IDE, otherwise * run with a standalone driver for AVR. - */ -#define USE_SPI_LIB -/** - * Define MEGA_SOFT_SPI non-zero to use software SPI on Mega Arduinos. - * Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. - * - * MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used - * on Mega Arduinos. Software SPI works well with GPS Shield V1.1 - * but many SD cards will fail with GPS Shield V1.0. - */ -#define MEGA_SOFT_SPI 0 -//------------------------------------------------------------------------------ -#if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) -#define SOFTWARE_SPI -#endif // MEGA_SOFT_SPI -//------------------------------------------------------------------------------ -// SPI pin definitions -// -#ifndef SOFTWARE_SPI -// hardware pin defs -/** - * SD Chip Select pin - * - * Warning if this pin is redefined the hardware SS will pin will be enabled - * as an output by init(). An avr processor will not function as an SPI - * master unless SS is set to output mode. - */ -/** The default chip select pin for the SD card is SS. */ -uint8_t const SD_CHIP_SELECT_PIN = SS_PIN; -// The following three pins must not be redefined for hardware SPI. -/** SPI Master Out Slave In pin */ -uint8_t const SPI_MOSI_PIN = MOSI_PIN; -/** SPI Master In Slave Out pin */ -uint8_t const SPI_MISO_PIN = MISO_PIN; -/** SPI Clock pin */ -uint8_t const SPI_SCK_PIN = SCK_PIN; -/** optimize loops for hardware SPI */ -#ifndef USE_SPI_LIB -#define OPTIMIZE_HARDWARE_SPI -#endif - -#else // SOFTWARE_SPI -// define software SPI pins so Mega can use unmodified GPS Shield -/** SPI chip select pin */ -uint8_t const SD_CHIP_SELECT_PIN = 10; -/** SPI Master Out Slave In pin */ -uint8_t const SPI_MOSI_PIN = 11; -/** SPI Master In Slave Out pin */ -uint8_t const SPI_MISO_PIN = 12; -/** SPI Clock pin */ -uint8_t const SPI_SCK_PIN = 13; -#endif // SOFTWARE_SPI -//------------------------------------------------------------------------------ -/** Protect block zero from write if nonzero */ -#define SD_PROTECT_BLOCK_ZERO 1 -/** init timeout ms */ -uint16_t const SD_INIT_TIMEOUT = 2000; -/** erase timeout ms */ -uint16_t const SD_ERASE_TIMEOUT = 10000; -/** read timeout ms */ -uint16_t const SD_READ_TIMEOUT = 300; -/** write time out ms */ -uint16_t const SD_WRITE_TIMEOUT = 600; -//------------------------------------------------------------------------------ -// SD card errors -/** timeout error for command CMD0 */ -uint8_t const SD_CARD_ERROR_CMD0 = 0X1; -/** CMD8 was not accepted - not a valid SD card*/ -uint8_t const SD_CARD_ERROR_CMD8 = 0X2; -/** card returned an error response for CMD17 (read block) */ -uint8_t const SD_CARD_ERROR_CMD17 = 0X3; -/** card returned an error response for CMD24 (write block) */ -uint8_t const SD_CARD_ERROR_CMD24 = 0X4; -/** WRITE_MULTIPLE_BLOCKS command failed */ -uint8_t const SD_CARD_ERROR_CMD25 = 0X05; -/** card returned an error response for CMD58 (read OCR) */ -uint8_t const SD_CARD_ERROR_CMD58 = 0X06; -/** SET_WR_BLK_ERASE_COUNT failed */ -uint8_t const SD_CARD_ERROR_ACMD23 = 0X07; -/** card's ACMD41 initialization process timeout */ -uint8_t const SD_CARD_ERROR_ACMD41 = 0X08; -/** card returned a bad CSR version field */ -uint8_t const SD_CARD_ERROR_BAD_CSD = 0X09; -/** erase block group command failed */ -uint8_t const SD_CARD_ERROR_ERASE = 0X0A; -/** card not capable of single block erase */ -uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0X0B; -/** Erase sequence timed out */ -uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0X0C; -/** card returned an error token instead of read data */ -uint8_t const SD_CARD_ERROR_READ = 0X0D; -/** read CID or CSD failed */ -uint8_t const SD_CARD_ERROR_READ_REG = 0X0E; -/** timeout while waiting for start of read data */ -uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X0F; -/** card did not accept STOP_TRAN_TOKEN */ -uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X10; -/** card returned an error token as a response to a write operation */ -uint8_t const SD_CARD_ERROR_WRITE = 0X11; -/** attempt to write protected block zero */ -uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X12; -/** card did not go ready for a multiple block write */ -uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X13; -/** card returned an error to a CMD13 status check after a write */ -uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X14; -/** timeout occurred during write programming */ -uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X15; -/** incorrect rate selected */ -uint8_t const SD_CARD_ERROR_SCK_RATE = 0X16; -//------------------------------------------------------------------------------ -// card types -/** Standard capacity V1 SD card */ -uint8_t const SD_CARD_TYPE_SD1 = 1; -/** Standard capacity V2 SD card */ -uint8_t const SD_CARD_TYPE_SD2 = 2; -/** High Capacity SD card */ -uint8_t const SD_CARD_TYPE_SDHC = 3; -//------------------------------------------------------------------------------ -/** - * \class Sd2Card - * \brief Raw access to SD and SDHC flash memory cards. - */ -class Sd2Card { - public: - /** Construct an instance of Sd2Card. */ - Sd2Card(void) : errorCode_(0), inBlock_(0), partialBlockRead_(0), type_(0) {} - uint32_t cardSize(void); - uint8_t erase(uint32_t firstBlock, uint32_t lastBlock); - uint8_t eraseSingleBlockEnable(void); - /** - * \return error code for last error. See Sd2Card.h for a list of error codes. - */ - uint8_t errorCode(void) const {return errorCode_;} - /** \return error data for last error. */ - uint8_t errorData(void) const {return status_;} - /** - * Initialize an SD flash memory card with default clock rate and chip - * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). - */ - uint8_t init(void) { - return init(SPI_FULL_SPEED, SD_CHIP_SELECT_PIN); - } - /** - * Initialize an SD flash memory card with the selected SPI clock rate - * and the default SD chip select pin. - * See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). - */ - uint8_t init(uint8_t sckRateID) { - return init(sckRateID, SD_CHIP_SELECT_PIN); - } - uint8_t init(uint8_t sckRateID, uint8_t chipSelectPin); - void partialBlockRead(uint8_t value); - /** Returns the current value, true or false, for partial block read. */ - uint8_t partialBlockRead(void) const {return partialBlockRead_;} - uint8_t readBlock(uint32_t block, uint8_t* dst); - uint8_t readData(uint32_t block, - uint16_t offset, uint16_t count, uint8_t* dst); - /** - * Read a cards CID register. The CID contains card identification - * information such as Manufacturer ID, Product name, Product serial - * number and Manufacturing date. */ - uint8_t readCID(cid_t* cid) { - return readRegister(CMD10, cid); - } - /** - * Read a cards CSD register. The CSD contains Card-Specific Data that - * provides information regarding access to the card's contents. */ - uint8_t readCSD(csd_t* csd) { - return readRegister(CMD9, csd); - } - void readEnd(void); - uint8_t setSckRate(uint8_t sckRateID); - /** Return the card type: SD V1, SD V2 or SDHC */ - uint8_t type(void) const {return type_;} - uint8_t writeBlock(uint32_t blockNumber, const uint8_t* src); - uint8_t writeData(const uint8_t* src); - uint8_t writeStart(uint32_t blockNumber, uint32_t eraseCount); - uint8_t writeStop(void); - private: - uint32_t block_; - uint8_t chipSelectPin_; - uint8_t errorCode_; - uint8_t inBlock_; - uint16_t offset_; - uint8_t partialBlockRead_; - uint8_t status_; - uint8_t type_; - // private functions - uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { - cardCommand(CMD55, 0); - return cardCommand(cmd, arg); - } - uint8_t cardCommand(uint8_t cmd, uint32_t arg); - void error(uint8_t code) {errorCode_ = code;} - uint8_t readRegister(uint8_t cmd, void* buf); - uint8_t sendWriteCommand(uint32_t blockNumber, uint32_t eraseCount); - void chipSelectHigh(void); - void chipSelectLow(void); - void type(uint8_t value) {type_ = value;} - uint8_t waitNotBusy(uint16_t timeoutMillis); - uint8_t writeData(uint8_t token, const uint8_t* src); - uint8_t waitStartBlock(void); -}; -#endif // Sd2Card_h + */ +#define USE_SPI_LIB +/** + * Define MEGA_SOFT_SPI non-zero to use software SPI on Mega Arduinos. + * Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * + * MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used + * on Mega Arduinos. Software SPI works well with GPS Shield V1.1 + * but many SD cards will fail with GPS Shield V1.0. + */ +#define MEGA_SOFT_SPI 0 +//------------------------------------------------------------------------------ +#if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) +#define SOFTWARE_SPI +#endif // MEGA_SOFT_SPI +//------------------------------------------------------------------------------ +// SPI pin definitions +// +#ifndef SOFTWARE_SPI +// hardware pin defs +/** + * SD Chip Select pin + * + * Warning if this pin is redefined the hardware SS will pin will be enabled + * as an output by init(). An avr processor will not function as an SPI + * master unless SS is set to output mode. + */ +/** The default chip select pin for the SD card is SS. */ +uint8_t const SD_CHIP_SELECT_PIN = SS_PIN; +// The following three pins must not be redefined for hardware SPI. +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = MOSI_PIN; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = MISO_PIN; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = SCK_PIN; +/** optimize loops for hardware SPI */ +#ifndef USE_SPI_LIB +#define OPTIMIZE_HARDWARE_SPI +#endif + +#else // SOFTWARE_SPI +// define software SPI pins so Mega can use unmodified GPS Shield +/** SPI chip select pin */ +uint8_t const SD_CHIP_SELECT_PIN = 10; +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = 11; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = 12; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = 13; +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +/** Protect block zero from write if nonzero */ +#define SD_PROTECT_BLOCK_ZERO 1 +/** init timeout ms */ +uint16_t const SD_INIT_TIMEOUT = 2000; +/** erase timeout ms */ +uint16_t const SD_ERASE_TIMEOUT = 10000; +/** read timeout ms */ +uint16_t const SD_READ_TIMEOUT = 300; +/** write time out ms */ +uint16_t const SD_WRITE_TIMEOUT = 600; +//------------------------------------------------------------------------------ +// SD card errors +/** timeout error for command CMD0 */ +uint8_t const SD_CARD_ERROR_CMD0 = 0X1; +/** CMD8 was not accepted - not a valid SD card*/ +uint8_t const SD_CARD_ERROR_CMD8 = 0X2; +/** card returned an error response for CMD17 (read block) */ +uint8_t const SD_CARD_ERROR_CMD17 = 0X3; +/** card returned an error response for CMD24 (write block) */ +uint8_t const SD_CARD_ERROR_CMD24 = 0X4; +/** WRITE_MULTIPLE_BLOCKS command failed */ +uint8_t const SD_CARD_ERROR_CMD25 = 0X05; +/** card returned an error response for CMD58 (read OCR) */ +uint8_t const SD_CARD_ERROR_CMD58 = 0X06; +/** SET_WR_BLK_ERASE_COUNT failed */ +uint8_t const SD_CARD_ERROR_ACMD23 = 0X07; +/** card's ACMD41 initialization process timeout */ +uint8_t const SD_CARD_ERROR_ACMD41 = 0X08; +/** card returned a bad CSR version field */ +uint8_t const SD_CARD_ERROR_BAD_CSD = 0X09; +/** erase block group command failed */ +uint8_t const SD_CARD_ERROR_ERASE = 0X0A; +/** card not capable of single block erase */ +uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0X0B; +/** Erase sequence timed out */ +uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0X0C; +/** card returned an error token instead of read data */ +uint8_t const SD_CARD_ERROR_READ = 0X0D; +/** read CID or CSD failed */ +uint8_t const SD_CARD_ERROR_READ_REG = 0X0E; +/** timeout while waiting for start of read data */ +uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X0F; +/** card did not accept STOP_TRAN_TOKEN */ +uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X10; +/** card returned an error token as a response to a write operation */ +uint8_t const SD_CARD_ERROR_WRITE = 0X11; +/** attempt to write protected block zero */ +uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X12; +/** card did not go ready for a multiple block write */ +uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X13; +/** card returned an error to a CMD13 status check after a write */ +uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X14; +/** timeout occurred during write programming */ +uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X15; +/** incorrect rate selected */ +uint8_t const SD_CARD_ERROR_SCK_RATE = 0X16; +//------------------------------------------------------------------------------ +// card types +/** Standard capacity V1 SD card */ +uint8_t const SD_CARD_TYPE_SD1 = 1; +/** Standard capacity V2 SD card */ +uint8_t const SD_CARD_TYPE_SD2 = 2; +/** High Capacity SD card */ +uint8_t const SD_CARD_TYPE_SDHC = 3; +//------------------------------------------------------------------------------ +/** + * \class Sd2Card + * \brief Raw access to SD and SDHC flash memory cards. + */ +class Sd2Card { + public: + /** Construct an instance of Sd2Card. */ + Sd2Card(void) : errorCode_(0), inBlock_(0), partialBlockRead_(0), type_(0) {} + uint32_t cardSize(void); + uint8_t erase(uint32_t firstBlock, uint32_t lastBlock); + uint8_t eraseSingleBlockEnable(void); + /** + * \return error code for last error. See Sd2Card.h for a list of error codes. + */ + uint8_t errorCode(void) const {return errorCode_;} + /** \return error data for last error. */ + uint8_t errorData(void) const {return status_;} + /** + * Initialize an SD flash memory card with default clock rate and chip + * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + */ + uint8_t init(void) { + return init(SPI_FULL_SPEED, SD_CHIP_SELECT_PIN); + } + /** + * Initialize an SD flash memory card with the selected SPI clock rate + * and the default SD chip select pin. + * See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + */ + uint8_t init(uint8_t sckRateID) { + return init(sckRateID, SD_CHIP_SELECT_PIN); + } + uint8_t init(uint8_t sckRateID, uint8_t chipSelectPin); + void partialBlockRead(uint8_t value); + /** Returns the current value, true or false, for partial block read. */ + uint8_t partialBlockRead(void) const {return partialBlockRead_;} + uint8_t readBlock(uint32_t block, uint8_t* dst); + uint8_t readData(uint32_t block, + uint16_t offset, uint16_t count, uint8_t* dst); + /** + * Read a cards CID register. The CID contains card identification + * information such as Manufacturer ID, Product name, Product serial + * number and Manufacturing date. */ + uint8_t readCID(cid_t* cid) { + return readRegister(CMD10, cid); + } + /** + * Read a cards CSD register. The CSD contains Card-Specific Data that + * provides information regarding access to the card's contents. */ + uint8_t readCSD(csd_t* csd) { + return readRegister(CMD9, csd); + } + void readEnd(void); + uint8_t setSckRate(uint8_t sckRateID); + /** Return the card type: SD V1, SD V2 or SDHC */ + uint8_t type(void) const {return type_;} + uint8_t writeBlock(uint32_t blockNumber, const uint8_t* src); + uint8_t writeData(const uint8_t* src); + uint8_t writeStart(uint32_t blockNumber, uint32_t eraseCount); + uint8_t writeStop(void); + private: + uint32_t block_; + uint8_t chipSelectPin_; + uint8_t errorCode_; + uint8_t inBlock_; + uint16_t offset_; + uint8_t partialBlockRead_; + uint8_t status_; + uint8_t type_; + // private functions + uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { + cardCommand(CMD55, 0); + return cardCommand(cmd, arg); + } + uint8_t cardCommand(uint8_t cmd, uint32_t arg); + void error(uint8_t code) {errorCode_ = code;} + uint8_t readRegister(uint8_t cmd, void* buf); + uint8_t sendWriteCommand(uint32_t blockNumber, uint32_t eraseCount); + void chipSelectHigh(void); + void chipSelectLow(void); + void type(uint8_t value) {type_ = value;} + uint8_t waitNotBusy(uint16_t timeoutMillis); + uint8_t writeData(uint8_t token, const uint8_t* src); + uint8_t waitStartBlock(void); +}; +#endif // Sd2Card_h diff --git a/libraries/SD/utility/Sd2PinMap.h b/libraries/SD/utility/Sd2PinMap.h index 02ad52f5fc5..a03abc09c44 100644 --- a/libraries/SD/utility/Sd2PinMap.h +++ b/libraries/SD/utility/Sd2PinMap.h @@ -1,372 +1,372 @@ -/* Arduino SdFat Library - * Copyright (C) 2010 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ -#if defined(__arm__) // Arduino Due Board follows - -#ifndef Sd2PinMap_h -#define Sd2PinMap_h - -#include - -uint8_t const SS_PIN = SS; -uint8_t const MOSI_PIN = MOSI; -uint8_t const MISO_PIN = MISO; -uint8_t const SCK_PIN = SCK; - -#endif // Sd2PinMap_h - -#elif defined(__AVR__) // Other AVR based Boards follows - -// Warning this file was generated by a program. -#ifndef Sd2PinMap_h -#define Sd2PinMap_h -#include - -//------------------------------------------------------------------------------ -/** struct for mapping digital pins */ -struct pin_map_t { - volatile uint8_t* ddr; - volatile uint8_t* pin; - volatile uint8_t* port; - uint8_t bit; -}; -//------------------------------------------------------------------------------ -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) -// Mega - -// Two Wire (aka I2C) ports -uint8_t const SDA_PIN = 20; -uint8_t const SCL_PIN = 21; - -// SPI port -uint8_t const SS_PIN = 53; -uint8_t const MOSI_PIN = 51; -uint8_t const MISO_PIN = 50; -uint8_t const SCK_PIN = 52; - -static const pin_map_t digitalPinMap[] = { - {&DDRE, &PINE, &PORTE, 0}, // E0 0 - {&DDRE, &PINE, &PORTE, 1}, // E1 1 - {&DDRE, &PINE, &PORTE, 4}, // E4 2 - {&DDRE, &PINE, &PORTE, 5}, // E5 3 - {&DDRG, &PING, &PORTG, 5}, // G5 4 - {&DDRE, &PINE, &PORTE, 3}, // E3 5 - {&DDRH, &PINH, &PORTH, 3}, // H3 6 - {&DDRH, &PINH, &PORTH, 4}, // H4 7 - {&DDRH, &PINH, &PORTH, 5}, // H5 8 - {&DDRH, &PINH, &PORTH, 6}, // H6 9 - {&DDRB, &PINB, &PORTB, 4}, // B4 10 - {&DDRB, &PINB, &PORTB, 5}, // B5 11 - {&DDRB, &PINB, &PORTB, 6}, // B6 12 - {&DDRB, &PINB, &PORTB, 7}, // B7 13 - {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 - {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 - {&DDRH, &PINH, &PORTH, 1}, // H1 16 - {&DDRH, &PINH, &PORTH, 0}, // H0 17 - {&DDRD, &PIND, &PORTD, 3}, // D3 18 - {&DDRD, &PIND, &PORTD, 2}, // D2 19 - {&DDRD, &PIND, &PORTD, 1}, // D1 20 - {&DDRD, &PIND, &PORTD, 0}, // D0 21 - {&DDRA, &PINA, &PORTA, 0}, // A0 22 - {&DDRA, &PINA, &PORTA, 1}, // A1 23 - {&DDRA, &PINA, &PORTA, 2}, // A2 24 - {&DDRA, &PINA, &PORTA, 3}, // A3 25 - {&DDRA, &PINA, &PORTA, 4}, // A4 26 - {&DDRA, &PINA, &PORTA, 5}, // A5 27 - {&DDRA, &PINA, &PORTA, 6}, // A6 28 - {&DDRA, &PINA, &PORTA, 7}, // A7 29 - {&DDRC, &PINC, &PORTC, 7}, // C7 30 - {&DDRC, &PINC, &PORTC, 6}, // C6 31 - {&DDRC, &PINC, &PORTC, 5}, // C5 32 - {&DDRC, &PINC, &PORTC, 4}, // C4 33 - {&DDRC, &PINC, &PORTC, 3}, // C3 34 - {&DDRC, &PINC, &PORTC, 2}, // C2 35 - {&DDRC, &PINC, &PORTC, 1}, // C1 36 - {&DDRC, &PINC, &PORTC, 0}, // C0 37 - {&DDRD, &PIND, &PORTD, 7}, // D7 38 - {&DDRG, &PING, &PORTG, 2}, // G2 39 - {&DDRG, &PING, &PORTG, 1}, // G1 40 - {&DDRG, &PING, &PORTG, 0}, // G0 41 - {&DDRL, &PINL, &PORTL, 7}, // L7 42 - {&DDRL, &PINL, &PORTL, 6}, // L6 43 - {&DDRL, &PINL, &PORTL, 5}, // L5 44 - {&DDRL, &PINL, &PORTL, 4}, // L4 45 - {&DDRL, &PINL, &PORTL, 3}, // L3 46 - {&DDRL, &PINL, &PORTL, 2}, // L2 47 - {&DDRL, &PINL, &PORTL, 1}, // L1 48 - {&DDRL, &PINL, &PORTL, 0}, // L0 49 - {&DDRB, &PINB, &PORTB, 3}, // B3 50 - {&DDRB, &PINB, &PORTB, 2}, // B2 51 - {&DDRB, &PINB, &PORTB, 1}, // B1 52 - {&DDRB, &PINB, &PORTB, 0}, // B0 53 - {&DDRF, &PINF, &PORTF, 0}, // F0 54 - {&DDRF, &PINF, &PORTF, 1}, // F1 55 - {&DDRF, &PINF, &PORTF, 2}, // F2 56 - {&DDRF, &PINF, &PORTF, 3}, // F3 57 - {&DDRF, &PINF, &PORTF, 4}, // F4 58 - {&DDRF, &PINF, &PORTF, 5}, // F5 59 - {&DDRF, &PINF, &PORTF, 6}, // F6 60 - {&DDRF, &PINF, &PORTF, 7}, // F7 61 - {&DDRK, &PINK, &PORTK, 0}, // K0 62 - {&DDRK, &PINK, &PORTK, 1}, // K1 63 - {&DDRK, &PINK, &PORTK, 2}, // K2 64 - {&DDRK, &PINK, &PORTK, 3}, // K3 65 - {&DDRK, &PINK, &PORTK, 4}, // K4 66 - {&DDRK, &PINK, &PORTK, 5}, // K5 67 - {&DDRK, &PINK, &PORTK, 6}, // K6 68 - {&DDRK, &PINK, &PORTK, 7} // K7 69 -}; -//------------------------------------------------------------------------------ -#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) -// Sanguino - -// Two Wire (aka I2C) ports -uint8_t const SDA_PIN = 17; -uint8_t const SCL_PIN = 18; - -// SPI port -uint8_t const SS_PIN = 4; -uint8_t const MOSI_PIN = 5; -uint8_t const MISO_PIN = 6; -uint8_t const SCK_PIN = 7; - -static const pin_map_t digitalPinMap[] = { - {&DDRB, &PINB, &PORTB, 0}, // B0 0 - {&DDRB, &PINB, &PORTB, 1}, // B1 1 - {&DDRB, &PINB, &PORTB, 2}, // B2 2 - {&DDRB, &PINB, &PORTB, 3}, // B3 3 - {&DDRB, &PINB, &PORTB, 4}, // B4 4 - {&DDRB, &PINB, &PORTB, 5}, // B5 5 - {&DDRB, &PINB, &PORTB, 6}, // B6 6 - {&DDRB, &PINB, &PORTB, 7}, // B7 7 - {&DDRD, &PIND, &PORTD, 0}, // D0 8 - {&DDRD, &PIND, &PORTD, 1}, // D1 9 - {&DDRD, &PIND, &PORTD, 2}, // D2 10 - {&DDRD, &PIND, &PORTD, 3}, // D3 11 - {&DDRD, &PIND, &PORTD, 4}, // D4 12 - {&DDRD, &PIND, &PORTD, 5}, // D5 13 - {&DDRD, &PIND, &PORTD, 6}, // D6 14 - {&DDRD, &PIND, &PORTD, 7}, // D7 15 - {&DDRC, &PINC, &PORTC, 0}, // C0 16 - {&DDRC, &PINC, &PORTC, 1}, // C1 17 - {&DDRC, &PINC, &PORTC, 2}, // C2 18 - {&DDRC, &PINC, &PORTC, 3}, // C3 19 - {&DDRC, &PINC, &PORTC, 4}, // C4 20 - {&DDRC, &PINC, &PORTC, 5}, // C5 21 - {&DDRC, &PINC, &PORTC, 6}, // C6 22 - {&DDRC, &PINC, &PORTC, 7}, // C7 23 - {&DDRA, &PINA, &PORTA, 7}, // A7 24 - {&DDRA, &PINA, &PORTA, 6}, // A6 25 - {&DDRA, &PINA, &PORTA, 5}, // A5 26 - {&DDRA, &PINA, &PORTA, 4}, // A4 27 - {&DDRA, &PINA, &PORTA, 3}, // A3 28 - {&DDRA, &PINA, &PORTA, 2}, // A2 29 - {&DDRA, &PINA, &PORTA, 1}, // A1 30 - {&DDRA, &PINA, &PORTA, 0} // A0 31 -}; -//------------------------------------------------------------------------------ -#elif defined(__AVR_ATmega32U4__) -// Leonardo - -// Two Wire (aka I2C) ports -uint8_t const SDA_PIN = 2; -uint8_t const SCL_PIN = 3; - -// SPI port -uint8_t const SS_PIN = 17; -uint8_t const MOSI_PIN = 16; -uint8_t const MISO_PIN = 14; -uint8_t const SCK_PIN = 15; - -static const pin_map_t digitalPinMap[] = { - {&DDRD, &PIND, &PORTD, 2}, // D2 0 - {&DDRD, &PIND, &PORTD, 3}, // D3 1 - {&DDRD, &PIND, &PORTD, 1}, // D1 2 - {&DDRD, &PIND, &PORTD, 0}, // D0 3 - {&DDRD, &PIND, &PORTD, 4}, // D4 4 - {&DDRC, &PINC, &PORTC, 6}, // C6 5 - {&DDRD, &PIND, &PORTD, 7}, // D7 6 - {&DDRE, &PINE, &PORTE, 6}, // E6 7 - {&DDRB, &PINB, &PORTB, 4}, // B4 8 - {&DDRB, &PINB, &PORTB, 5}, // B5 9 - {&DDRB, &PINB, &PORTB, 6}, // B6 10 - {&DDRB, &PINB, &PORTB, 7}, // B7 11 - {&DDRD, &PIND, &PORTD, 6}, // D6 12 - {&DDRC, &PINC, &PORTC, 7}, // C7 13 - {&DDRB, &PINB, &PORTB, 3}, // B3 14 - {&DDRB, &PINB, &PORTB, 1}, // B1 15 - {&DDRB, &PINB, &PORTB, 2}, // B2 16 - {&DDRB, &PINB, &PORTB, 0}, // B0 17 - {&DDRF, &PINF, &PORTF, 7}, // F7 18 - {&DDRF, &PINF, &PORTF, 6}, // F6 19 - {&DDRF, &PINF, &PORTF, 5}, // F5 20 - {&DDRF, &PINF, &PORTF, 4}, // F4 21 - {&DDRF, &PINF, &PORTF, 1}, // F1 22 - {&DDRF, &PINF, &PORTF, 0}, // F0 23 -}; -//------------------------------------------------------------------------------ -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) -// Teensy++ 1.0 & 2.0 - -// Two Wire (aka I2C) ports -uint8_t const SDA_PIN = 1; -uint8_t const SCL_PIN = 0; - -// SPI port -uint8_t const SS_PIN = 20; -uint8_t const MOSI_PIN = 22; -uint8_t const MISO_PIN = 23; -uint8_t const SCK_PIN = 21; - -static const pin_map_t digitalPinMap[] = { - {&DDRD, &PIND, &PORTD, 0}, // D0 0 - {&DDRD, &PIND, &PORTD, 1}, // D1 1 - {&DDRD, &PIND, &PORTD, 2}, // D2 2 - {&DDRD, &PIND, &PORTD, 3}, // D3 3 - {&DDRD, &PIND, &PORTD, 4}, // D4 4 - {&DDRD, &PIND, &PORTD, 5}, // D5 5 - {&DDRD, &PIND, &PORTD, 6}, // D6 6 - {&DDRD, &PIND, &PORTD, 7}, // D7 7 - {&DDRE, &PINE, &PORTE, 0}, // E0 8 - {&DDRE, &PINE, &PORTE, 1}, // E1 9 - {&DDRC, &PINC, &PORTC, 0}, // C0 10 - {&DDRC, &PINC, &PORTC, 1}, // C1 11 - {&DDRC, &PINC, &PORTC, 2}, // C2 12 - {&DDRC, &PINC, &PORTC, 3}, // C3 13 - {&DDRC, &PINC, &PORTC, 4}, // C4 14 - {&DDRC, &PINC, &PORTC, 5}, // C5 15 - {&DDRC, &PINC, &PORTC, 6}, // C6 16 - {&DDRC, &PINC, &PORTC, 7}, // C7 17 - {&DDRE, &PINE, &PORTE, 6}, // E6 18 - {&DDRE, &PINE, &PORTE, 7}, // E7 19 - {&DDRB, &PINB, &PORTB, 0}, // B0 20 - {&DDRB, &PINB, &PORTB, 1}, // B1 21 - {&DDRB, &PINB, &PORTB, 2}, // B2 22 - {&DDRB, &PINB, &PORTB, 3}, // B3 23 - {&DDRB, &PINB, &PORTB, 4}, // B4 24 - {&DDRB, &PINB, &PORTB, 5}, // B5 25 - {&DDRB, &PINB, &PORTB, 6}, // B6 26 - {&DDRB, &PINB, &PORTB, 7}, // B7 27 - {&DDRA, &PINA, &PORTA, 0}, // A0 28 - {&DDRA, &PINA, &PORTA, 1}, // A1 29 - {&DDRA, &PINA, &PORTA, 2}, // A2 30 - {&DDRA, &PINA, &PORTA, 3}, // A3 31 - {&DDRA, &PINA, &PORTA, 4}, // A4 32 - {&DDRA, &PINA, &PORTA, 5}, // A5 33 - {&DDRA, &PINA, &PORTA, 6}, // A6 34 - {&DDRA, &PINA, &PORTA, 7}, // A7 35 - {&DDRE, &PINE, &PORTE, 4}, // E4 36 - {&DDRE, &PINE, &PORTE, 5}, // E5 37 - {&DDRF, &PINF, &PORTF, 0}, // F0 38 - {&DDRF, &PINF, &PORTF, 1}, // F1 39 - {&DDRF, &PINF, &PORTF, 2}, // F2 40 - {&DDRF, &PINF, &PORTF, 3}, // F3 41 - {&DDRF, &PINF, &PORTF, 4}, // F4 42 - {&DDRF, &PINF, &PORTF, 5}, // F5 43 - {&DDRF, &PINF, &PORTF, 6}, // F6 44 - {&DDRF, &PINF, &PORTF, 7} // F7 45 -}; -//------------------------------------------------------------------------------ -#else // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) -// 168 and 328 Arduinos - -// Two Wire (aka I2C) ports -uint8_t const SDA_PIN = 18; -uint8_t const SCL_PIN = 19; - -// SPI port -uint8_t const SS_PIN = 10; -uint8_t const MOSI_PIN = 11; -uint8_t const MISO_PIN = 12; -uint8_t const SCK_PIN = 13; - -static const pin_map_t digitalPinMap[] = { - {&DDRD, &PIND, &PORTD, 0}, // D0 0 - {&DDRD, &PIND, &PORTD, 1}, // D1 1 - {&DDRD, &PIND, &PORTD, 2}, // D2 2 - {&DDRD, &PIND, &PORTD, 3}, // D3 3 - {&DDRD, &PIND, &PORTD, 4}, // D4 4 - {&DDRD, &PIND, &PORTD, 5}, // D5 5 - {&DDRD, &PIND, &PORTD, 6}, // D6 6 - {&DDRD, &PIND, &PORTD, 7}, // D7 7 - {&DDRB, &PINB, &PORTB, 0}, // B0 8 - {&DDRB, &PINB, &PORTB, 1}, // B1 9 - {&DDRB, &PINB, &PORTB, 2}, // B2 10 - {&DDRB, &PINB, &PORTB, 3}, // B3 11 - {&DDRB, &PINB, &PORTB, 4}, // B4 12 - {&DDRB, &PINB, &PORTB, 5}, // B5 13 - {&DDRC, &PINC, &PORTC, 0}, // C0 14 - {&DDRC, &PINC, &PORTC, 1}, // C1 15 - {&DDRC, &PINC, &PORTC, 2}, // C2 16 - {&DDRC, &PINC, &PORTC, 3}, // C3 17 - {&DDRC, &PINC, &PORTC, 4}, // C4 18 - {&DDRC, &PINC, &PORTC, 5} // C5 19 -}; -#endif // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) -//------------------------------------------------------------------------------ -static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t); - -uint8_t badPinNumber(void) - __attribute__((error("Pin number is too large or not a constant"))); - -static inline __attribute__((always_inline)) - uint8_t getPinMode(uint8_t pin) { - if (__builtin_constant_p(pin) && pin < digitalPinCount) { - return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1; - } else { - return badPinNumber(); - } -} -static inline __attribute__((always_inline)) - void setPinMode(uint8_t pin, uint8_t mode) { - if (__builtin_constant_p(pin) && pin < digitalPinCount) { - if (mode) { - *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit; - } else { - *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit); - } - } else { - badPinNumber(); - } -} -static inline __attribute__((always_inline)) - uint8_t fastDigitalRead(uint8_t pin) { - if (__builtin_constant_p(pin) && pin < digitalPinCount) { - return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1; - } else { - return badPinNumber(); - } -} -static inline __attribute__((always_inline)) - void fastDigitalWrite(uint8_t pin, uint8_t value) { - if (__builtin_constant_p(pin) && pin < digitalPinCount) { - if (value) { - *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit; - } else { - *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit); - } - } else { - badPinNumber(); - } -} -#endif // Sd2PinMap_h - -#else -#error Architecture or board not supported. -#endif +/* Arduino SdFat Library + * Copyright (C) 2010 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#if defined(__arm__) // Arduino Due Board follows + +#ifndef Sd2PinMap_h +#define Sd2PinMap_h + +#include + +uint8_t const SS_PIN = SS; +uint8_t const MOSI_PIN = MOSI; +uint8_t const MISO_PIN = MISO; +uint8_t const SCK_PIN = SCK; + +#endif // Sd2PinMap_h + +#elif defined(__AVR__) // Other AVR based Boards follows + +// Warning this file was generated by a program. +#ifndef Sd2PinMap_h +#define Sd2PinMap_h +#include + +//------------------------------------------------------------------------------ +/** struct for mapping digital pins */ +struct pin_map_t { + volatile uint8_t* ddr; + volatile uint8_t* pin; + volatile uint8_t* port; + uint8_t bit; +}; +//------------------------------------------------------------------------------ +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +// Mega + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 20; +uint8_t const SCL_PIN = 21; + +// SPI port +uint8_t const SS_PIN = 53; +uint8_t const MOSI_PIN = 51; +uint8_t const MISO_PIN = 50; +uint8_t const SCK_PIN = 52; + +static const pin_map_t digitalPinMap[] = { + {&DDRE, &PINE, &PORTE, 0}, // E0 0 + {&DDRE, &PINE, &PORTE, 1}, // E1 1 + {&DDRE, &PINE, &PORTE, 4}, // E4 2 + {&DDRE, &PINE, &PORTE, 5}, // E5 3 + {&DDRG, &PING, &PORTG, 5}, // G5 4 + {&DDRE, &PINE, &PORTE, 3}, // E3 5 + {&DDRH, &PINH, &PORTH, 3}, // H3 6 + {&DDRH, &PINH, &PORTH, 4}, // H4 7 + {&DDRH, &PINH, &PORTH, 5}, // H5 8 + {&DDRH, &PINH, &PORTH, 6}, // H6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 + {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 + {&DDRH, &PINH, &PORTH, 1}, // H1 16 + {&DDRH, &PINH, &PORTH, 0}, // H0 17 + {&DDRD, &PIND, &PORTD, 3}, // D3 18 + {&DDRD, &PIND, &PORTD, 2}, // D2 19 + {&DDRD, &PIND, &PORTD, 1}, // D1 20 + {&DDRD, &PIND, &PORTD, 0}, // D0 21 + {&DDRA, &PINA, &PORTA, 0}, // A0 22 + {&DDRA, &PINA, &PORTA, 1}, // A1 23 + {&DDRA, &PINA, &PORTA, 2}, // A2 24 + {&DDRA, &PINA, &PORTA, 3}, // A3 25 + {&DDRA, &PINA, &PORTA, 4}, // A4 26 + {&DDRA, &PINA, &PORTA, 5}, // A5 27 + {&DDRA, &PINA, &PORTA, 6}, // A6 28 + {&DDRA, &PINA, &PORTA, 7}, // A7 29 + {&DDRC, &PINC, &PORTC, 7}, // C7 30 + {&DDRC, &PINC, &PORTC, 6}, // C6 31 + {&DDRC, &PINC, &PORTC, 5}, // C5 32 + {&DDRC, &PINC, &PORTC, 4}, // C4 33 + {&DDRC, &PINC, &PORTC, 3}, // C3 34 + {&DDRC, &PINC, &PORTC, 2}, // C2 35 + {&DDRC, &PINC, &PORTC, 1}, // C1 36 + {&DDRC, &PINC, &PORTC, 0}, // C0 37 + {&DDRD, &PIND, &PORTD, 7}, // D7 38 + {&DDRG, &PING, &PORTG, 2}, // G2 39 + {&DDRG, &PING, &PORTG, 1}, // G1 40 + {&DDRG, &PING, &PORTG, 0}, // G0 41 + {&DDRL, &PINL, &PORTL, 7}, // L7 42 + {&DDRL, &PINL, &PORTL, 6}, // L6 43 + {&DDRL, &PINL, &PORTL, 5}, // L5 44 + {&DDRL, &PINL, &PORTL, 4}, // L4 45 + {&DDRL, &PINL, &PORTL, 3}, // L3 46 + {&DDRL, &PINL, &PORTL, 2}, // L2 47 + {&DDRL, &PINL, &PORTL, 1}, // L1 48 + {&DDRL, &PINL, &PORTL, 0}, // L0 49 + {&DDRB, &PINB, &PORTB, 3}, // B3 50 + {&DDRB, &PINB, &PORTB, 2}, // B2 51 + {&DDRB, &PINB, &PORTB, 1}, // B1 52 + {&DDRB, &PINB, &PORTB, 0}, // B0 53 + {&DDRF, &PINF, &PORTF, 0}, // F0 54 + {&DDRF, &PINF, &PORTF, 1}, // F1 55 + {&DDRF, &PINF, &PORTF, 2}, // F2 56 + {&DDRF, &PINF, &PORTF, 3}, // F3 57 + {&DDRF, &PINF, &PORTF, 4}, // F4 58 + {&DDRF, &PINF, &PORTF, 5}, // F5 59 + {&DDRF, &PINF, &PORTF, 6}, // F6 60 + {&DDRF, &PINF, &PORTF, 7}, // F7 61 + {&DDRK, &PINK, &PORTK, 0}, // K0 62 + {&DDRK, &PINK, &PORTK, 1}, // K1 63 + {&DDRK, &PINK, &PORTK, 2}, // K2 64 + {&DDRK, &PINK, &PORTK, 3}, // K3 65 + {&DDRK, &PINK, &PORTK, 4}, // K4 66 + {&DDRK, &PINK, &PORTK, 5}, // K5 67 + {&DDRK, &PINK, &PORTK, 6}, // K6 68 + {&DDRK, &PINK, &PORTK, 7} // K7 69 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) +// Sanguino + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 17; +uint8_t const SCL_PIN = 18; + +// SPI port +uint8_t const SS_PIN = 4; +uint8_t const MOSI_PIN = 5; +uint8_t const MISO_PIN = 6; +uint8_t const SCK_PIN = 7; + +static const pin_map_t digitalPinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 7}, // A7 24 + {&DDRA, &PINA, &PORTA, 6}, // A6 25 + {&DDRA, &PINA, &PORTA, 5}, // A5 26 + {&DDRA, &PINA, &PORTA, 4}, // A4 27 + {&DDRA, &PINA, &PORTA, 3}, // A3 28 + {&DDRA, &PINA, &PORTA, 2}, // A2 29 + {&DDRA, &PINA, &PORTA, 1}, // A1 30 + {&DDRA, &PINA, &PORTA, 0} // A0 31 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega32U4__) +// Leonardo + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 2; +uint8_t const SCL_PIN = 3; + +// SPI port +uint8_t const SS_PIN = 17; +uint8_t const MOSI_PIN = 16; +uint8_t const MISO_PIN = 14; +uint8_t const SCK_PIN = 15; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 2}, // D2 0 + {&DDRD, &PIND, &PORTD, 3}, // D3 1 + {&DDRD, &PIND, &PORTD, 1}, // D1 2 + {&DDRD, &PIND, &PORTD, 0}, // D0 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRC, &PINC, &PORTC, 6}, // C6 5 + {&DDRD, &PIND, &PORTD, 7}, // D7 6 + {&DDRE, &PINE, &PORTE, 6}, // E6 7 + {&DDRB, &PINB, &PORTB, 4}, // B4 8 + {&DDRB, &PINB, &PORTB, 5}, // B5 9 + {&DDRB, &PINB, &PORTB, 6}, // B6 10 + {&DDRB, &PINB, &PORTB, 7}, // B7 11 + {&DDRD, &PIND, &PORTD, 6}, // D6 12 + {&DDRC, &PINC, &PORTC, 7}, // C7 13 + {&DDRB, &PINB, &PORTB, 3}, // B3 14 + {&DDRB, &PINB, &PORTB, 1}, // B1 15 + {&DDRB, &PINB, &PORTB, 2}, // B2 16 + {&DDRB, &PINB, &PORTB, 0}, // B0 17 + {&DDRF, &PINF, &PORTF, 7}, // F7 18 + {&DDRF, &PINF, &PORTF, 6}, // F6 19 + {&DDRF, &PINF, &PORTF, 5}, // F5 20 + {&DDRF, &PINF, &PORTF, 4}, // F4 21 + {&DDRF, &PINF, &PORTF, 1}, // F1 22 + {&DDRF, &PINF, &PORTF, 0}, // F0 23 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) +// Teensy++ 1.0 & 2.0 + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 1; +uint8_t const SCL_PIN = 0; + +// SPI port +uint8_t const SS_PIN = 20; +uint8_t const MOSI_PIN = 22; +uint8_t const MISO_PIN = 23; +uint8_t const SCK_PIN = 21; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRE, &PINE, &PORTE, 0}, // E0 8 + {&DDRE, &PINE, &PORTE, 1}, // E1 9 + {&DDRC, &PINC, &PORTC, 0}, // C0 10 + {&DDRC, &PINC, &PORTC, 1}, // C1 11 + {&DDRC, &PINC, &PORTC, 2}, // C2 12 + {&DDRC, &PINC, &PORTC, 3}, // C3 13 + {&DDRC, &PINC, &PORTC, 4}, // C4 14 + {&DDRC, &PINC, &PORTC, 5}, // C5 15 + {&DDRC, &PINC, &PORTC, 6}, // C6 16 + {&DDRC, &PINC, &PORTC, 7}, // C7 17 + {&DDRE, &PINE, &PORTE, 6}, // E6 18 + {&DDRE, &PINE, &PORTE, 7}, // E7 19 + {&DDRB, &PINB, &PORTB, 0}, // B0 20 + {&DDRB, &PINB, &PORTB, 1}, // B1 21 + {&DDRB, &PINB, &PORTB, 2}, // B2 22 + {&DDRB, &PINB, &PORTB, 3}, // B3 23 + {&DDRB, &PINB, &PORTB, 4}, // B4 24 + {&DDRB, &PINB, &PORTB, 5}, // B5 25 + {&DDRB, &PINB, &PORTB, 6}, // B6 26 + {&DDRB, &PINB, &PORTB, 7}, // B7 27 + {&DDRA, &PINA, &PORTA, 0}, // A0 28 + {&DDRA, &PINA, &PORTA, 1}, // A1 29 + {&DDRA, &PINA, &PORTA, 2}, // A2 30 + {&DDRA, &PINA, &PORTA, 3}, // A3 31 + {&DDRA, &PINA, &PORTA, 4}, // A4 32 + {&DDRA, &PINA, &PORTA, 5}, // A5 33 + {&DDRA, &PINA, &PORTA, 6}, // A6 34 + {&DDRA, &PINA, &PORTA, 7}, // A7 35 + {&DDRE, &PINE, &PORTE, 4}, // E4 36 + {&DDRE, &PINE, &PORTE, 5}, // E5 37 + {&DDRF, &PINF, &PORTF, 0}, // F0 38 + {&DDRF, &PINF, &PORTF, 1}, // F1 39 + {&DDRF, &PINF, &PORTF, 2}, // F2 40 + {&DDRF, &PINF, &PORTF, 3}, // F3 41 + {&DDRF, &PINF, &PORTF, 4}, // F4 42 + {&DDRF, &PINF, &PORTF, 5}, // F5 43 + {&DDRF, &PINF, &PORTF, 6}, // F6 44 + {&DDRF, &PINF, &PORTF, 7} // F7 45 +}; +//------------------------------------------------------------------------------ +#else // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +// 168 and 328 Arduinos + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 18; +uint8_t const SCL_PIN = 19; + +// SPI port +uint8_t const SS_PIN = 10; +uint8_t const MOSI_PIN = 11; +uint8_t const MISO_PIN = 12; +uint8_t const SCK_PIN = 13; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRB, &PINB, &PORTB, 0}, // B0 8 + {&DDRB, &PINB, &PORTB, 1}, // B1 9 + {&DDRB, &PINB, &PORTB, 2}, // B2 10 + {&DDRB, &PINB, &PORTB, 3}, // B3 11 + {&DDRB, &PINB, &PORTB, 4}, // B4 12 + {&DDRB, &PINB, &PORTB, 5}, // B5 13 + {&DDRC, &PINC, &PORTC, 0}, // C0 14 + {&DDRC, &PINC, &PORTC, 1}, // C1 15 + {&DDRC, &PINC, &PORTC, 2}, // C2 16 + {&DDRC, &PINC, &PORTC, 3}, // C3 17 + {&DDRC, &PINC, &PORTC, 4}, // C4 18 + {&DDRC, &PINC, &PORTC, 5} // C5 19 +}; +#endif // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +//------------------------------------------------------------------------------ +static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t); + +uint8_t badPinNumber(void) + __attribute__((error("Pin number is too large or not a constant"))); + +static inline __attribute__((always_inline)) + uint8_t getPinMode(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void setPinMode(uint8_t pin, uint8_t mode) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (mode) { + *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +static inline __attribute__((always_inline)) + uint8_t fastDigitalRead(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void fastDigitalWrite(uint8_t pin, uint8_t value) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (value) { + *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +#endif // Sd2PinMap_h + +#else +#error Architecture or board not supported. +#endif diff --git a/libraries/SD/utility/SdFat.h b/libraries/SD/utility/SdFat.h index 89c244418a6..4333ef1f202 100644 --- a/libraries/SD/utility/SdFat.h +++ b/libraries/SD/utility/SdFat.h @@ -1,551 +1,551 @@ -/* Arduino SdFat Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ -#ifndef SdFat_h -#define SdFat_h -/** - * \file - * SdFile and SdVolume classes - */ -#ifdef __AVR__ -#include -#endif -#include "Sd2Card.h" -#include "FatStructs.h" -#include "Print.h" -//------------------------------------------------------------------------------ -/** - * Allow use of deprecated functions if non-zero - */ -#define ALLOW_DEPRECATED_FUNCTIONS 1 -//------------------------------------------------------------------------------ -// forward declaration since SdVolume is used in SdFile -class SdVolume; -//============================================================================== -// SdFile class - -// flags for ls() -/** ls() flag to print modify date */ -uint8_t const LS_DATE = 1; -/** ls() flag to print file size */ -uint8_t const LS_SIZE = 2; -/** ls() flag for recursive list of subdirectories */ -uint8_t const LS_R = 4; - -// use the gnu style oflag in open() -/** open() oflag for reading */ -uint8_t const O_READ = 0X01; -/** open() oflag - same as O_READ */ -uint8_t const O_RDONLY = O_READ; -/** open() oflag for write */ -uint8_t const O_WRITE = 0X02; -/** open() oflag - same as O_WRITE */ -uint8_t const O_WRONLY = O_WRITE; -/** open() oflag for reading and writing */ -uint8_t const O_RDWR = (O_READ | O_WRITE); -/** open() oflag mask for access modes */ -uint8_t const O_ACCMODE = (O_READ | O_WRITE); -/** The file offset shall be set to the end of the file prior to each write. */ -uint8_t const O_APPEND = 0X04; -/** synchronous writes - call sync() after each write */ -uint8_t const O_SYNC = 0X08; -/** create the file if nonexistent */ -uint8_t const O_CREAT = 0X10; -/** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ -uint8_t const O_EXCL = 0X20; -/** truncate the file to zero length */ -uint8_t const O_TRUNC = 0X40; - -// flags for timestamp -/** set the file's last access date */ -uint8_t const T_ACCESS = 1; -/** set the file's creation date and time */ -uint8_t const T_CREATE = 2; -/** Set the file's write date and time */ -uint8_t const T_WRITE = 4; -// values for type_ -/** This SdFile has not been opened. */ -uint8_t const FAT_FILE_TYPE_CLOSED = 0; -/** SdFile for a file */ -uint8_t const FAT_FILE_TYPE_NORMAL = 1; -/** SdFile for a FAT16 root directory */ -uint8_t const FAT_FILE_TYPE_ROOT16 = 2; -/** SdFile for a FAT32 root directory */ -uint8_t const FAT_FILE_TYPE_ROOT32 = 3; -/** SdFile for a subdirectory */ -uint8_t const FAT_FILE_TYPE_SUBDIR = 4; -/** Test value for directory type */ -uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16; - -/** date field for FAT directory entry */ -static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) { - return (year - 1980) << 9 | month << 5 | day; -} -/** year part of FAT directory date field */ -static inline uint16_t FAT_YEAR(uint16_t fatDate) { - return 1980 + (fatDate >> 9); -} -/** month part of FAT directory date field */ -static inline uint8_t FAT_MONTH(uint16_t fatDate) { - return (fatDate >> 5) & 0XF; -} -/** day part of FAT directory date field */ -static inline uint8_t FAT_DAY(uint16_t fatDate) { - return fatDate & 0X1F; -} -/** time field for FAT directory entry */ -static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) { - return hour << 11 | minute << 5 | second >> 1; -} -/** hour part of FAT directory time field */ -static inline uint8_t FAT_HOUR(uint16_t fatTime) { - return fatTime >> 11; -} -/** minute part of FAT directory time field */ -static inline uint8_t FAT_MINUTE(uint16_t fatTime) { - return(fatTime >> 5) & 0X3F; -} -/** second part of FAT directory time field */ -static inline uint8_t FAT_SECOND(uint16_t fatTime) { - return 2*(fatTime & 0X1F); -} -/** Default date for file timestamps is 1 Jan 2000 */ -uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; -/** Default time for file timestamp is 1 am */ -uint16_t const FAT_DEFAULT_TIME = (1 << 11); -//------------------------------------------------------------------------------ -/** - * \class SdFile - * \brief Access FAT16 and FAT32 files on SD and SDHC cards. - */ -class SdFile : public Print { - public: - /** Create an instance of SdFile. */ - SdFile(void) : type_(FAT_FILE_TYPE_CLOSED) {} - /** - * writeError is set to true if an error occurs during a write(). - * Set writeError to false before calling print() and/or write() and check - * for true after calls to print() and/or write(). - */ - //bool writeError; - /** - * Cancel unbuffered reads for this file. - * See setUnbufferedRead() - */ - void clearUnbufferedRead(void) { - flags_ &= ~F_FILE_UNBUFFERED_READ; - } - uint8_t close(void); - uint8_t contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); - uint8_t createContiguous(SdFile* dirFile, - const char* fileName, uint32_t size); - /** \return The current cluster number for a file or directory. */ - uint32_t curCluster(void) const {return curCluster_;} - /** \return The current position for a file or directory. */ - uint32_t curPosition(void) const {return curPosition_;} - /** - * Set the date/time callback function - * - * \param[in] dateTime The user's call back function. The callback - * function is of the form: - * - * \code - * void dateTime(uint16_t* date, uint16_t* time) { - * uint16_t year; - * uint8_t month, day, hour, minute, second; - * - * // User gets date and time from GPS or real-time clock here - * - * // return date using FAT_DATE macro to format fields - * *date = FAT_DATE(year, month, day); - * - * // return time using FAT_TIME macro to format fields - * *time = FAT_TIME(hour, minute, second); - * } - * \endcode - * - * Sets the function that is called when a file is created or when - * a file's directory entry is modified by sync(). All timestamps, - * access, creation, and modify, are set when a file is created. - * sync() maintains the last access date and last modify date/time. - * - * See the timestamp() function. - */ - static void dateTimeCallback( - void (*dateTime)(uint16_t* date, uint16_t* time)) { - dateTime_ = dateTime; - } - /** - * Cancel the date/time callback function. - */ - static void dateTimeCallbackCancel(void) { - // use explicit zero since NULL is not defined for Sanguino - dateTime_ = 0; - } - /** \return Address of the block that contains this file's directory. */ - uint32_t dirBlock(void) const {return dirBlock_;} - uint8_t dirEntry(dir_t* dir); - /** \return Index of this file's directory in the block dirBlock. */ - uint8_t dirIndex(void) const {return dirIndex_;} - static void dirName(const dir_t& dir, char* name); - /** \return The total number of bytes in a file or directory. */ - uint32_t fileSize(void) const {return fileSize_;} - /** \return The first cluster number for a file or directory. */ - uint32_t firstCluster(void) const {return firstCluster_;} - /** \return True if this is a SdFile for a directory else false. */ - uint8_t isDir(void) const {return type_ >= FAT_FILE_TYPE_MIN_DIR;} - /** \return True if this is a SdFile for a file else false. */ - uint8_t isFile(void) const {return type_ == FAT_FILE_TYPE_NORMAL;} - /** \return True if this is a SdFile for an open file/directory else false. */ - uint8_t isOpen(void) const {return type_ != FAT_FILE_TYPE_CLOSED;} - /** \return True if this is a SdFile for a subdirectory else false. */ - uint8_t isSubDir(void) const {return type_ == FAT_FILE_TYPE_SUBDIR;} - /** \return True if this is a SdFile for the root directory. */ - uint8_t isRoot(void) const { - return type_ == FAT_FILE_TYPE_ROOT16 || type_ == FAT_FILE_TYPE_ROOT32; - } - void ls(uint8_t flags = 0, uint8_t indent = 0); - uint8_t makeDir(SdFile* dir, const char* dirName); - uint8_t open(SdFile* dirFile, uint16_t index, uint8_t oflag); - uint8_t open(SdFile* dirFile, const char* fileName, uint8_t oflag); - - uint8_t openRoot(SdVolume* vol); - static void printDirName(const dir_t& dir, uint8_t width); - static void printFatDate(uint16_t fatDate); - static void printFatTime(uint16_t fatTime); - static void printTwoDigits(uint8_t v); - /** - * Read the next byte from a file. - * - * \return For success read returns the next byte in the file as an int. - * If an error occurs or end of file is reached -1 is returned. - */ - int16_t read(void) { - uint8_t b; - return read(&b, 1) == 1 ? b : -1; - } - int16_t read(void* buf, uint16_t nbyte); - int8_t readDir(dir_t* dir); - static uint8_t remove(SdFile* dirFile, const char* fileName); - uint8_t remove(void); - /** Set the file's current position to zero. */ - void rewind(void) { - curPosition_ = curCluster_ = 0; - } - uint8_t rmDir(void); - uint8_t rmRfStar(void); - /** Set the files position to current position + \a pos. See seekSet(). */ - uint8_t seekCur(uint32_t pos) { - return seekSet(curPosition_ + pos); - } - /** - * Set the files current position to end of file. Useful to position - * a file for append. See seekSet(). - */ - uint8_t seekEnd(void) {return seekSet(fileSize_);} - uint8_t seekSet(uint32_t pos); - /** - * Use unbuffered reads to access this file. Used with Wave - * Shield ISR. Used with Sd2Card::partialBlockRead() in WaveRP. - * - * Not recommended for normal applications. - */ - void setUnbufferedRead(void) { - if (isFile()) flags_ |= F_FILE_UNBUFFERED_READ; - } - uint8_t timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, - uint8_t hour, uint8_t minute, uint8_t second); - uint8_t sync(void); - /** Type of this SdFile. You should use isFile() or isDir() instead of type() - * if possible. - * - * \return The file or directory type. - */ - uint8_t type(void) const {return type_;} - uint8_t truncate(uint32_t size); - /** \return Unbuffered read flag. */ - uint8_t unbufferedRead(void) const { - return flags_ & F_FILE_UNBUFFERED_READ; - } - /** \return SdVolume that contains this file. */ - SdVolume* volume(void) const {return vol_;} - size_t write(uint8_t b); - size_t write(const void* buf, uint16_t nbyte); - size_t write(const char* str); -#ifdef __AVR__ - void write_P(PGM_P str); - void writeln_P(PGM_P str); -#endif -//------------------------------------------------------------------------------ -#if ALLOW_DEPRECATED_FUNCTIONS -// Deprecated functions - suppress cpplint warnings with NOLINT comment - /** \deprecated Use: - * uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); - */ - uint8_t contiguousRange(uint32_t& bgnBlock, uint32_t& endBlock) { // NOLINT - return contiguousRange(&bgnBlock, &endBlock); - } - /** \deprecated Use: - * uint8_t SdFile::createContiguous(SdFile* dirFile, - * const char* fileName, uint32_t size) - */ - uint8_t createContiguous(SdFile& dirFile, // NOLINT - const char* fileName, uint32_t size) { - return createContiguous(&dirFile, fileName, size); - } - - /** - * \deprecated Use: - * static void SdFile::dateTimeCallback( - * void (*dateTime)(uint16_t* date, uint16_t* time)); - */ - static void dateTimeCallback( - void (*dateTime)(uint16_t& date, uint16_t& time)) { // NOLINT - oldDateTime_ = dateTime; - dateTime_ = dateTime ? oldToNew : 0; - } - /** \deprecated Use: uint8_t SdFile::dirEntry(dir_t* dir); */ - uint8_t dirEntry(dir_t& dir) {return dirEntry(&dir);} // NOLINT - /** \deprecated Use: - * uint8_t SdFile::makeDir(SdFile* dir, const char* dirName); - */ - uint8_t makeDir(SdFile& dir, const char* dirName) { // NOLINT - return makeDir(&dir, dirName); - } - /** \deprecated Use: - * uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag); - */ - uint8_t open(SdFile& dirFile, // NOLINT - const char* fileName, uint8_t oflag) { - return open(&dirFile, fileName, oflag); - } - /** \deprecated Do not use in new apps */ - uint8_t open(SdFile& dirFile, const char* fileName) { // NOLINT - return open(dirFile, fileName, O_RDWR); - } - /** \deprecated Use: - * uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag); - */ - uint8_t open(SdFile& dirFile, uint16_t index, uint8_t oflag) { // NOLINT - return open(&dirFile, index, oflag); - } - /** \deprecated Use: uint8_t SdFile::openRoot(SdVolume* vol); */ - uint8_t openRoot(SdVolume& vol) {return openRoot(&vol);} // NOLINT - - /** \deprecated Use: int8_t SdFile::readDir(dir_t* dir); */ - int8_t readDir(dir_t& dir) {return readDir(&dir);} // NOLINT - /** \deprecated Use: - * static uint8_t SdFile::remove(SdFile* dirFile, const char* fileName); - */ - static uint8_t remove(SdFile& dirFile, const char* fileName) { // NOLINT - return remove(&dirFile, fileName); - } -//------------------------------------------------------------------------------ -// rest are private - private: - static void (*oldDateTime_)(uint16_t& date, uint16_t& time); // NOLINT - static void oldToNew(uint16_t* date, uint16_t* time) { - uint16_t d; - uint16_t t; - oldDateTime_(d, t); - *date = d; - *time = t; - } -#endif // ALLOW_DEPRECATED_FUNCTIONS - private: - // bits defined in flags_ - // should be 0XF - static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC); - // available bits - static uint8_t const F_UNUSED = 0X30; - // use unbuffered SD read - static uint8_t const F_FILE_UNBUFFERED_READ = 0X40; - // sync of directory entry required - static uint8_t const F_FILE_DIR_DIRTY = 0X80; - -// make sure F_OFLAG is ok -#if ((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG) -#error flags_ bits conflict -#endif // flags_ bits - - // private data - uint8_t flags_; // See above for definition of flags_ bits - uint8_t type_; // type of file see above for values - uint32_t curCluster_; // cluster for current file position - uint32_t curPosition_; // current file position in bytes from beginning - uint32_t dirBlock_; // SD block that contains directory entry for file - uint8_t dirIndex_; // index of entry in dirBlock 0 <= dirIndex_ <= 0XF - uint32_t fileSize_; // file size in bytes - uint32_t firstCluster_; // first cluster of file - SdVolume* vol_; // volume where file is located - - // private functions - uint8_t addCluster(void); - uint8_t addDirCluster(void); - dir_t* cacheDirEntry(uint8_t action); - static void (*dateTime_)(uint16_t* date, uint16_t* time); - static uint8_t make83Name(const char* str, uint8_t* name); - uint8_t openCachedEntry(uint8_t cacheIndex, uint8_t oflags); - dir_t* readDirCache(void); -}; -//============================================================================== -// SdVolume class -/** - * \brief Cache for an SD data block - */ -union cache_t { - /** Used to access cached file data blocks. */ - uint8_t data[512]; - /** Used to access cached FAT16 entries. */ - uint16_t fat16[256]; - /** Used to access cached FAT32 entries. */ - uint32_t fat32[128]; - /** Used to access cached directory entries. */ - dir_t dir[16]; - /** Used to access a cached MasterBoot Record. */ - mbr_t mbr; - /** Used to access to a cached FAT boot sector. */ - fbs_t fbs; -}; -//------------------------------------------------------------------------------ -/** - * \class SdVolume - * \brief Access FAT16 and FAT32 volumes on SD and SDHC cards. - */ -class SdVolume { - public: - /** Create an instance of SdVolume */ - SdVolume(void) :allocSearchStart_(2), fatType_(0) {} - /** Clear the cache and returns a pointer to the cache. Used by the WaveRP - * recorder to do raw write to the SD card. Not for normal apps. - */ - static uint8_t* cacheClear(void) { - cacheFlush(); - cacheBlockNumber_ = 0XFFFFFFFF; - return cacheBuffer_.data; - } - /** - * Initialize a FAT volume. Try partition one first then try super - * floppy format. - * - * \param[in] dev The Sd2Card where the volume is located. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. Reasons for - * failure include not finding a valid partition, not finding a valid - * FAT file system or an I/O error. - */ - uint8_t init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0);} - uint8_t init(Sd2Card* dev, uint8_t part); - - // inline functions that return volume info - /** \return The volume's cluster size in blocks. */ - uint8_t blocksPerCluster(void) const {return blocksPerCluster_;} - /** \return The number of blocks in one FAT. */ - uint32_t blocksPerFat(void) const {return blocksPerFat_;} - /** \return The total number of clusters in the volume. */ - uint32_t clusterCount(void) const {return clusterCount_;} - /** \return The shift count required to multiply by blocksPerCluster. */ - uint8_t clusterSizeShift(void) const {return clusterSizeShift_;} - /** \return The logical block number for the start of file data. */ - uint32_t dataStartBlock(void) const {return dataStartBlock_;} - /** \return The number of FAT structures on the volume. */ - uint8_t fatCount(void) const {return fatCount_;} - /** \return The logical block number for the start of the first FAT. */ - uint32_t fatStartBlock(void) const {return fatStartBlock_;} - /** \return The FAT type of the volume. Values are 12, 16 or 32. */ - uint8_t fatType(void) const {return fatType_;} - /** \return The number of entries in the root directory for FAT16 volumes. */ - uint32_t rootDirEntryCount(void) const {return rootDirEntryCount_;} - /** \return The logical block number for the start of the root directory - on FAT16 volumes or the first cluster number on FAT32 volumes. */ - uint32_t rootDirStart(void) const {return rootDirStart_;} - /** return a pointer to the Sd2Card object for this volume */ - static Sd2Card* sdCard(void) {return sdCard_;} -//------------------------------------------------------------------------------ -#if ALLOW_DEPRECATED_FUNCTIONS - // Deprecated functions - suppress cpplint warnings with NOLINT comment - /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev); */ - uint8_t init(Sd2Card& dev) {return init(&dev);} // NOLINT - - /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev, uint8_t vol); */ - uint8_t init(Sd2Card& dev, uint8_t part) { // NOLINT - return init(&dev, part); - } -#endif // ALLOW_DEPRECATED_FUNCTIONS -//------------------------------------------------------------------------------ - private: - // Allow SdFile access to SdVolume private data. - friend class SdFile; - - // value for action argument in cacheRawBlock to indicate read from cache - static uint8_t const CACHE_FOR_READ = 0; - // value for action argument in cacheRawBlock to indicate cache dirty - static uint8_t const CACHE_FOR_WRITE = 1; - - static cache_t cacheBuffer_; // 512 byte cache for device blocks - static uint32_t cacheBlockNumber_; // Logical number of block in the cache - static Sd2Card* sdCard_; // Sd2Card object for cache - static uint8_t cacheDirty_; // cacheFlush() will write block if true - static uint32_t cacheMirrorBlock_; // block number for mirror FAT -// - uint32_t allocSearchStart_; // start cluster for alloc search - uint8_t blocksPerCluster_; // cluster size in blocks - uint32_t blocksPerFat_; // FAT size in blocks - uint32_t clusterCount_; // clusters in one FAT - uint8_t clusterSizeShift_; // shift to convert cluster count to block count - uint32_t dataStartBlock_; // first data block number - uint8_t fatCount_; // number of FATs on volume - uint32_t fatStartBlock_; // start block for first FAT - uint8_t fatType_; // volume type (12, 16, OR 32) - uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir - uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 - //---------------------------------------------------------------------------- - uint8_t allocContiguous(uint32_t count, uint32_t* curCluster); - uint8_t blockOfCluster(uint32_t position) const { - return (position >> 9) & (blocksPerCluster_ - 1);} - uint32_t clusterStartBlock(uint32_t cluster) const { - return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} - uint32_t blockNumber(uint32_t cluster, uint32_t position) const { - return clusterStartBlock(cluster) + blockOfCluster(position);} - static uint8_t cacheFlush(void); - static uint8_t cacheRawBlock(uint32_t blockNumber, uint8_t action); - static void cacheSetDirty(void) {cacheDirty_ |= CACHE_FOR_WRITE;} - static uint8_t cacheZeroBlock(uint32_t blockNumber); - uint8_t chainSize(uint32_t beginCluster, uint32_t* size) const; - uint8_t fatGet(uint32_t cluster, uint32_t* value) const; - uint8_t fatPut(uint32_t cluster, uint32_t value); - uint8_t fatPutEOC(uint32_t cluster) { - return fatPut(cluster, 0x0FFFFFFF); - } - uint8_t freeChain(uint32_t cluster); - uint8_t isEOC(uint32_t cluster) const { - return cluster >= (fatType_ == 16 ? FAT16EOC_MIN : FAT32EOC_MIN); - } - uint8_t readBlock(uint32_t block, uint8_t* dst) { - return sdCard_->readBlock(block, dst);} - uint8_t readData(uint32_t block, uint16_t offset, - uint16_t count, uint8_t* dst) { - return sdCard_->readData(block, offset, count, dst); - } - uint8_t writeBlock(uint32_t block, const uint8_t* dst) { - return sdCard_->writeBlock(block, dst); - } -}; -#endif // SdFat_h +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFat_h +#define SdFat_h +/** + * \file + * SdFile and SdVolume classes + */ +#ifdef __AVR__ +#include +#endif +#include "Sd2Card.h" +#include "FatStructs.h" +#include "Print.h" +//------------------------------------------------------------------------------ +/** + * Allow use of deprecated functions if non-zero + */ +#define ALLOW_DEPRECATED_FUNCTIONS 1 +//------------------------------------------------------------------------------ +// forward declaration since SdVolume is used in SdFile +class SdVolume; +//============================================================================== +// SdFile class + +// flags for ls() +/** ls() flag to print modify date */ +uint8_t const LS_DATE = 1; +/** ls() flag to print file size */ +uint8_t const LS_SIZE = 2; +/** ls() flag for recursive list of subdirectories */ +uint8_t const LS_R = 4; + +// use the gnu style oflag in open() +/** open() oflag for reading */ +uint8_t const O_READ = 0X01; +/** open() oflag - same as O_READ */ +uint8_t const O_RDONLY = O_READ; +/** open() oflag for write */ +uint8_t const O_WRITE = 0X02; +/** open() oflag - same as O_WRITE */ +uint8_t const O_WRONLY = O_WRITE; +/** open() oflag for reading and writing */ +uint8_t const O_RDWR = (O_READ | O_WRITE); +/** open() oflag mask for access modes */ +uint8_t const O_ACCMODE = (O_READ | O_WRITE); +/** The file offset shall be set to the end of the file prior to each write. */ +uint8_t const O_APPEND = 0X04; +/** synchronous writes - call sync() after each write */ +uint8_t const O_SYNC = 0X08; +/** create the file if nonexistent */ +uint8_t const O_CREAT = 0X10; +/** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ +uint8_t const O_EXCL = 0X20; +/** truncate the file to zero length */ +uint8_t const O_TRUNC = 0X40; + +// flags for timestamp +/** set the file's last access date */ +uint8_t const T_ACCESS = 1; +/** set the file's creation date and time */ +uint8_t const T_CREATE = 2; +/** Set the file's write date and time */ +uint8_t const T_WRITE = 4; +// values for type_ +/** This SdFile has not been opened. */ +uint8_t const FAT_FILE_TYPE_CLOSED = 0; +/** SdFile for a file */ +uint8_t const FAT_FILE_TYPE_NORMAL = 1; +/** SdFile for a FAT16 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT16 = 2; +/** SdFile for a FAT32 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT32 = 3; +/** SdFile for a subdirectory */ +uint8_t const FAT_FILE_TYPE_SUBDIR = 4; +/** Test value for directory type */ +uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16; + +/** date field for FAT directory entry */ +static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) { + return (year - 1980) << 9 | month << 5 | day; +} +/** year part of FAT directory date field */ +static inline uint16_t FAT_YEAR(uint16_t fatDate) { + return 1980 + (fatDate >> 9); +} +/** month part of FAT directory date field */ +static inline uint8_t FAT_MONTH(uint16_t fatDate) { + return (fatDate >> 5) & 0XF; +} +/** day part of FAT directory date field */ +static inline uint8_t FAT_DAY(uint16_t fatDate) { + return fatDate & 0X1F; +} +/** time field for FAT directory entry */ +static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) { + return hour << 11 | minute << 5 | second >> 1; +} +/** hour part of FAT directory time field */ +static inline uint8_t FAT_HOUR(uint16_t fatTime) { + return fatTime >> 11; +} +/** minute part of FAT directory time field */ +static inline uint8_t FAT_MINUTE(uint16_t fatTime) { + return(fatTime >> 5) & 0X3F; +} +/** second part of FAT directory time field */ +static inline uint8_t FAT_SECOND(uint16_t fatTime) { + return 2*(fatTime & 0X1F); +} +/** Default date for file timestamps is 1 Jan 2000 */ +uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; +/** Default time for file timestamp is 1 am */ +uint16_t const FAT_DEFAULT_TIME = (1 << 11); +//------------------------------------------------------------------------------ +/** + * \class SdFile + * \brief Access FAT16 and FAT32 files on SD and SDHC cards. + */ +class SdFile : public Print { + public: + /** Create an instance of SdFile. */ + SdFile(void) : type_(FAT_FILE_TYPE_CLOSED) {} + /** + * writeError is set to true if an error occurs during a write(). + * Set writeError to false before calling print() and/or write() and check + * for true after calls to print() and/or write(). + */ + //bool writeError; + /** + * Cancel unbuffered reads for this file. + * See setUnbufferedRead() + */ + void clearUnbufferedRead(void) { + flags_ &= ~F_FILE_UNBUFFERED_READ; + } + uint8_t close(void); + uint8_t contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + uint8_t createContiguous(SdFile* dirFile, + const char* fileName, uint32_t size); + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster(void) const {return curCluster_;} + /** \return The current position for a file or directory. */ + uint32_t curPosition(void) const {return curPosition_;} + /** + * Set the date/time callback function + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here + * + * // return date using FAT_DATE macro to format fields + * *date = FAT_DATE(year, month, day); + * + * // return time using FAT_TIME macro to format fields + * *time = FAT_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + * See the timestamp() function. + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t* date, uint16_t* time)) { + dateTime_ = dateTime; + } + /** + * Cancel the date/time callback function. + */ + static void dateTimeCallbackCancel(void) { + // use explicit zero since NULL is not defined for Sanguino + dateTime_ = 0; + } + /** \return Address of the block that contains this file's directory. */ + uint32_t dirBlock(void) const {return dirBlock_;} + uint8_t dirEntry(dir_t* dir); + /** \return Index of this file's directory in the block dirBlock. */ + uint8_t dirIndex(void) const {return dirIndex_;} + static void dirName(const dir_t& dir, char* name); + /** \return The total number of bytes in a file or directory. */ + uint32_t fileSize(void) const {return fileSize_;} + /** \return The first cluster number for a file or directory. */ + uint32_t firstCluster(void) const {return firstCluster_;} + /** \return True if this is a SdFile for a directory else false. */ + uint8_t isDir(void) const {return type_ >= FAT_FILE_TYPE_MIN_DIR;} + /** \return True if this is a SdFile for a file else false. */ + uint8_t isFile(void) const {return type_ == FAT_FILE_TYPE_NORMAL;} + /** \return True if this is a SdFile for an open file/directory else false. */ + uint8_t isOpen(void) const {return type_ != FAT_FILE_TYPE_CLOSED;} + /** \return True if this is a SdFile for a subdirectory else false. */ + uint8_t isSubDir(void) const {return type_ == FAT_FILE_TYPE_SUBDIR;} + /** \return True if this is a SdFile for the root directory. */ + uint8_t isRoot(void) const { + return type_ == FAT_FILE_TYPE_ROOT16 || type_ == FAT_FILE_TYPE_ROOT32; + } + void ls(uint8_t flags = 0, uint8_t indent = 0); + uint8_t makeDir(SdFile* dir, const char* dirName); + uint8_t open(SdFile* dirFile, uint16_t index, uint8_t oflag); + uint8_t open(SdFile* dirFile, const char* fileName, uint8_t oflag); + + uint8_t openRoot(SdVolume* vol); + static void printDirName(const dir_t& dir, uint8_t width); + static void printFatDate(uint16_t fatDate); + static void printFatTime(uint16_t fatTime); + static void printTwoDigits(uint8_t v); + /** + * Read the next byte from a file. + * + * \return For success read returns the next byte in the file as an int. + * If an error occurs or end of file is reached -1 is returned. + */ + int16_t read(void) { + uint8_t b; + return read(&b, 1) == 1 ? b : -1; + } + int16_t read(void* buf, uint16_t nbyte); + int8_t readDir(dir_t* dir); + static uint8_t remove(SdFile* dirFile, const char* fileName); + uint8_t remove(void); + /** Set the file's current position to zero. */ + void rewind(void) { + curPosition_ = curCluster_ = 0; + } + uint8_t rmDir(void); + uint8_t rmRfStar(void); + /** Set the files position to current position + \a pos. See seekSet(). */ + uint8_t seekCur(uint32_t pos) { + return seekSet(curPosition_ + pos); + } + /** + * Set the files current position to end of file. Useful to position + * a file for append. See seekSet(). + */ + uint8_t seekEnd(void) {return seekSet(fileSize_);} + uint8_t seekSet(uint32_t pos); + /** + * Use unbuffered reads to access this file. Used with Wave + * Shield ISR. Used with Sd2Card::partialBlockRead() in WaveRP. + * + * Not recommended for normal applications. + */ + void setUnbufferedRead(void) { + if (isFile()) flags_ |= F_FILE_UNBUFFERED_READ; + } + uint8_t timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, + uint8_t hour, uint8_t minute, uint8_t second); + uint8_t sync(void); + /** Type of this SdFile. You should use isFile() or isDir() instead of type() + * if possible. + * + * \return The file or directory type. + */ + uint8_t type(void) const {return type_;} + uint8_t truncate(uint32_t size); + /** \return Unbuffered read flag. */ + uint8_t unbufferedRead(void) const { + return flags_ & F_FILE_UNBUFFERED_READ; + } + /** \return SdVolume that contains this file. */ + SdVolume* volume(void) const {return vol_;} + size_t write(uint8_t b); + size_t write(const void* buf, uint16_t nbyte); + size_t write(const char* str); +#ifdef __AVR__ + void write_P(PGM_P str); + void writeln_P(PGM_P str); +#endif +//------------------------------------------------------------------------------ +#if ALLOW_DEPRECATED_FUNCTIONS +// Deprecated functions - suppress cpplint warnings with NOLINT comment + /** \deprecated Use: + * uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + */ + uint8_t contiguousRange(uint32_t& bgnBlock, uint32_t& endBlock) { // NOLINT + return contiguousRange(&bgnBlock, &endBlock); + } + /** \deprecated Use: + * uint8_t SdFile::createContiguous(SdFile* dirFile, + * const char* fileName, uint32_t size) + */ + uint8_t createContiguous(SdFile& dirFile, // NOLINT + const char* fileName, uint32_t size) { + return createContiguous(&dirFile, fileName, size); + } + + /** + * \deprecated Use: + * static void SdFile::dateTimeCallback( + * void (*dateTime)(uint16_t* date, uint16_t* time)); + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t& date, uint16_t& time)) { // NOLINT + oldDateTime_ = dateTime; + dateTime_ = dateTime ? oldToNew : 0; + } + /** \deprecated Use: uint8_t SdFile::dirEntry(dir_t* dir); */ + uint8_t dirEntry(dir_t& dir) {return dirEntry(&dir);} // NOLINT + /** \deprecated Use: + * uint8_t SdFile::makeDir(SdFile* dir, const char* dirName); + */ + uint8_t makeDir(SdFile& dir, const char* dirName) { // NOLINT + return makeDir(&dir, dirName); + } + /** \deprecated Use: + * uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag); + */ + uint8_t open(SdFile& dirFile, // NOLINT + const char* fileName, uint8_t oflag) { + return open(&dirFile, fileName, oflag); + } + /** \deprecated Do not use in new apps */ + uint8_t open(SdFile& dirFile, const char* fileName) { // NOLINT + return open(dirFile, fileName, O_RDWR); + } + /** \deprecated Use: + * uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag); + */ + uint8_t open(SdFile& dirFile, uint16_t index, uint8_t oflag) { // NOLINT + return open(&dirFile, index, oflag); + } + /** \deprecated Use: uint8_t SdFile::openRoot(SdVolume* vol); */ + uint8_t openRoot(SdVolume& vol) {return openRoot(&vol);} // NOLINT + + /** \deprecated Use: int8_t SdFile::readDir(dir_t* dir); */ + int8_t readDir(dir_t& dir) {return readDir(&dir);} // NOLINT + /** \deprecated Use: + * static uint8_t SdFile::remove(SdFile* dirFile, const char* fileName); + */ + static uint8_t remove(SdFile& dirFile, const char* fileName) { // NOLINT + return remove(&dirFile, fileName); + } +//------------------------------------------------------------------------------ +// rest are private + private: + static void (*oldDateTime_)(uint16_t& date, uint16_t& time); // NOLINT + static void oldToNew(uint16_t* date, uint16_t* time) { + uint16_t d; + uint16_t t; + oldDateTime_(d, t); + *date = d; + *time = t; + } +#endif // ALLOW_DEPRECATED_FUNCTIONS + private: + // bits defined in flags_ + // should be 0XF + static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC); + // available bits + static uint8_t const F_UNUSED = 0X30; + // use unbuffered SD read + static uint8_t const F_FILE_UNBUFFERED_READ = 0X40; + // sync of directory entry required + static uint8_t const F_FILE_DIR_DIRTY = 0X80; + +// make sure F_OFLAG is ok +#if ((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG) +#error flags_ bits conflict +#endif // flags_ bits + + // private data + uint8_t flags_; // See above for definition of flags_ bits + uint8_t type_; // type of file see above for values + uint32_t curCluster_; // cluster for current file position + uint32_t curPosition_; // current file position in bytes from beginning + uint32_t dirBlock_; // SD block that contains directory entry for file + uint8_t dirIndex_; // index of entry in dirBlock 0 <= dirIndex_ <= 0XF + uint32_t fileSize_; // file size in bytes + uint32_t firstCluster_; // first cluster of file + SdVolume* vol_; // volume where file is located + + // private functions + uint8_t addCluster(void); + uint8_t addDirCluster(void); + dir_t* cacheDirEntry(uint8_t action); + static void (*dateTime_)(uint16_t* date, uint16_t* time); + static uint8_t make83Name(const char* str, uint8_t* name); + uint8_t openCachedEntry(uint8_t cacheIndex, uint8_t oflags); + dir_t* readDirCache(void); +}; +//============================================================================== +// SdVolume class +/** + * \brief Cache for an SD data block + */ +union cache_t { + /** Used to access cached file data blocks. */ + uint8_t data[512]; + /** Used to access cached FAT16 entries. */ + uint16_t fat16[256]; + /** Used to access cached FAT32 entries. */ + uint32_t fat32[128]; + /** Used to access cached directory entries. */ + dir_t dir[16]; + /** Used to access a cached MasterBoot Record. */ + mbr_t mbr; + /** Used to access to a cached FAT boot sector. */ + fbs_t fbs; +}; +//------------------------------------------------------------------------------ +/** + * \class SdVolume + * \brief Access FAT16 and FAT32 volumes on SD and SDHC cards. + */ +class SdVolume { + public: + /** Create an instance of SdVolume */ + SdVolume(void) :allocSearchStart_(2), fatType_(0) {} + /** Clear the cache and returns a pointer to the cache. Used by the WaveRP + * recorder to do raw write to the SD card. Not for normal apps. + */ + static uint8_t* cacheClear(void) { + cacheFlush(); + cacheBlockNumber_ = 0XFFFFFFFF; + return cacheBuffer_.data; + } + /** + * Initialize a FAT volume. Try partition one first then try super + * floppy format. + * + * \param[in] dev The Sd2Card where the volume is located. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system or an I/O error. + */ + uint8_t init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0);} + uint8_t init(Sd2Card* dev, uint8_t part); + + // inline functions that return volume info + /** \return The volume's cluster size in blocks. */ + uint8_t blocksPerCluster(void) const {return blocksPerCluster_;} + /** \return The number of blocks in one FAT. */ + uint32_t blocksPerFat(void) const {return blocksPerFat_;} + /** \return The total number of clusters in the volume. */ + uint32_t clusterCount(void) const {return clusterCount_;} + /** \return The shift count required to multiply by blocksPerCluster. */ + uint8_t clusterSizeShift(void) const {return clusterSizeShift_;} + /** \return The logical block number for the start of file data. */ + uint32_t dataStartBlock(void) const {return dataStartBlock_;} + /** \return The number of FAT structures on the volume. */ + uint8_t fatCount(void) const {return fatCount_;} + /** \return The logical block number for the start of the first FAT. */ + uint32_t fatStartBlock(void) const {return fatStartBlock_;} + /** \return The FAT type of the volume. Values are 12, 16 or 32. */ + uint8_t fatType(void) const {return fatType_;} + /** \return The number of entries in the root directory for FAT16 volumes. */ + uint32_t rootDirEntryCount(void) const {return rootDirEntryCount_;} + /** \return The logical block number for the start of the root directory + on FAT16 volumes or the first cluster number on FAT32 volumes. */ + uint32_t rootDirStart(void) const {return rootDirStart_;} + /** return a pointer to the Sd2Card object for this volume */ + static Sd2Card* sdCard(void) {return sdCard_;} +//------------------------------------------------------------------------------ +#if ALLOW_DEPRECATED_FUNCTIONS + // Deprecated functions - suppress cpplint warnings with NOLINT comment + /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev); */ + uint8_t init(Sd2Card& dev) {return init(&dev);} // NOLINT + + /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev, uint8_t vol); */ + uint8_t init(Sd2Card& dev, uint8_t part) { // NOLINT + return init(&dev, part); + } +#endif // ALLOW_DEPRECATED_FUNCTIONS +//------------------------------------------------------------------------------ + private: + // Allow SdFile access to SdVolume private data. + friend class SdFile; + + // value for action argument in cacheRawBlock to indicate read from cache + static uint8_t const CACHE_FOR_READ = 0; + // value for action argument in cacheRawBlock to indicate cache dirty + static uint8_t const CACHE_FOR_WRITE = 1; + + static cache_t cacheBuffer_; // 512 byte cache for device blocks + static uint32_t cacheBlockNumber_; // Logical number of block in the cache + static Sd2Card* sdCard_; // Sd2Card object for cache + static uint8_t cacheDirty_; // cacheFlush() will write block if true + static uint32_t cacheMirrorBlock_; // block number for mirror FAT +// + uint32_t allocSearchStart_; // start cluster for alloc search + uint8_t blocksPerCluster_; // cluster size in blocks + uint32_t blocksPerFat_; // FAT size in blocks + uint32_t clusterCount_; // clusters in one FAT + uint8_t clusterSizeShift_; // shift to convert cluster count to block count + uint32_t dataStartBlock_; // first data block number + uint8_t fatCount_; // number of FATs on volume + uint32_t fatStartBlock_; // start block for first FAT + uint8_t fatType_; // volume type (12, 16, OR 32) + uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir + uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 + //---------------------------------------------------------------------------- + uint8_t allocContiguous(uint32_t count, uint32_t* curCluster); + uint8_t blockOfCluster(uint32_t position) const { + return (position >> 9) & (blocksPerCluster_ - 1);} + uint32_t clusterStartBlock(uint32_t cluster) const { + return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} + uint32_t blockNumber(uint32_t cluster, uint32_t position) const { + return clusterStartBlock(cluster) + blockOfCluster(position);} + static uint8_t cacheFlush(void); + static uint8_t cacheRawBlock(uint32_t blockNumber, uint8_t action); + static void cacheSetDirty(void) {cacheDirty_ |= CACHE_FOR_WRITE;} + static uint8_t cacheZeroBlock(uint32_t blockNumber); + uint8_t chainSize(uint32_t beginCluster, uint32_t* size) const; + uint8_t fatGet(uint32_t cluster, uint32_t* value) const; + uint8_t fatPut(uint32_t cluster, uint32_t value); + uint8_t fatPutEOC(uint32_t cluster) { + return fatPut(cluster, 0x0FFFFFFF); + } + uint8_t freeChain(uint32_t cluster); + uint8_t isEOC(uint32_t cluster) const { + return cluster >= (fatType_ == 16 ? FAT16EOC_MIN : FAT32EOC_MIN); + } + uint8_t readBlock(uint32_t block, uint8_t* dst) { + return sdCard_->readBlock(block, dst);} + uint8_t readData(uint32_t block, uint16_t offset, + uint16_t count, uint8_t* dst) { + return sdCard_->readData(block, offset, count, dst); + } + uint8_t writeBlock(uint32_t block, const uint8_t* dst) { + return sdCard_->writeBlock(block, dst); + } +}; +#endif // SdFat_h diff --git a/libraries/SD/utility/SdFatUtil.h b/libraries/SD/utility/SdFatUtil.h index d1b4d538f69..0812ca4ba58 100644 --- a/libraries/SD/utility/SdFatUtil.h +++ b/libraries/SD/utility/SdFatUtil.h @@ -1,75 +1,75 @@ -/* Arduino SdFat Library - * Copyright (C) 2008 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ -#ifndef SdFatUtil_h -#define SdFatUtil_h -/** - * \file - * Useful utility functions. - */ -#include -#ifdef __AVR__ -#include -/** Store and print a string in flash memory.*/ -#define PgmPrint(x) SerialPrint_P(PSTR(x)) -/** Store and print a string in flash memory followed by a CR/LF.*/ -#define PgmPrintln(x) SerialPrintln_P(PSTR(x)) -/** Defined so doxygen works for function definitions. */ -#endif -#define NOINLINE __attribute__((noinline,unused)) -#define UNUSEDOK __attribute__((unused)) -//------------------------------------------------------------------------------ -/** Return the number of bytes currently free in RAM. */ -static UNUSEDOK int FreeRam(void) { - extern int __bss_end; - extern int* __brkval; - int free_memory; - if (reinterpret_cast(__brkval) == 0) { - // if no heap use from end of bss section - free_memory = reinterpret_cast(&free_memory) - - reinterpret_cast(&__bss_end); - } else { - // use from top of stack to heap - free_memory = reinterpret_cast(&free_memory) - - reinterpret_cast(__brkval); - } - return free_memory; -} -#ifdef __AVR__ -//------------------------------------------------------------------------------ -/** - * %Print a string in flash memory to the serial port. - * - * \param[in] str Pointer to string stored in flash memory. - */ -static NOINLINE void SerialPrint_P(PGM_P str) { - for (uint8_t c; (c = pgm_read_byte(str)); str++) Serial.write(c); -} -//------------------------------------------------------------------------------ -/** - * %Print a string in flash memory followed by a CR/LF. - * - * \param[in] str Pointer to string stored in flash memory. - */ -static NOINLINE void SerialPrintln_P(PGM_P str) { - SerialPrint_P(str); - Serial.println(); -} -#endif // __AVR__ -#endif // #define SdFatUtil_h +/* Arduino SdFat Library + * Copyright (C) 2008 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFatUtil_h +#define SdFatUtil_h +/** + * \file + * Useful utility functions. + */ +#include +#ifdef __AVR__ +#include +/** Store and print a string in flash memory.*/ +#define PgmPrint(x) SerialPrint_P(PSTR(x)) +/** Store and print a string in flash memory followed by a CR/LF.*/ +#define PgmPrintln(x) SerialPrintln_P(PSTR(x)) +/** Defined so doxygen works for function definitions. */ +#endif +#define NOINLINE __attribute__((noinline,unused)) +#define UNUSEDOK __attribute__((unused)) +//------------------------------------------------------------------------------ +/** Return the number of bytes currently free in RAM. */ +static UNUSEDOK int FreeRam(void) { + extern int __bss_end; + extern int* __brkval; + int free_memory; + if (reinterpret_cast(__brkval) == 0) { + // if no heap use from end of bss section + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(&__bss_end); + } else { + // use from top of stack to heap + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(__brkval); + } + return free_memory; +} +#ifdef __AVR__ +//------------------------------------------------------------------------------ +/** + * %Print a string in flash memory to the serial port. + * + * \param[in] str Pointer to string stored in flash memory. + */ +static NOINLINE void SerialPrint_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) Serial.write(c); +} +//------------------------------------------------------------------------------ +/** + * %Print a string in flash memory followed by a CR/LF. + * + * \param[in] str Pointer to string stored in flash memory. + */ +static NOINLINE void SerialPrintln_P(PGM_P str) { + SerialPrint_P(str); + Serial.println(); +} +#endif // __AVR__ +#endif // #define SdFatUtil_h diff --git a/libraries/SD/utility/SdFatmainpage.h b/libraries/SD/utility/SdFatmainpage.h index 73b3b63bd42..d26cb854c6f 100644 --- a/libraries/SD/utility/SdFatmainpage.h +++ b/libraries/SD/utility/SdFatmainpage.h @@ -1,202 +1,202 @@ -/* Arduino SdFat Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ - -/** -\mainpage Arduino SdFat Library -
Copyright © 2009 by William Greiman -
- -\section Intro Introduction -The Arduino SdFat Library is a minimal implementation of FAT16 and FAT32 -file systems on SD flash memory cards. Standard SD and high capacity -SDHC cards are supported. - -The SdFat only supports short 8.3 names. - -The main classes in SdFat are Sd2Card, SdVolume, and SdFile. - -The Sd2Card class supports access to standard SD cards and SDHC cards. Most -applications will only need to call the Sd2Card::init() member function. - -The SdVolume class supports FAT16 and FAT32 partitions. Most applications -will only need to call the SdVolume::init() member function. - -The SdFile class provides file access functions such as open(), read(), -remove(), write(), close() and sync(). This class supports access to the root -directory and subdirectories. - -A number of example are provided in the SdFat/examples folder. These were -developed to test SdFat and illustrate its use. - -SdFat was developed for high speed data recording. SdFat was used to implement -an audio record/play class, WaveRP, for the Adafruit Wave Shield. This -application uses special Sd2Card calls to write to contiguous files in raw mode. -These functions reduce write latency so that audio can be recorded with the -small amount of RAM in the Arduino. - -\section SDcard SD\SDHC Cards - -Arduinos access SD cards using the cards SPI protocol. PCs, Macs, and -most consumer devices use the 4-bit parallel SD protocol. A card that -functions well on A PC or Mac may not work well on the Arduino. - -Most cards have good SPI read performance but cards vary widely in SPI -write performance. Write performance is limited by how efficiently the -card manages internal erase/remapping operations. The Arduino cannot -optimize writes to reduce erase operations because of its limit RAM. - -SanDisk cards generally have good write performance. They seem to have -more internal RAM buffering than other cards and therefore can limit -the number of flash erase operations that the Arduino forces due to its -limited RAM. - -\section Hardware Hardware Configuration - -SdFat was developed using an - Adafruit Industries - Wave Shield. - -The hardware interface to the SD card should not use a resistor based level -shifter. SdFat sets the SPI bus frequency to 8 MHz which results in signal -rise times that are too slow for the edge detectors in many newer SD card -controllers when resistor voltage dividers are used. - -The 5 to 3.3 V level shifter for 5 V Arduinos should be IC based like the -74HC4050N based circuit shown in the file SdLevel.png. The Adafruit Wave Shield -uses a 74AHC125N. Gravitech sells SD and MicroSD Card Adapters based on the -74LCX245. - -If you are using a resistor based level shifter and are having problems try -setting the SPI bus frequency to 4 MHz. This can be done by using -card.init(SPI_HALF_SPEED) to initialize the SD card. - -\section comment Bugs and Comments - -If you wish to report bugs or have comments, send email to fat16lib@sbcglobal.net. - -\section SdFatClass SdFat Usage - -SdFat uses a slightly restricted form of short names. -Only printable ASCII characters are supported. No characters with code point -values greater than 127 are allowed. Space is not allowed even though space -was allowed in the API of early versions of DOS. - -Short names are limited to 8 characters followed by an optional period (.) -and extension of up to 3 characters. The characters may be any combination -of letters and digits. The following special characters are also allowed: - -$ % ' - _ @ ~ ` ! ( ) { } ^ # & - -Short names are always converted to upper case and their original case -value is lost. - -\note - The Arduino Print class uses character -at a time writes so it was necessary to use a \link SdFile::sync() sync() \endlink -function to control when data is written to the SD card. - -\par -An application which writes to a file using \link Print::print() print()\endlink, -\link Print::println() println() \endlink -or \link SdFile::write write() \endlink must call \link SdFile::sync() sync() \endlink -at the appropriate time to force data and directory information to be written -to the SD Card. Data and directory information are also written to the SD card -when \link SdFile::close() close() \endlink is called. - -\par -Applications must use care calling \link SdFile::sync() sync() \endlink -since 2048 bytes of I/O is required to update file and -directory information. This includes writing the current data block, reading -the block that contains the directory entry for update, writing the directory -block back and reading back the current data block. - -It is possible to open a file with two or more instances of SdFile. A file may -be corrupted if data is written to the file by more than one instance of SdFile. - -\section HowTo How to format SD Cards as FAT Volumes - -You should use a freshly formatted SD card for best performance. FAT -file systems become slower if many files have been created and deleted. -This is because the directory entry for a deleted file is marked as deleted, -but is not deleted. When a new file is created, these entries must be scanned -before creating the file, a flaw in the FAT design. Also files can become -fragmented which causes reads and writes to be slower. - -Microsoft operating systems support removable media formatted with a -Master Boot Record, MBR, or formatted as a super floppy with a FAT Boot Sector -in block zero. - -Microsoft operating systems expect MBR formatted removable media -to have only one partition. The first partition should be used. - -Microsoft operating systems do not support partitioning SD flash cards. -If you erase an SD card with a program like KillDisk, Most versions of -Windows will format the card as a super floppy. - -The best way to restore an SD card's format is to use SDFormatter -which can be downloaded from: - -http://www.sdcard.org/consumers/formatter/ - -SDFormatter aligns flash erase boundaries with file -system structures which reduces write latency and file system overhead. - -SDFormatter does not have an option for FAT type so it may format -small cards as FAT12. - -After the MBR is restored by SDFormatter you may need to reformat small -cards that have been formatted FAT12 to force the volume type to be FAT16. - -If you reformat the SD card with an OS utility, choose a cluster size that -will result in: - -4084 < CountOfClusters && CountOfClusters < 65525 - -The volume will then be FAT16. - -If you are formatting an SD card on OS X or Linux, be sure to use the first -partition. Format this partition with a cluster count in above range. - -\section References References - -Adafruit Industries: - -http://www.adafruit.com/ - -http://www.ladyada.net/make/waveshield/ - -The Arduino site: - -http://www.arduino.cc/ - -For more information about FAT file systems see: - -http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx - -For information about using SD cards as SPI devices see: - -http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf - -The ATmega328 datasheet: - -http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf - - - */ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ + +/** +\mainpage Arduino SdFat Library +
Copyright © 2009 by William Greiman +
+ +\section Intro Introduction +The Arduino SdFat Library is a minimal implementation of FAT16 and FAT32 +file systems on SD flash memory cards. Standard SD and high capacity +SDHC cards are supported. + +The SdFat only supports short 8.3 names. + +The main classes in SdFat are Sd2Card, SdVolume, and SdFile. + +The Sd2Card class supports access to standard SD cards and SDHC cards. Most +applications will only need to call the Sd2Card::init() member function. + +The SdVolume class supports FAT16 and FAT32 partitions. Most applications +will only need to call the SdVolume::init() member function. + +The SdFile class provides file access functions such as open(), read(), +remove(), write(), close() and sync(). This class supports access to the root +directory and subdirectories. + +A number of example are provided in the SdFat/examples folder. These were +developed to test SdFat and illustrate its use. + +SdFat was developed for high speed data recording. SdFat was used to implement +an audio record/play class, WaveRP, for the Adafruit Wave Shield. This +application uses special Sd2Card calls to write to contiguous files in raw mode. +These functions reduce write latency so that audio can be recorded with the +small amount of RAM in the Arduino. + +\section SDcard SD\SDHC Cards + +Arduinos access SD cards using the cards SPI protocol. PCs, Macs, and +most consumer devices use the 4-bit parallel SD protocol. A card that +functions well on A PC or Mac may not work well on the Arduino. + +Most cards have good SPI read performance but cards vary widely in SPI +write performance. Write performance is limited by how efficiently the +card manages internal erase/remapping operations. The Arduino cannot +optimize writes to reduce erase operations because of its limit RAM. + +SanDisk cards generally have good write performance. They seem to have +more internal RAM buffering than other cards and therefore can limit +the number of flash erase operations that the Arduino forces due to its +limited RAM. + +\section Hardware Hardware Configuration + +SdFat was developed using an + Adafruit Industries + Wave Shield. + +The hardware interface to the SD card should not use a resistor based level +shifter. SdFat sets the SPI bus frequency to 8 MHz which results in signal +rise times that are too slow for the edge detectors in many newer SD card +controllers when resistor voltage dividers are used. + +The 5 to 3.3 V level shifter for 5 V Arduinos should be IC based like the +74HC4050N based circuit shown in the file SdLevel.png. The Adafruit Wave Shield +uses a 74AHC125N. Gravitech sells SD and MicroSD Card Adapters based on the +74LCX245. + +If you are using a resistor based level shifter and are having problems try +setting the SPI bus frequency to 4 MHz. This can be done by using +card.init(SPI_HALF_SPEED) to initialize the SD card. + +\section comment Bugs and Comments + +If you wish to report bugs or have comments, send email to fat16lib@sbcglobal.net. + +\section SdFatClass SdFat Usage + +SdFat uses a slightly restricted form of short names. +Only printable ASCII characters are supported. No characters with code point +values greater than 127 are allowed. Space is not allowed even though space +was allowed in the API of early versions of DOS. + +Short names are limited to 8 characters followed by an optional period (.) +and extension of up to 3 characters. The characters may be any combination +of letters and digits. The following special characters are also allowed: + +$ % ' - _ @ ~ ` ! ( ) { } ^ # & + +Short names are always converted to upper case and their original case +value is lost. + +\note + The Arduino Print class uses character +at a time writes so it was necessary to use a \link SdFile::sync() sync() \endlink +function to control when data is written to the SD card. + +\par +An application which writes to a file using \link Print::print() print()\endlink, +\link Print::println() println() \endlink +or \link SdFile::write write() \endlink must call \link SdFile::sync() sync() \endlink +at the appropriate time to force data and directory information to be written +to the SD Card. Data and directory information are also written to the SD card +when \link SdFile::close() close() \endlink is called. + +\par +Applications must use care calling \link SdFile::sync() sync() \endlink +since 2048 bytes of I/O is required to update file and +directory information. This includes writing the current data block, reading +the block that contains the directory entry for update, writing the directory +block back and reading back the current data block. + +It is possible to open a file with two or more instances of SdFile. A file may +be corrupted if data is written to the file by more than one instance of SdFile. + +\section HowTo How to format SD Cards as FAT Volumes + +You should use a freshly formatted SD card for best performance. FAT +file systems become slower if many files have been created and deleted. +This is because the directory entry for a deleted file is marked as deleted, +but is not deleted. When a new file is created, these entries must be scanned +before creating the file, a flaw in the FAT design. Also files can become +fragmented which causes reads and writes to be slower. + +Microsoft operating systems support removable media formatted with a +Master Boot Record, MBR, or formatted as a super floppy with a FAT Boot Sector +in block zero. + +Microsoft operating systems expect MBR formatted removable media +to have only one partition. The first partition should be used. + +Microsoft operating systems do not support partitioning SD flash cards. +If you erase an SD card with a program like KillDisk, Most versions of +Windows will format the card as a super floppy. + +The best way to restore an SD card's format is to use SDFormatter +which can be downloaded from: + +http://www.sdcard.org/consumers/formatter/ + +SDFormatter aligns flash erase boundaries with file +system structures which reduces write latency and file system overhead. + +SDFormatter does not have an option for FAT type so it may format +small cards as FAT12. + +After the MBR is restored by SDFormatter you may need to reformat small +cards that have been formatted FAT12 to force the volume type to be FAT16. + +If you reformat the SD card with an OS utility, choose a cluster size that +will result in: + +4084 < CountOfClusters && CountOfClusters < 65525 + +The volume will then be FAT16. + +If you are formatting an SD card on OS X or Linux, be sure to use the first +partition. Format this partition with a cluster count in above range. + +\section References References + +Adafruit Industries: + +http://www.adafruit.com/ + +http://www.ladyada.net/make/waveshield/ + +The Arduino site: + +http://www.arduino.cc/ + +For more information about FAT file systems see: + +http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + +For information about using SD cards as SPI devices see: + +http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf + +The ATmega328 datasheet: + +http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf + + + */ diff --git a/libraries/SD/utility/SdFile.cpp b/libraries/SD/utility/SdFile.cpp index c19500e59ed..83b0e736ca3 100644 --- a/libraries/SD/utility/SdFile.cpp +++ b/libraries/SD/utility/SdFile.cpp @@ -1,1263 +1,1263 @@ -/* Arduino SdFat Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ -#include -#ifdef __AVR__ -#include -#endif -#include -//------------------------------------------------------------------------------ -// callback function for date/time -void (*SdFile::dateTime_)(uint16_t* date, uint16_t* time) = NULL; - -#if ALLOW_DEPRECATED_FUNCTIONS -// suppress cpplint warnings with NOLINT comment -void (*SdFile::oldDateTime_)(uint16_t& date, uint16_t& time) = NULL; // NOLINT -#endif // ALLOW_DEPRECATED_FUNCTIONS -//------------------------------------------------------------------------------ -// add a cluster to a file -uint8_t SdFile::addCluster() { - if (!vol_->allocContiguous(1, &curCluster_)) return false; - - // if first cluster of file link to directory entry - if (firstCluster_ == 0) { - firstCluster_ = curCluster_; - flags_ |= F_FILE_DIR_DIRTY; - } - return true; -} -//------------------------------------------------------------------------------ -// Add a cluster to a directory file and zero the cluster. -// return with first block of cluster in the cache -uint8_t SdFile::addDirCluster(void) { - if (!addCluster()) return false; - - // zero data in cluster insure first cluster is in cache - uint32_t block = vol_->clusterStartBlock(curCluster_); - for (uint8_t i = vol_->blocksPerCluster_; i != 0; i--) { - if (!SdVolume::cacheZeroBlock(block + i - 1)) return false; - } - // Increase directory file size by cluster size - fileSize_ += 512UL << vol_->clusterSizeShift_; - return true; -} -//------------------------------------------------------------------------------ -// cache a file's directory entry -// return pointer to cached entry or null for failure -dir_t* SdFile::cacheDirEntry(uint8_t action) { - if (!SdVolume::cacheRawBlock(dirBlock_, action)) return NULL; - return SdVolume::cacheBuffer_.dir + dirIndex_; -} -//------------------------------------------------------------------------------ -/** - * Close a file and force cached data and directory information - * to be written to the storage device. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include no file is open or an I/O error. - */ -uint8_t SdFile::close(void) { - if (!sync())return false; - type_ = FAT_FILE_TYPE_CLOSED; - return true; -} -//------------------------------------------------------------------------------ -/** - * Check for contiguous file and return its raw block range. - * - * \param[out] bgnBlock the first block address for the file. - * \param[out] endBlock the last block address for the file. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include file is not contiguous, file has zero length - * or an I/O error occurred. - */ -uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { - // error if no blocks - if (firstCluster_ == 0) return false; - - for (uint32_t c = firstCluster_; ; c++) { - uint32_t next; - if (!vol_->fatGet(c, &next)) return false; - - // check for contiguous - if (next != (c + 1)) { - // error if not end of chain - if (!vol_->isEOC(next)) return false; - *bgnBlock = vol_->clusterStartBlock(firstCluster_); - *endBlock = vol_->clusterStartBlock(c) - + vol_->blocksPerCluster_ - 1; - return true; - } - } -} -//------------------------------------------------------------------------------ -/** - * Create and open a new contiguous file of a specified size. - * - * \note This function only supports short DOS 8.3 names. - * See open() for more information. - * - * \param[in] dirFile The directory where the file will be created. - * \param[in] fileName A valid DOS 8.3 file name. - * \param[in] size The desired file size. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include \a fileName contains - * an invalid DOS 8.3 file name, the FAT volume has not been initialized, - * a file is already open, the file already exists, the root - * directory is full or an I/O error. - * - */ -uint8_t SdFile::createContiguous(SdFile* dirFile, - const char* fileName, uint32_t size) { - // don't allow zero length file - if (size == 0) return false; - if (!open(dirFile, fileName, O_CREAT | O_EXCL | O_RDWR)) return false; - - // calculate number of clusters needed - uint32_t count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; - - // allocate clusters - if (!vol_->allocContiguous(count, &firstCluster_)) { - remove(); - return false; - } - fileSize_ = size; - - // insure sync() will update dir entry - flags_ |= F_FILE_DIR_DIRTY; - return sync(); -} -//------------------------------------------------------------------------------ -/** - * Return a files directory entry - * - * \param[out] dir Location for return of the files directory entry. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t SdFile::dirEntry(dir_t* dir) { - // make sure fields on SD are correct - if (!sync()) return false; - - // read entry - dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); - if (!p) return false; - - // copy to caller's struct - memcpy(dir, p, sizeof(dir_t)); - return true; -} -//------------------------------------------------------------------------------ -/** - * Format the name field of \a dir into the 13 byte array - * \a name in standard 8.3 short name format. - * - * \param[in] dir The directory structure containing the name. - * \param[out] name A 13 byte char array for the formatted name. - */ -void SdFile::dirName(const dir_t& dir, char* name) { - uint8_t j = 0; - for (uint8_t i = 0; i < 11; i++) { - if (dir.name[i] == ' ')continue; - if (i == 8) name[j++] = '.'; - name[j++] = dir.name[i]; - } - name[j] = 0; -} -//------------------------------------------------------------------------------ -/** List directory contents to Serial. - * - * \param[in] flags The inclusive OR of - * - * LS_DATE - %Print file modification date - * - * LS_SIZE - %Print file size. - * - * LS_R - Recursive list of subdirectories. - * - * \param[in] indent Amount of space before file name. Used for recursive - * list to indicate subdirectory level. - */ -void SdFile::ls(uint8_t flags, uint8_t indent) { - dir_t* p; - - rewind(); - while ((p = readDirCache())) { - // done if past last used entry - if (p->name[0] == DIR_NAME_FREE) break; - - // skip deleted entry and entries for . and .. - if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; - - // only list subdirectories and files - if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; - - // print any indent spaces - for (int8_t i = 0; i < indent; i++) Serial.print(' '); - - // print file name with possible blank fill - printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0); - - // print modify date/time if requested - if (flags & LS_DATE) { - printFatDate(p->lastWriteDate); - Serial.print(' '); - printFatTime(p->lastWriteTime); - } - // print size if requested - if (!DIR_IS_SUBDIR(p) && (flags & LS_SIZE)) { - Serial.print(' '); - Serial.print(p->fileSize); - } - Serial.println(); - - // list subdirectory content if requested - if ((flags & LS_R) && DIR_IS_SUBDIR(p)) { - uint16_t index = curPosition()/32 - 1; - SdFile s; - if (s.open(this, index, O_READ)) s.ls(flags, indent + 2); - seekSet(32 * (index + 1)); - } - } -} -//------------------------------------------------------------------------------ -// format directory name field from a 8.3 name string -uint8_t SdFile::make83Name(const char* str, uint8_t* name) { - uint8_t c; - uint8_t n = 7; // max index for part before dot - uint8_t i = 0; - // blank fill name and extension - while (i < 11) name[i++] = ' '; - i = 0; - while ((c = *str++) != '\0') { - if (c == '.') { - if (n == 10) return false; // only one dot allowed - n = 10; // max index for full 8.3 name - i = 8; // place for extension - } else { - // illegal FAT characters - uint8_t b; -#if defined(__AVR__) - PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); - while ((b = pgm_read_byte(p++))) if (b == c) return false; -#elif defined(__arm__) - const uint8_t valid[] = "|<>^+=?/[];,*\"\\"; - const uint8_t *p = valid; - while ((b = *p++)) if (b == c) return false; -#endif - // check size and only allow ASCII printable characters - if (i > n || c < 0X21 || c > 0X7E)return false; - // only upper case allowed in 8.3 names - convert lower to upper - name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a'); - } - } - // must have a file name, extension is optional - return name[0] != ' '; -} -//------------------------------------------------------------------------------ -/** Make a new directory. - * - * \param[in] dir An open SdFat instance for the directory that will containing - * the new directory. - * - * \param[in] dirName A valid 8.3 DOS name for the new directory. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include this SdFile is already open, \a dir is not a - * directory, \a dirName is invalid or already exists in \a dir. - */ -uint8_t SdFile::makeDir(SdFile* dir, const char* dirName) { - dir_t d; - - // create a normal file - if (!open(dir, dirName, O_CREAT | O_EXCL | O_RDWR)) return false; - - // convert SdFile to directory - flags_ = O_READ; - type_ = FAT_FILE_TYPE_SUBDIR; - - // allocate and zero first cluster - if (!addDirCluster())return false; - - // force entry to SD - if (!sync()) return false; - - // cache entry - should already be in cache due to sync() call - dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); - if (!p) return false; - - // change directory entry attribute - p->attributes = DIR_ATT_DIRECTORY; - - // make entry for '.' - memcpy(&d, p, sizeof(d)); - for (uint8_t i = 1; i < 11; i++) d.name[i] = ' '; - d.name[0] = '.'; - - // cache block for '.' and '..' - uint32_t block = vol_->clusterStartBlock(firstCluster_); - if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) return false; - - // copy '.' to block - memcpy(&SdVolume::cacheBuffer_.dir[0], &d, sizeof(d)); - - // make entry for '..' - d.name[1] = '.'; - if (dir->isRoot()) { - d.firstClusterLow = 0; - d.firstClusterHigh = 0; - } else { - d.firstClusterLow = dir->firstCluster_ & 0XFFFF; - d.firstClusterHigh = dir->firstCluster_ >> 16; - } - // copy '..' to block - memcpy(&SdVolume::cacheBuffer_.dir[1], &d, sizeof(d)); - - // set position after '..' - curPosition_ = 2 * sizeof(d); - - // write first block - return SdVolume::cacheFlush(); -} -//------------------------------------------------------------------------------ -/** - * Open a file or directory by name. - * - * \param[in] dirFile An open SdFat instance for the directory containing the - * file to be opened. - * - * \param[in] fileName A valid 8.3 DOS name for a file to be opened. - * - * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive - * OR of flags from the following list - * - * O_READ - Open for reading. - * - * O_RDONLY - Same as O_READ. - * - * O_WRITE - Open for writing. - * - * O_WRONLY - Same as O_WRITE. - * - * O_RDWR - Open for reading and writing. - * - * O_APPEND - If set, the file offset shall be set to the end of the - * file prior to each write. - * - * O_CREAT - If the file exists, this flag has no effect except as noted - * under O_EXCL below. Otherwise, the file shall be created - * - * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. - * - * O_SYNC - Call sync() after each write. This flag should not be used with - * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. - * These functions do character at a time writes so sync() will be called - * after each byte. - * - * O_TRUNC - If the file exists and is a regular file, and the file is - * successfully opened and is not read only, its length shall be truncated to 0. - * - * \note Directory files must be opened read only. Write and truncation is - * not allowed for directory files. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include this SdFile is already open, \a difFile is not - * a directory, \a fileName is invalid, the file does not exist - * or can't be opened in the access mode specified by oflag. - */ -uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag) { - uint8_t dname[11]; - dir_t* p; - - // error if already open - if (isOpen())return false; - - if (!make83Name(fileName, dname)) return false; - vol_ = dirFile->vol_; - dirFile->rewind(); - - // bool for empty entry found - uint8_t emptyFound = false; - - // search for file - while (dirFile->curPosition_ < dirFile->fileSize_) { - uint8_t index = 0XF & (dirFile->curPosition_ >> 5); - p = dirFile->readDirCache(); - if (p == NULL) return false; - - if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { - // remember first empty slot - if (!emptyFound) { - emptyFound = true; - dirIndex_ = index; - dirBlock_ = SdVolume::cacheBlockNumber_; - } - // done if no entries follow - if (p->name[0] == DIR_NAME_FREE) break; - } else if (!memcmp(dname, p->name, 11)) { - // don't open existing file if O_CREAT and O_EXCL - if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; - - // open found file - return openCachedEntry(0XF & index, oflag); - } - } - // only create file if O_CREAT and O_WRITE - if ((oflag & (O_CREAT | O_WRITE)) != (O_CREAT | O_WRITE)) return false; - - // cache found slot or add cluster if end of file - if (emptyFound) { - p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); - if (!p) return false; - } else { - if (dirFile->type_ == FAT_FILE_TYPE_ROOT16) return false; - - // add and zero cluster for dirFile - first cluster is in cache for write - if (!dirFile->addDirCluster()) return false; - - // use first entry in cluster - dirIndex_ = 0; - p = SdVolume::cacheBuffer_.dir; - } - // initialize as empty file - memset(p, 0, sizeof(dir_t)); - memcpy(p->name, dname, 11); - - // set timestamps - if (dateTime_) { - // call user function - dateTime_(&p->creationDate, &p->creationTime); - } else { - // use default date/time - p->creationDate = FAT_DEFAULT_DATE; - p->creationTime = FAT_DEFAULT_TIME; - } - p->lastAccessDate = p->creationDate; - p->lastWriteDate = p->creationDate; - p->lastWriteTime = p->creationTime; - - // force write of entry to SD - if (!SdVolume::cacheFlush()) return false; - - // open entry in cache - return openCachedEntry(dirIndex_, oflag); -} -//------------------------------------------------------------------------------ -/** - * Open a file by index. - * - * \param[in] dirFile An open SdFat instance for the directory. - * - * \param[in] index The \a index of the directory entry for the file to be - * opened. The value for \a index is (directory file position)/32. - * - * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive - * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. - * - * See open() by fileName for definition of flags and return values. - * - */ -uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag) { - // error if already open - if (isOpen())return false; - - // don't open existing file if O_CREAT and O_EXCL - user call error - if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; - - vol_ = dirFile->vol_; - - // seek to location of entry - if (!dirFile->seekSet(32 * index)) return false; - - // read entry into cache - dir_t* p = dirFile->readDirCache(); - if (p == NULL) return false; - - // error if empty slot or '.' or '..' - if (p->name[0] == DIR_NAME_FREE || - p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { - return false; - } - // open cached entry - return openCachedEntry(index & 0XF, oflag); -} -//------------------------------------------------------------------------------ -// open a cached directory entry. Assumes vol_ is initializes -uint8_t SdFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { - // location of entry in cache - dir_t* p = SdVolume::cacheBuffer_.dir + dirIndex; - - // write or truncate is an error for a directory or read-only file - if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { - if (oflag & (O_WRITE | O_TRUNC)) return false; - } - // remember location of directory entry on SD - dirIndex_ = dirIndex; - dirBlock_ = SdVolume::cacheBlockNumber_; - - // copy first cluster number for directory fields - firstCluster_ = (uint32_t)p->firstClusterHigh << 16; - firstCluster_ |= p->firstClusterLow; - - // make sure it is a normal file or subdirectory - if (DIR_IS_FILE(p)) { - fileSize_ = p->fileSize; - type_ = FAT_FILE_TYPE_NORMAL; - } else if (DIR_IS_SUBDIR(p)) { - if (!vol_->chainSize(firstCluster_, &fileSize_)) return false; - type_ = FAT_FILE_TYPE_SUBDIR; - } else { - return false; - } - // save open flags for read/write - flags_ = oflag & (O_ACCMODE | O_SYNC | O_APPEND); - - // set to start of file - curCluster_ = 0; - curPosition_ = 0; - - // truncate file to zero length if requested - if (oflag & O_TRUNC) return truncate(0); - return true; -} -//------------------------------------------------------------------------------ -/** - * Open a volume's root directory. - * - * \param[in] vol The FAT volume containing the root directory to be opened. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include the FAT volume has not been initialized - * or it a FAT12 volume. - */ -uint8_t SdFile::openRoot(SdVolume* vol) { - // error if file is already open - if (isOpen()) return false; - - if (vol->fatType() == 16) { - type_ = FAT_FILE_TYPE_ROOT16; - firstCluster_ = 0; - fileSize_ = 32 * vol->rootDirEntryCount(); - } else if (vol->fatType() == 32) { - type_ = FAT_FILE_TYPE_ROOT32; - firstCluster_ = vol->rootDirStart(); - if (!vol->chainSize(firstCluster_, &fileSize_)) return false; - } else { - // volume is not initialized or FAT12 - return false; - } - vol_ = vol; - // read only - flags_ = O_READ; - - // set to start of file - curCluster_ = 0; - curPosition_ = 0; - - // root has no directory entry - dirBlock_ = 0; - dirIndex_ = 0; - return true; -} -//------------------------------------------------------------------------------ -/** %Print the name field of a directory entry in 8.3 format to Serial. - * - * \param[in] dir The directory structure containing the name. - * \param[in] width Blank fill name if length is less than \a width. - */ -void SdFile::printDirName(const dir_t& dir, uint8_t width) { - uint8_t w = 0; - for (uint8_t i = 0; i < 11; i++) { - if (dir.name[i] == ' ')continue; - if (i == 8) { - Serial.print('.'); - w++; - } - Serial.write(dir.name[i]); - w++; - } - if (DIR_IS_SUBDIR(&dir)) { - Serial.print('/'); - w++; - } - while (w < width) { - Serial.print(' '); - w++; - } -} -//------------------------------------------------------------------------------ -/** %Print a directory date field to Serial. - * - * Format is yyyy-mm-dd. - * - * \param[in] fatDate The date field from a directory entry. - */ -void SdFile::printFatDate(uint16_t fatDate) { - Serial.print(FAT_YEAR(fatDate)); - Serial.print('-'); - printTwoDigits(FAT_MONTH(fatDate)); - Serial.print('-'); - printTwoDigits(FAT_DAY(fatDate)); -} -//------------------------------------------------------------------------------ -/** %Print a directory time field to Serial. - * - * Format is hh:mm:ss. - * - * \param[in] fatTime The time field from a directory entry. - */ -void SdFile::printFatTime(uint16_t fatTime) { - printTwoDigits(FAT_HOUR(fatTime)); - Serial.print(':'); - printTwoDigits(FAT_MINUTE(fatTime)); - Serial.print(':'); - printTwoDigits(FAT_SECOND(fatTime)); -} -//------------------------------------------------------------------------------ -/** %Print a value as two digits to Serial. - * - * \param[in] v Value to be printed, 0 <= \a v <= 99 - */ -void SdFile::printTwoDigits(uint8_t v) { - char str[3]; - str[0] = '0' + v/10; - str[1] = '0' + v % 10; - str[2] = 0; - Serial.print(str); -} -//------------------------------------------------------------------------------ -/** - * Read data from a file starting at the current position. - * - * \param[out] buf Pointer to the location that will receive the data. - * - * \param[in] nbyte Maximum number of bytes to read. - * - * \return For success read() returns the number of bytes read. - * A value less than \a nbyte, including zero, will be returned - * if end of file is reached. - * If an error occurs, read() returns -1. Possible errors include - * read() called before a file has been opened, corrupt file system - * or an I/O error occurred. - */ -int16_t SdFile::read(void* buf, uint16_t nbyte) { - uint8_t* dst = reinterpret_cast(buf); - - // error if not open or write only - if (!isOpen() || !(flags_ & O_READ)) return -1; - - // max bytes left in file - if (nbyte > (fileSize_ - curPosition_)) nbyte = fileSize_ - curPosition_; - - // amount left to read - uint16_t toRead = nbyte; - while (toRead > 0) { - uint32_t block; // raw device block number - uint16_t offset = curPosition_ & 0X1FF; // offset in block - if (type_ == FAT_FILE_TYPE_ROOT16) { - block = vol_->rootDirStart() + (curPosition_ >> 9); - } else { - uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); - if (offset == 0 && blockOfCluster == 0) { - // start of new cluster - if (curPosition_ == 0) { - // use first cluster in file - curCluster_ = firstCluster_; - } else { - // get next cluster from FAT - if (!vol_->fatGet(curCluster_, &curCluster_)) return -1; - } - } - block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; - } - uint16_t n = toRead; - - // amount to be read from current block - if (n > (512 - offset)) n = 512 - offset; - - // no buffering needed if n == 512 or user requests no buffering - if ((unbufferedRead() || n == 512) && - block != SdVolume::cacheBlockNumber_) { - if (!vol_->readData(block, offset, n, dst)) return -1; - dst += n; - } else { - // read block to cache and copy data to caller - if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return -1; - uint8_t* src = SdVolume::cacheBuffer_.data + offset; - uint8_t* end = src + n; - while (src != end) *dst++ = *src++; - } - curPosition_ += n; - toRead -= n; - } - return nbyte; -} -//------------------------------------------------------------------------------ -/** - * Read the next directory entry from a directory file. - * - * \param[out] dir The dir_t struct that will receive the data. - * - * \return For success readDir() returns the number of bytes read. - * A value of zero will be returned if end of file is reached. - * If an error occurs, readDir() returns -1. Possible errors include - * readDir() called before a directory has been opened, this is not - * a directory file or an I/O error occurred. - */ -int8_t SdFile::readDir(dir_t* dir) { - int8_t n; - // if not a directory file or miss-positioned return an error - if (!isDir() || (0X1F & curPosition_)) return -1; - - while ((n = read(dir, sizeof(dir_t))) == sizeof(dir_t)) { - // last entry if DIR_NAME_FREE - if (dir->name[0] == DIR_NAME_FREE) break; - // skip empty entries and entry for . and .. - if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; - // return if normal file or subdirectory - if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; - } - // error, end of file, or past last entry - return n < 0 ? -1 : 0; -} -//------------------------------------------------------------------------------ -// Read next directory entry into the cache -// Assumes file is correctly positioned -dir_t* SdFile::readDirCache(void) { - // error if not directory - if (!isDir()) return NULL; - - // index of entry in cache - uint8_t i = (curPosition_ >> 5) & 0XF; - - // use read to locate and cache block - if (read() < 0) return NULL; - - // advance to next entry - curPosition_ += 31; - - // return pointer to entry - return (SdVolume::cacheBuffer_.dir + i); -} -//------------------------------------------------------------------------------ -/** - * Remove a file. - * - * The directory entry and all data for the file are deleted. - * - * \note This function should not be used to delete the 8.3 version of a - * file that has a long name. For example if a file has the long name - * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include the file read-only, is a directory, - * or an I/O error occurred. - */ -uint8_t SdFile::remove(void) { - // free any clusters - will fail if read-only or directory - if (!truncate(0)) return false; - - // cache directory entry - dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); - if (!d) return false; - - // mark entry deleted - d->name[0] = DIR_NAME_DELETED; - - // set this SdFile closed - type_ = FAT_FILE_TYPE_CLOSED; - - // write entry to SD - return SdVolume::cacheFlush(); -} -//------------------------------------------------------------------------------ -/** - * Remove a file. - * - * The directory entry and all data for the file are deleted. - * - * \param[in] dirFile The directory that contains the file. - * \param[in] fileName The name of the file to be removed. - * - * \note This function should not be used to delete the 8.3 version of a - * file that has a long name. For example if a file has the long name - * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include the file is a directory, is read only, - * \a dirFile is not a directory, \a fileName is not found - * or an I/O error occurred. - */ -uint8_t SdFile::remove(SdFile* dirFile, const char* fileName) { - SdFile file; - if (!file.open(dirFile, fileName, O_WRITE)) return false; - return file.remove(); -} -//------------------------------------------------------------------------------ -/** Remove a directory file. - * - * The directory file will be removed only if it is empty and is not the - * root directory. rmDir() follows DOS and Windows and ignores the - * read-only attribute for the directory. - * - * \note This function should not be used to delete the 8.3 version of a - * directory that has a long name. For example if a directory has the - * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include the file is not a directory, is the root - * directory, is not empty, or an I/O error occurred. - */ -uint8_t SdFile::rmDir(void) { - // must be open subdirectory - if (!isSubDir()) return false; - - rewind(); - - // make sure directory is empty - while (curPosition_ < fileSize_) { - dir_t* p = readDirCache(); - if (p == NULL) return false; - // done if past last used entry - if (p->name[0] == DIR_NAME_FREE) break; - // skip empty slot or '.' or '..' - if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; - // error not empty - if (DIR_IS_FILE_OR_SUBDIR(p)) return false; - } - // convert empty directory to normal file for remove - type_ = FAT_FILE_TYPE_NORMAL; - flags_ |= O_WRITE; - return remove(); -} -//------------------------------------------------------------------------------ -/** Recursively delete a directory and all contained files. - * - * This is like the Unix/Linux 'rm -rf *' if called with the root directory - * hence the name. - * - * Warning - This will remove all contents of the directory including - * subdirectories. The directory will then be removed if it is not root. - * The read-only attribute for files will be ignored. - * - * \note This function should not be used to delete the 8.3 version of - * a directory that has a long name. See remove() and rmDir(). - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t SdFile::rmRfStar(void) { - rewind(); - while (curPosition_ < fileSize_) { - SdFile f; - - // remember position - uint16_t index = curPosition_/32; - - dir_t* p = readDirCache(); - if (!p) return false; - - // done if past last entry - if (p->name[0] == DIR_NAME_FREE) break; - - // skip empty slot or '.' or '..' - if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; - - // skip if part of long file name or volume label in root - if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; - - if (!f.open(this, index, O_READ)) return false; - if (f.isSubDir()) { - // recursively delete - if (!f.rmRfStar()) return false; - } else { - // ignore read-only - f.flags_ |= O_WRITE; - if (!f.remove()) return false; - } - // position to next entry if required - if (curPosition_ != (32*(index + 1))) { - if (!seekSet(32*(index + 1))) return false; - } - } - // don't try to delete root - if (isRoot()) return true; - return rmDir(); -} -//------------------------------------------------------------------------------ -/** - * Sets a file's position. - * - * \param[in] pos The new position in bytes from the beginning of the file. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t SdFile::seekSet(uint32_t pos) { - // error if file not open or seek past end of file - if (!isOpen() || pos > fileSize_) return false; - - if (type_ == FAT_FILE_TYPE_ROOT16) { - curPosition_ = pos; - return true; - } - if (pos == 0) { - // set position to start of file - curCluster_ = 0; - curPosition_ = 0; - return true; - } - // calculate cluster index for cur and new position - uint32_t nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); - uint32_t nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); - - if (nNew < nCur || curPosition_ == 0) { - // must follow chain from first cluster - curCluster_ = firstCluster_; - } else { - // advance from curPosition - nNew -= nCur; - } - while (nNew--) { - if (!vol_->fatGet(curCluster_, &curCluster_)) return false; - } - curPosition_ = pos; - return true; -} -//------------------------------------------------------------------------------ -/** - * The sync() call causes all modified data and directory fields - * to be written to the storage device. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include a call to sync() before a file has been - * opened or an I/O error. - */ -uint8_t SdFile::sync(void) { - // only allow open files and directories - if (!isOpen()) return false; - - if (flags_ & F_FILE_DIR_DIRTY) { - dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); - if (!d) return false; - - // do not set filesize for dir files - if (!isDir()) d->fileSize = fileSize_; - - // update first cluster fields - d->firstClusterLow = firstCluster_ & 0XFFFF; - d->firstClusterHigh = firstCluster_ >> 16; - - // set modify time if user supplied a callback date/time function - if (dateTime_) { - dateTime_(&d->lastWriteDate, &d->lastWriteTime); - d->lastAccessDate = d->lastWriteDate; - } - // clear directory dirty - flags_ &= ~F_FILE_DIR_DIRTY; - } - return SdVolume::cacheFlush(); -} -//------------------------------------------------------------------------------ -/** - * Set a file's timestamps in its directory entry. - * - * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive - * OR of flags from the following list - * - * T_ACCESS - Set the file's last access date. - * - * T_CREATE - Set the file's creation date and time. - * - * T_WRITE - Set the file's last write/modification date and time. - * - * \param[in] year Valid range 1980 - 2107 inclusive. - * - * \param[in] month Valid range 1 - 12 inclusive. - * - * \param[in] day Valid range 1 - 31 inclusive. - * - * \param[in] hour Valid range 0 - 23 inclusive. - * - * \param[in] minute Valid range 0 - 59 inclusive. - * - * \param[in] second Valid range 0 - 59 inclusive - * - * \note It is possible to set an invalid date since there is no check for - * the number of days in a month. - * - * \note - * Modify and access timestamps may be overwritten if a date time callback - * function has been set by dateTimeCallback(). - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - */ -uint8_t SdFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, - uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { - if (!isOpen() - || year < 1980 - || year > 2107 - || month < 1 - || month > 12 - || day < 1 - || day > 31 - || hour > 23 - || minute > 59 - || second > 59) { - return false; - } - dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); - if (!d) return false; - - uint16_t dirDate = FAT_DATE(year, month, day); - uint16_t dirTime = FAT_TIME(hour, minute, second); - if (flags & T_ACCESS) { - d->lastAccessDate = dirDate; - } - if (flags & T_CREATE) { - d->creationDate = dirDate; - d->creationTime = dirTime; - // seems to be units of 1/100 second not 1/10 as Microsoft states - d->creationTimeTenths = second & 1 ? 100 : 0; - } - if (flags & T_WRITE) { - d->lastWriteDate = dirDate; - d->lastWriteTime = dirTime; - } - SdVolume::cacheSetDirty(); - return sync(); -} -//------------------------------------------------------------------------------ -/** - * Truncate a file to a specified length. The current file position - * will be maintained if it is less than or equal to \a length otherwise - * it will be set to end of file. - * - * \param[in] length The desired length for the file. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. - * Reasons for failure include file is read only, file is a directory, - * \a length is greater than the current file size or an I/O error occurs. - */ -uint8_t SdFile::truncate(uint32_t length) { -// error if not a normal file or read-only - if (!isFile() || !(flags_ & O_WRITE)) return false; - - // error if length is greater than current size - if (length > fileSize_) return false; - - // fileSize and length are zero - nothing to do - if (fileSize_ == 0) return true; - - // remember position for seek after truncation - uint32_t newPos = curPosition_ > length ? length : curPosition_; - - // position to last cluster in truncated file - if (!seekSet(length)) return false; - - if (length == 0) { - // free all clusters - if (!vol_->freeChain(firstCluster_)) return false; - firstCluster_ = 0; - } else { - uint32_t toFree; - if (!vol_->fatGet(curCluster_, &toFree)) return false; - - if (!vol_->isEOC(toFree)) { - // free extra clusters - if (!vol_->freeChain(toFree)) return false; - - // current cluster is end of chain - if (!vol_->fatPutEOC(curCluster_)) return false; - } - } - fileSize_ = length; - - // need to update directory entry - flags_ |= F_FILE_DIR_DIRTY; - - if (!sync()) return false; - - // set file to correct position - return seekSet(newPos); -} -//------------------------------------------------------------------------------ -/** - * Write data to an open file. - * - * \note Data is moved to the cache but may not be written to the - * storage device until sync() is called. - * - * \param[in] buf Pointer to the location of the data to be written. - * - * \param[in] nbyte Number of bytes to write. - * - * \return For success write() returns the number of bytes written, always - * \a nbyte. If an error occurs, write() returns -1. Possible errors - * include write() is called before a file has been opened, write is called - * for a read-only file, device is full, a corrupt file system or an I/O error. - * - */ -size_t SdFile::write(const void* buf, uint16_t nbyte) { - // convert void* to uint8_t* - must be before goto statements - const uint8_t* src = reinterpret_cast(buf); - - // number of bytes left to write - must be before goto statements - uint16_t nToWrite = nbyte; - - // error if not a normal file or is read-only - if (!isFile() || !(flags_ & O_WRITE)) goto writeErrorReturn; - - // seek to end of file if append flag - if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { - if (!seekEnd()) goto writeErrorReturn; - } - - while (nToWrite > 0) { - uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); - uint16_t blockOffset = curPosition_ & 0X1FF; - if (blockOfCluster == 0 && blockOffset == 0) { - // start of new cluster - if (curCluster_ == 0) { - if (firstCluster_ == 0) { - // allocate first cluster of file - if (!addCluster()) goto writeErrorReturn; - } else { - curCluster_ = firstCluster_; - } - } else { - uint32_t next; - if (!vol_->fatGet(curCluster_, &next)) return false; - if (vol_->isEOC(next)) { - // add cluster if at end of chain - if (!addCluster()) goto writeErrorReturn; - } else { - curCluster_ = next; - } - } - } - // max space in block - uint16_t n = 512 - blockOffset; - - // lesser of space and amount to write - if (n > nToWrite) n = nToWrite; - - // block for data write - uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; - if (n == 512) { - // full block - don't need to use cache - // invalidate cache if block is in cache - if (SdVolume::cacheBlockNumber_ == block) { - SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; - } - if (!vol_->writeBlock(block, src)) goto writeErrorReturn; - src += 512; - } else { - if (blockOffset == 0 && curPosition_ >= fileSize_) { - // start of new block don't need to read into cache - if (!SdVolume::cacheFlush()) goto writeErrorReturn; - SdVolume::cacheBlockNumber_ = block; - SdVolume::cacheSetDirty(); - } else { - // rewrite part of block - if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) { - goto writeErrorReturn; - } - } - uint8_t* dst = SdVolume::cacheBuffer_.data + blockOffset; - uint8_t* end = dst + n; - while (dst != end) *dst++ = *src++; - } - nToWrite -= n; - curPosition_ += n; - } - if (curPosition_ > fileSize_) { - // update fileSize and insure sync will update dir entry - fileSize_ = curPosition_; - flags_ |= F_FILE_DIR_DIRTY; - } else if (dateTime_ && nbyte) { - // insure sync will update modified date and time - flags_ |= F_FILE_DIR_DIRTY; - } - - if (flags_ & O_SYNC) { - if (!sync()) goto writeErrorReturn; - } - return nbyte; - - writeErrorReturn: - // return for write error - //writeError = true; - setWriteError(); - return 0; -} -//------------------------------------------------------------------------------ -/** - * Write a byte to a file. Required by the Arduino Print class. - * - * Use SdFile::writeError to check for errors. - */ -size_t SdFile::write(uint8_t b) { - return write(&b, 1); -} -//------------------------------------------------------------------------------ -/** - * Write a string to a file. Used by the Arduino Print class. - * - * Use SdFile::writeError to check for errors. - */ -size_t SdFile::write(const char* str) { - return write(str, strlen(str)); -} -#ifdef __AVR__ -//------------------------------------------------------------------------------ -/** - * Write a PROGMEM string to a file. - * - * Use SdFile::writeError to check for errors. - */ -void SdFile::write_P(PGM_P str) { - for (uint8_t c; (c = pgm_read_byte(str)); str++) write(c); -} -//------------------------------------------------------------------------------ -/** - * Write a PROGMEM string followed by CR/LF to a file. - * - * Use SdFile::writeError to check for errors. - */ -void SdFile::writeln_P(PGM_P str) { - write_P(str); - println(); -} -#endif +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#ifdef __AVR__ +#include +#endif +#include +//------------------------------------------------------------------------------ +// callback function for date/time +void (*SdFile::dateTime_)(uint16_t* date, uint16_t* time) = NULL; + +#if ALLOW_DEPRECATED_FUNCTIONS +// suppress cpplint warnings with NOLINT comment +void (*SdFile::oldDateTime_)(uint16_t& date, uint16_t& time) = NULL; // NOLINT +#endif // ALLOW_DEPRECATED_FUNCTIONS +//------------------------------------------------------------------------------ +// add a cluster to a file +uint8_t SdFile::addCluster() { + if (!vol_->allocContiguous(1, &curCluster_)) return false; + + // if first cluster of file link to directory entry + if (firstCluster_ == 0) { + firstCluster_ = curCluster_; + flags_ |= F_FILE_DIR_DIRTY; + } + return true; +} +//------------------------------------------------------------------------------ +// Add a cluster to a directory file and zero the cluster. +// return with first block of cluster in the cache +uint8_t SdFile::addDirCluster(void) { + if (!addCluster()) return false; + + // zero data in cluster insure first cluster is in cache + uint32_t block = vol_->clusterStartBlock(curCluster_); + for (uint8_t i = vol_->blocksPerCluster_; i != 0; i--) { + if (!SdVolume::cacheZeroBlock(block + i - 1)) return false; + } + // Increase directory file size by cluster size + fileSize_ += 512UL << vol_->clusterSizeShift_; + return true; +} +//------------------------------------------------------------------------------ +// cache a file's directory entry +// return pointer to cached entry or null for failure +dir_t* SdFile::cacheDirEntry(uint8_t action) { + if (!SdVolume::cacheRawBlock(dirBlock_, action)) return NULL; + return SdVolume::cacheBuffer_.dir + dirIndex_; +} +//------------------------------------------------------------------------------ +/** + * Close a file and force cached data and directory information + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include no file is open or an I/O error. + */ +uint8_t SdFile::close(void) { + if (!sync())return false; + type_ = FAT_FILE_TYPE_CLOSED; + return true; +} +//------------------------------------------------------------------------------ +/** + * Check for contiguous file and return its raw block range. + * + * \param[out] bgnBlock the first block address for the file. + * \param[out] endBlock the last block address for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is not contiguous, file has zero length + * or an I/O error occurred. + */ +uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { + // error if no blocks + if (firstCluster_ == 0) return false; + + for (uint32_t c = firstCluster_; ; c++) { + uint32_t next; + if (!vol_->fatGet(c, &next)) return false; + + // check for contiguous + if (next != (c + 1)) { + // error if not end of chain + if (!vol_->isEOC(next)) return false; + *bgnBlock = vol_->clusterStartBlock(firstCluster_); + *endBlock = vol_->clusterStartBlock(c) + + vol_->blocksPerCluster_ - 1; + return true; + } + } +} +//------------------------------------------------------------------------------ +/** + * Create and open a new contiguous file of a specified size. + * + * \note This function only supports short DOS 8.3 names. + * See open() for more information. + * + * \param[in] dirFile The directory where the file will be created. + * \param[in] fileName A valid DOS 8.3 file name. + * \param[in] size The desired file size. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include \a fileName contains + * an invalid DOS 8.3 file name, the FAT volume has not been initialized, + * a file is already open, the file already exists, the root + * directory is full or an I/O error. + * + */ +uint8_t SdFile::createContiguous(SdFile* dirFile, + const char* fileName, uint32_t size) { + // don't allow zero length file + if (size == 0) return false; + if (!open(dirFile, fileName, O_CREAT | O_EXCL | O_RDWR)) return false; + + // calculate number of clusters needed + uint32_t count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; + + // allocate clusters + if (!vol_->allocContiguous(count, &firstCluster_)) { + remove(); + return false; + } + fileSize_ = size; + + // insure sync() will update dir entry + flags_ |= F_FILE_DIR_DIRTY; + return sync(); +} +//------------------------------------------------------------------------------ +/** + * Return a files directory entry + * + * \param[out] dir Location for return of the files directory entry. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::dirEntry(dir_t* dir) { + // make sure fields on SD are correct + if (!sync()) return false; + + // read entry + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) return false; + + // copy to caller's struct + memcpy(dir, p, sizeof(dir_t)); + return true; +} +//------------------------------------------------------------------------------ +/** + * Format the name field of \a dir into the 13 byte array + * \a name in standard 8.3 short name format. + * + * \param[in] dir The directory structure containing the name. + * \param[out] name A 13 byte char array for the formatted name. + */ +void SdFile::dirName(const dir_t& dir, char* name) { + uint8_t j = 0; + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) name[j++] = '.'; + name[j++] = dir.name[i]; + } + name[j] = 0; +} +//------------------------------------------------------------------------------ +/** List directory contents to Serial. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + * + * \param[in] indent Amount of space before file name. Used for recursive + * list to indicate subdirectory level. + */ +void SdFile::ls(uint8_t flags, uint8_t indent) { + dir_t* p; + + rewind(); + while ((p = readDirCache())) { + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip deleted entry and entries for . and .. + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // only list subdirectories and files + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + // print any indent spaces + for (int8_t i = 0; i < indent; i++) Serial.print(' '); + + // print file name with possible blank fill + printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0); + + // print modify date/time if requested + if (flags & LS_DATE) { + printFatDate(p->lastWriteDate); + Serial.print(' '); + printFatTime(p->lastWriteTime); + } + // print size if requested + if (!DIR_IS_SUBDIR(p) && (flags & LS_SIZE)) { + Serial.print(' '); + Serial.print(p->fileSize); + } + Serial.println(); + + // list subdirectory content if requested + if ((flags & LS_R) && DIR_IS_SUBDIR(p)) { + uint16_t index = curPosition()/32 - 1; + SdFile s; + if (s.open(this, index, O_READ)) s.ls(flags, indent + 2); + seekSet(32 * (index + 1)); + } + } +} +//------------------------------------------------------------------------------ +// format directory name field from a 8.3 name string +uint8_t SdFile::make83Name(const char* str, uint8_t* name) { + uint8_t c; + uint8_t n = 7; // max index for part before dot + uint8_t i = 0; + // blank fill name and extension + while (i < 11) name[i++] = ' '; + i = 0; + while ((c = *str++) != '\0') { + if (c == '.') { + if (n == 10) return false; // only one dot allowed + n = 10; // max index for full 8.3 name + i = 8; // place for extension + } else { + // illegal FAT characters + uint8_t b; +#if defined(__AVR__) + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + while ((b = pgm_read_byte(p++))) if (b == c) return false; +#elif defined(__arm__) + const uint8_t valid[] = "|<>^+=?/[];,*\"\\"; + const uint8_t *p = valid; + while ((b = *p++)) if (b == c) return false; +#endif + // check size and only allow ASCII printable characters + if (i > n || c < 0X21 || c > 0X7E)return false; + // only upper case allowed in 8.3 names - convert lower to upper + name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a'); + } + } + // must have a file name, extension is optional + return name[0] != ' '; +} +//------------------------------------------------------------------------------ +/** Make a new directory. + * + * \param[in] dir An open SdFat instance for the directory that will containing + * the new directory. + * + * \param[in] dirName A valid 8.3 DOS name for the new directory. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this SdFile is already open, \a dir is not a + * directory, \a dirName is invalid or already exists in \a dir. + */ +uint8_t SdFile::makeDir(SdFile* dir, const char* dirName) { + dir_t d; + + // create a normal file + if (!open(dir, dirName, O_CREAT | O_EXCL | O_RDWR)) return false; + + // convert SdFile to directory + flags_ = O_READ; + type_ = FAT_FILE_TYPE_SUBDIR; + + // allocate and zero first cluster + if (!addDirCluster())return false; + + // force entry to SD + if (!sync()) return false; + + // cache entry - should already be in cache due to sync() call + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + + // change directory entry attribute + p->attributes = DIR_ATT_DIRECTORY; + + // make entry for '.' + memcpy(&d, p, sizeof(d)); + for (uint8_t i = 1; i < 11; i++) d.name[i] = ' '; + d.name[0] = '.'; + + // cache block for '.' and '..' + uint32_t block = vol_->clusterStartBlock(firstCluster_); + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) return false; + + // copy '.' to block + memcpy(&SdVolume::cacheBuffer_.dir[0], &d, sizeof(d)); + + // make entry for '..' + d.name[1] = '.'; + if (dir->isRoot()) { + d.firstClusterLow = 0; + d.firstClusterHigh = 0; + } else { + d.firstClusterLow = dir->firstCluster_ & 0XFFFF; + d.firstClusterHigh = dir->firstCluster_ >> 16; + } + // copy '..' to block + memcpy(&SdVolume::cacheBuffer_.dir[1], &d, sizeof(d)); + + // set position after '..' + curPosition_ = 2 * sizeof(d); + + // write first block + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Open a file or directory by name. + * + * \param[in] dirFile An open SdFat instance for the directory containing the + * file to be opened. + * + * \param[in] fileName A valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * O_READ - Open for reading. + * + * O_RDONLY - Same as O_READ. + * + * O_WRITE - Open for writing. + * + * O_WRONLY - Same as O_WRITE. + * + * O_RDWR - Open for reading and writing. + * + * O_APPEND - If set, the file offset shall be set to the end of the + * file prior to each write. + * + * O_CREAT - If the file exists, this flag has no effect except as noted + * under O_EXCL below. Otherwise, the file shall be created + * + * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. + * + * O_SYNC - Call sync() after each write. This flag should not be used with + * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. + * These functions do character at a time writes so sync() will be called + * after each byte. + * + * O_TRUNC - If the file exists and is a regular file, and the file is + * successfully opened and is not read only, its length shall be truncated to 0. + * + * \note Directory files must be opened read only. Write and truncation is + * not allowed for directory files. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this SdFile is already open, \a difFile is not + * a directory, \a fileName is invalid, the file does not exist + * or can't be opened in the access mode specified by oflag. + */ +uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag) { + uint8_t dname[11]; + dir_t* p; + + // error if already open + if (isOpen())return false; + + if (!make83Name(fileName, dname)) return false; + vol_ = dirFile->vol_; + dirFile->rewind(); + + // bool for empty entry found + uint8_t emptyFound = false; + + // search for file + while (dirFile->curPosition_ < dirFile->fileSize_) { + uint8_t index = 0XF & (dirFile->curPosition_ >> 5); + p = dirFile->readDirCache(); + if (p == NULL) return false; + + if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { + // remember first empty slot + if (!emptyFound) { + emptyFound = true; + dirIndex_ = index; + dirBlock_ = SdVolume::cacheBlockNumber_; + } + // done if no entries follow + if (p->name[0] == DIR_NAME_FREE) break; + } else if (!memcmp(dname, p->name, 11)) { + // don't open existing file if O_CREAT and O_EXCL + if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; + + // open found file + return openCachedEntry(0XF & index, oflag); + } + } + // only create file if O_CREAT and O_WRITE + if ((oflag & (O_CREAT | O_WRITE)) != (O_CREAT | O_WRITE)) return false; + + // cache found slot or add cluster if end of file + if (emptyFound) { + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + } else { + if (dirFile->type_ == FAT_FILE_TYPE_ROOT16) return false; + + // add and zero cluster for dirFile - first cluster is in cache for write + if (!dirFile->addDirCluster()) return false; + + // use first entry in cluster + dirIndex_ = 0; + p = SdVolume::cacheBuffer_.dir; + } + // initialize as empty file + memset(p, 0, sizeof(dir_t)); + memcpy(p->name, dname, 11); + + // set timestamps + if (dateTime_) { + // call user function + dateTime_(&p->creationDate, &p->creationTime); + } else { + // use default date/time + p->creationDate = FAT_DEFAULT_DATE; + p->creationTime = FAT_DEFAULT_TIME; + } + p->lastAccessDate = p->creationDate; + p->lastWriteDate = p->creationDate; + p->lastWriteTime = p->creationTime; + + // force write of entry to SD + if (!SdVolume::cacheFlush()) return false; + + // open entry in cache + return openCachedEntry(dirIndex_, oflag); +} +//------------------------------------------------------------------------------ +/** + * Open a file by index. + * + * \param[in] dirFile An open SdFat instance for the directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. + * + * See open() by fileName for definition of flags and return values. + * + */ +uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag) { + // error if already open + if (isOpen())return false; + + // don't open existing file if O_CREAT and O_EXCL - user call error + if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; + + vol_ = dirFile->vol_; + + // seek to location of entry + if (!dirFile->seekSet(32 * index)) return false; + + // read entry into cache + dir_t* p = dirFile->readDirCache(); + if (p == NULL) return false; + + // error if empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_FREE || + p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + return false; + } + // open cached entry + return openCachedEntry(index & 0XF, oflag); +} +//------------------------------------------------------------------------------ +// open a cached directory entry. Assumes vol_ is initializes +uint8_t SdFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { + // location of entry in cache + dir_t* p = SdVolume::cacheBuffer_.dir + dirIndex; + + // write or truncate is an error for a directory or read-only file + if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { + if (oflag & (O_WRITE | O_TRUNC)) return false; + } + // remember location of directory entry on SD + dirIndex_ = dirIndex; + dirBlock_ = SdVolume::cacheBlockNumber_; + + // copy first cluster number for directory fields + firstCluster_ = (uint32_t)p->firstClusterHigh << 16; + firstCluster_ |= p->firstClusterLow; + + // make sure it is a normal file or subdirectory + if (DIR_IS_FILE(p)) { + fileSize_ = p->fileSize; + type_ = FAT_FILE_TYPE_NORMAL; + } else if (DIR_IS_SUBDIR(p)) { + if (!vol_->chainSize(firstCluster_, &fileSize_)) return false; + type_ = FAT_FILE_TYPE_SUBDIR; + } else { + return false; + } + // save open flags for read/write + flags_ = oflag & (O_ACCMODE | O_SYNC | O_APPEND); + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + + // truncate file to zero length if requested + if (oflag & O_TRUNC) return truncate(0); + return true; +} +//------------------------------------------------------------------------------ +/** + * Open a volume's root directory. + * + * \param[in] vol The FAT volume containing the root directory to be opened. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the FAT volume has not been initialized + * or it a FAT12 volume. + */ +uint8_t SdFile::openRoot(SdVolume* vol) { + // error if file is already open + if (isOpen()) return false; + + if (vol->fatType() == 16) { + type_ = FAT_FILE_TYPE_ROOT16; + firstCluster_ = 0; + fileSize_ = 32 * vol->rootDirEntryCount(); + } else if (vol->fatType() == 32) { + type_ = FAT_FILE_TYPE_ROOT32; + firstCluster_ = vol->rootDirStart(); + if (!vol->chainSize(firstCluster_, &fileSize_)) return false; + } else { + // volume is not initialized or FAT12 + return false; + } + vol_ = vol; + // read only + flags_ = O_READ; + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + + // root has no directory entry + dirBlock_ = 0; + dirIndex_ = 0; + return true; +} +//------------------------------------------------------------------------------ +/** %Print the name field of a directory entry in 8.3 format to Serial. + * + * \param[in] dir The directory structure containing the name. + * \param[in] width Blank fill name if length is less than \a width. + */ +void SdFile::printDirName(const dir_t& dir, uint8_t width) { + uint8_t w = 0; + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) { + Serial.print('.'); + w++; + } + Serial.write(dir.name[i]); + w++; + } + if (DIR_IS_SUBDIR(&dir)) { + Serial.print('/'); + w++; + } + while (w < width) { + Serial.print(' '); + w++; + } +} +//------------------------------------------------------------------------------ +/** %Print a directory date field to Serial. + * + * Format is yyyy-mm-dd. + * + * \param[in] fatDate The date field from a directory entry. + */ +void SdFile::printFatDate(uint16_t fatDate) { + Serial.print(FAT_YEAR(fatDate)); + Serial.print('-'); + printTwoDigits(FAT_MONTH(fatDate)); + Serial.print('-'); + printTwoDigits(FAT_DAY(fatDate)); +} +//------------------------------------------------------------------------------ +/** %Print a directory time field to Serial. + * + * Format is hh:mm:ss. + * + * \param[in] fatTime The time field from a directory entry. + */ +void SdFile::printFatTime(uint16_t fatTime) { + printTwoDigits(FAT_HOUR(fatTime)); + Serial.print(':'); + printTwoDigits(FAT_MINUTE(fatTime)); + Serial.print(':'); + printTwoDigits(FAT_SECOND(fatTime)); +} +//------------------------------------------------------------------------------ +/** %Print a value as two digits to Serial. + * + * \param[in] v Value to be printed, 0 <= \a v <= 99 + */ +void SdFile::printTwoDigits(uint8_t v) { + char str[3]; + str[0] = '0' + v/10; + str[1] = '0' + v % 10; + str[2] = 0; + Serial.print(str); +} +//------------------------------------------------------------------------------ +/** + * Read data from a file starting at the current position. + * + * \param[out] buf Pointer to the location that will receive the data. + * + * \param[in] nbyte Maximum number of bytes to read. + * + * \return For success read() returns the number of bytes read. + * A value less than \a nbyte, including zero, will be returned + * if end of file is reached. + * If an error occurs, read() returns -1. Possible errors include + * read() called before a file has been opened, corrupt file system + * or an I/O error occurred. + */ +int16_t SdFile::read(void* buf, uint16_t nbyte) { + uint8_t* dst = reinterpret_cast(buf); + + // error if not open or write only + if (!isOpen() || !(flags_ & O_READ)) return -1; + + // max bytes left in file + if (nbyte > (fileSize_ - curPosition_)) nbyte = fileSize_ - curPosition_; + + // amount left to read + uint16_t toRead = nbyte; + while (toRead > 0) { + uint32_t block; // raw device block number + uint16_t offset = curPosition_ & 0X1FF; // offset in block + if (type_ == FAT_FILE_TYPE_ROOT16) { + block = vol_->rootDirStart() + (curPosition_ >> 9); + } else { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + if (offset == 0 && blockOfCluster == 0) { + // start of new cluster + if (curPosition_ == 0) { + // use first cluster in file + curCluster_ = firstCluster_; + } else { + // get next cluster from FAT + if (!vol_->fatGet(curCluster_, &curCluster_)) return -1; + } + } + block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + } + uint16_t n = toRead; + + // amount to be read from current block + if (n > (512 - offset)) n = 512 - offset; + + // no buffering needed if n == 512 or user requests no buffering + if ((unbufferedRead() || n == 512) && + block != SdVolume::cacheBlockNumber_) { + if (!vol_->readData(block, offset, n, dst)) return -1; + dst += n; + } else { + // read block to cache and copy data to caller + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return -1; + uint8_t* src = SdVolume::cacheBuffer_.data + offset; + uint8_t* end = src + n; + while (src != end) *dst++ = *src++; + } + curPosition_ += n; + toRead -= n; + } + return nbyte; +} +//------------------------------------------------------------------------------ +/** + * Read the next directory entry from a directory file. + * + * \param[out] dir The dir_t struct that will receive the data. + * + * \return For success readDir() returns the number of bytes read. + * A value of zero will be returned if end of file is reached. + * If an error occurs, readDir() returns -1. Possible errors include + * readDir() called before a directory has been opened, this is not + * a directory file or an I/O error occurred. + */ +int8_t SdFile::readDir(dir_t* dir) { + int8_t n; + // if not a directory file or miss-positioned return an error + if (!isDir() || (0X1F & curPosition_)) return -1; + + while ((n = read(dir, sizeof(dir_t))) == sizeof(dir_t)) { + // last entry if DIR_NAME_FREE + if (dir->name[0] == DIR_NAME_FREE) break; + // skip empty entries and entry for . and .. + if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; + // return if normal file or subdirectory + if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; + } + // error, end of file, or past last entry + return n < 0 ? -1 : 0; +} +//------------------------------------------------------------------------------ +// Read next directory entry into the cache +// Assumes file is correctly positioned +dir_t* SdFile::readDirCache(void) { + // error if not directory + if (!isDir()) return NULL; + + // index of entry in cache + uint8_t i = (curPosition_ >> 5) & 0XF; + + // use read to locate and cache block + if (read() < 0) return NULL; + + // advance to next entry + curPosition_ += 31; + + // return pointer to entry + return (SdVolume::cacheBuffer_.dir + i); +} +//------------------------------------------------------------------------------ +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file read-only, is a directory, + * or an I/O error occurred. + */ +uint8_t SdFile::remove(void) { + // free any clusters - will fail if read-only or directory + if (!truncate(0)) return false; + + // cache directory entry + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // set this SdFile closed + type_ = FAT_FILE_TYPE_CLOSED; + + // write entry to SD + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \param[in] dirFile The directory that contains the file. + * \param[in] fileName The name of the file to be removed. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is a directory, is read only, + * \a dirFile is not a directory, \a fileName is not found + * or an I/O error occurred. + */ +uint8_t SdFile::remove(SdFile* dirFile, const char* fileName) { + SdFile file; + if (!file.open(dirFile, fileName, O_WRITE)) return false; + return file.remove(); +} +//------------------------------------------------------------------------------ +/** Remove a directory file. + * + * The directory file will be removed only if it is empty and is not the + * root directory. rmDir() follows DOS and Windows and ignores the + * read-only attribute for the directory. + * + * \note This function should not be used to delete the 8.3 version of a + * directory that has a long name. For example if a directory has the + * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is not a directory, is the root + * directory, is not empty, or an I/O error occurred. + */ +uint8_t SdFile::rmDir(void) { + // must be open subdirectory + if (!isSubDir()) return false; + + rewind(); + + // make sure directory is empty + while (curPosition_ < fileSize_) { + dir_t* p = readDirCache(); + if (p == NULL) return false; + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + // error not empty + if (DIR_IS_FILE_OR_SUBDIR(p)) return false; + } + // convert empty directory to normal file for remove + type_ = FAT_FILE_TYPE_NORMAL; + flags_ |= O_WRITE; + return remove(); +} +//------------------------------------------------------------------------------ +/** Recursively delete a directory and all contained files. + * + * This is like the Unix/Linux 'rm -rf *' if called with the root directory + * hence the name. + * + * Warning - This will remove all contents of the directory including + * subdirectories. The directory will then be removed if it is not root. + * The read-only attribute for files will be ignored. + * + * \note This function should not be used to delete the 8.3 version of + * a directory that has a long name. See remove() and rmDir(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::rmRfStar(void) { + rewind(); + while (curPosition_ < fileSize_) { + SdFile f; + + // remember position + uint16_t index = curPosition_/32; + + dir_t* p = readDirCache(); + if (!p) return false; + + // done if past last entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // skip if part of long file name or volume label in root + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + if (!f.open(this, index, O_READ)) return false; + if (f.isSubDir()) { + // recursively delete + if (!f.rmRfStar()) return false; + } else { + // ignore read-only + f.flags_ |= O_WRITE; + if (!f.remove()) return false; + } + // position to next entry if required + if (curPosition_ != (32*(index + 1))) { + if (!seekSet(32*(index + 1))) return false; + } + } + // don't try to delete root + if (isRoot()) return true; + return rmDir(); +} +//------------------------------------------------------------------------------ +/** + * Sets a file's position. + * + * \param[in] pos The new position in bytes from the beginning of the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::seekSet(uint32_t pos) { + // error if file not open or seek past end of file + if (!isOpen() || pos > fileSize_) return false; + + if (type_ == FAT_FILE_TYPE_ROOT16) { + curPosition_ = pos; + return true; + } + if (pos == 0) { + // set position to start of file + curCluster_ = 0; + curPosition_ = 0; + return true; + } + // calculate cluster index for cur and new position + uint32_t nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); + uint32_t nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); + + if (nNew < nCur || curPosition_ == 0) { + // must follow chain from first cluster + curCluster_ = firstCluster_; + } else { + // advance from curPosition + nNew -= nCur; + } + while (nNew--) { + if (!vol_->fatGet(curCluster_, &curCluster_)) return false; + } + curPosition_ = pos; + return true; +} +//------------------------------------------------------------------------------ +/** + * The sync() call causes all modified data and directory fields + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include a call to sync() before a file has been + * opened or an I/O error. + */ +uint8_t SdFile::sync(void) { + // only allow open files and directories + if (!isOpen()) return false; + + if (flags_ & F_FILE_DIR_DIRTY) { + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // do not set filesize for dir files + if (!isDir()) d->fileSize = fileSize_; + + // update first cluster fields + d->firstClusterLow = firstCluster_ & 0XFFFF; + d->firstClusterHigh = firstCluster_ >> 16; + + // set modify time if user supplied a callback date/time function + if (dateTime_) { + dateTime_(&d->lastWriteDate, &d->lastWriteTime); + d->lastAccessDate = d->lastWriteDate; + } + // clear directory dirty + flags_ &= ~F_FILE_DIR_DIRTY; + } + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Set a file's timestamps in its directory entry. + * + * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * T_ACCESS - Set the file's last access date. + * + * T_CREATE - Set the file's creation date and time. + * + * T_WRITE - Set the file's last write/modification date and time. + * + * \param[in] year Valid range 1980 - 2107 inclusive. + * + * \param[in] month Valid range 1 - 12 inclusive. + * + * \param[in] day Valid range 1 - 31 inclusive. + * + * \param[in] hour Valid range 0 - 23 inclusive. + * + * \param[in] minute Valid range 0 - 59 inclusive. + * + * \param[in] second Valid range 0 - 59 inclusive + * + * \note It is possible to set an invalid date since there is no check for + * the number of days in a month. + * + * \note + * Modify and access timestamps may be overwritten if a date time callback + * function has been set by dateTimeCallback(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, + uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + if (!isOpen() + || year < 1980 + || year > 2107 + || month < 1 + || month > 12 + || day < 1 + || day > 31 + || hour > 23 + || minute > 59 + || second > 59) { + return false; + } + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + uint16_t dirDate = FAT_DATE(year, month, day); + uint16_t dirTime = FAT_TIME(hour, minute, second); + if (flags & T_ACCESS) { + d->lastAccessDate = dirDate; + } + if (flags & T_CREATE) { + d->creationDate = dirDate; + d->creationTime = dirTime; + // seems to be units of 1/100 second not 1/10 as Microsoft states + d->creationTimeTenths = second & 1 ? 100 : 0; + } + if (flags & T_WRITE) { + d->lastWriteDate = dirDate; + d->lastWriteTime = dirTime; + } + SdVolume::cacheSetDirty(); + return sync(); +} +//------------------------------------------------------------------------------ +/** + * Truncate a file to a specified length. The current file position + * will be maintained if it is less than or equal to \a length otherwise + * it will be set to end of file. + * + * \param[in] length The desired length for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is read only, file is a directory, + * \a length is greater than the current file size or an I/O error occurs. + */ +uint8_t SdFile::truncate(uint32_t length) { +// error if not a normal file or read-only + if (!isFile() || !(flags_ & O_WRITE)) return false; + + // error if length is greater than current size + if (length > fileSize_) return false; + + // fileSize and length are zero - nothing to do + if (fileSize_ == 0) return true; + + // remember position for seek after truncation + uint32_t newPos = curPosition_ > length ? length : curPosition_; + + // position to last cluster in truncated file + if (!seekSet(length)) return false; + + if (length == 0) { + // free all clusters + if (!vol_->freeChain(firstCluster_)) return false; + firstCluster_ = 0; + } else { + uint32_t toFree; + if (!vol_->fatGet(curCluster_, &toFree)) return false; + + if (!vol_->isEOC(toFree)) { + // free extra clusters + if (!vol_->freeChain(toFree)) return false; + + // current cluster is end of chain + if (!vol_->fatPutEOC(curCluster_)) return false; + } + } + fileSize_ = length; + + // need to update directory entry + flags_ |= F_FILE_DIR_DIRTY; + + if (!sync()) return false; + + // set file to correct position + return seekSet(newPos); +} +//------------------------------------------------------------------------------ +/** + * Write data to an open file. + * + * \note Data is moved to the cache but may not be written to the + * storage device until sync() is called. + * + * \param[in] buf Pointer to the location of the data to be written. + * + * \param[in] nbyte Number of bytes to write. + * + * \return For success write() returns the number of bytes written, always + * \a nbyte. If an error occurs, write() returns -1. Possible errors + * include write() is called before a file has been opened, write is called + * for a read-only file, device is full, a corrupt file system or an I/O error. + * + */ +size_t SdFile::write(const void* buf, uint16_t nbyte) { + // convert void* to uint8_t* - must be before goto statements + const uint8_t* src = reinterpret_cast(buf); + + // number of bytes left to write - must be before goto statements + uint16_t nToWrite = nbyte; + + // error if not a normal file or is read-only + if (!isFile() || !(flags_ & O_WRITE)) goto writeErrorReturn; + + // seek to end of file if append flag + if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { + if (!seekEnd()) goto writeErrorReturn; + } + + while (nToWrite > 0) { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + uint16_t blockOffset = curPosition_ & 0X1FF; + if (blockOfCluster == 0 && blockOffset == 0) { + // start of new cluster + if (curCluster_ == 0) { + if (firstCluster_ == 0) { + // allocate first cluster of file + if (!addCluster()) goto writeErrorReturn; + } else { + curCluster_ = firstCluster_; + } + } else { + uint32_t next; + if (!vol_->fatGet(curCluster_, &next)) return false; + if (vol_->isEOC(next)) { + // add cluster if at end of chain + if (!addCluster()) goto writeErrorReturn; + } else { + curCluster_ = next; + } + } + } + // max space in block + uint16_t n = 512 - blockOffset; + + // lesser of space and amount to write + if (n > nToWrite) n = nToWrite; + + // block for data write + uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + if (n == 512) { + // full block - don't need to use cache + // invalidate cache if block is in cache + if (SdVolume::cacheBlockNumber_ == block) { + SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; + } + if (!vol_->writeBlock(block, src)) goto writeErrorReturn; + src += 512; + } else { + if (blockOffset == 0 && curPosition_ >= fileSize_) { + // start of new block don't need to read into cache + if (!SdVolume::cacheFlush()) goto writeErrorReturn; + SdVolume::cacheBlockNumber_ = block; + SdVolume::cacheSetDirty(); + } else { + // rewrite part of block + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) { + goto writeErrorReturn; + } + } + uint8_t* dst = SdVolume::cacheBuffer_.data + blockOffset; + uint8_t* end = dst + n; + while (dst != end) *dst++ = *src++; + } + nToWrite -= n; + curPosition_ += n; + } + if (curPosition_ > fileSize_) { + // update fileSize and insure sync will update dir entry + fileSize_ = curPosition_; + flags_ |= F_FILE_DIR_DIRTY; + } else if (dateTime_ && nbyte) { + // insure sync will update modified date and time + flags_ |= F_FILE_DIR_DIRTY; + } + + if (flags_ & O_SYNC) { + if (!sync()) goto writeErrorReturn; + } + return nbyte; + + writeErrorReturn: + // return for write error + //writeError = true; + setWriteError(); + return 0; +} +//------------------------------------------------------------------------------ +/** + * Write a byte to a file. Required by the Arduino Print class. + * + * Use SdFile::writeError to check for errors. + */ +size_t SdFile::write(uint8_t b) { + return write(&b, 1); +} +//------------------------------------------------------------------------------ +/** + * Write a string to a file. Used by the Arduino Print class. + * + * Use SdFile::writeError to check for errors. + */ +size_t SdFile::write(const char* str) { + return write(str, strlen(str)); +} +#ifdef __AVR__ +//------------------------------------------------------------------------------ +/** + * Write a PROGMEM string to a file. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::write_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) write(c); +} +//------------------------------------------------------------------------------ +/** + * Write a PROGMEM string followed by CR/LF to a file. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::writeln_P(PGM_P str) { + write_P(str); + println(); +} +#endif diff --git a/libraries/SD/utility/SdInfo.h b/libraries/SD/utility/SdInfo.h index acde74d974f..bc4c6137f5e 100644 --- a/libraries/SD/utility/SdInfo.h +++ b/libraries/SD/utility/SdInfo.h @@ -1,232 +1,232 @@ -/* Arduino Sd2Card Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino Sd2Card Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino Sd2Card Library. If not, see - * . - */ -#ifndef SdInfo_h -#define SdInfo_h -#include -// Based on the document: -// -// SD Specifications -// Part 1 -// Physical Layer -// Simplified Specification -// Version 2.00 -// September 25, 2006 -// -// www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf -//------------------------------------------------------------------------------ -// SD card commands -/** GO_IDLE_STATE - init card in spi mode if CS low */ -uint8_t const CMD0 = 0X00; -/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ -uint8_t const CMD8 = 0X08; -/** SEND_CSD - read the Card Specific Data (CSD register) */ -uint8_t const CMD9 = 0X09; -/** SEND_CID - read the card identification information (CID register) */ -uint8_t const CMD10 = 0X0A; -/** SEND_STATUS - read the card status register */ -uint8_t const CMD13 = 0X0D; -/** READ_BLOCK - read a single data block from the card */ -uint8_t const CMD17 = 0X11; -/** WRITE_BLOCK - write a single data block to the card */ -uint8_t const CMD24 = 0X18; -/** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */ -uint8_t const CMD25 = 0X19; -/** ERASE_WR_BLK_START - sets the address of the first block to be erased */ -uint8_t const CMD32 = 0X20; -/** ERASE_WR_BLK_END - sets the address of the last block of the continuous - range to be erased*/ -uint8_t const CMD33 = 0X21; -/** ERASE - erase all previously selected blocks */ -uint8_t const CMD38 = 0X26; -/** APP_CMD - escape for application specific command */ -uint8_t const CMD55 = 0X37; -/** READ_OCR - read the OCR register of a card */ -uint8_t const CMD58 = 0X3A; -/** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be - pre-erased before writing */ -uint8_t const ACMD23 = 0X17; -/** SD_SEND_OP_COMD - Sends host capacity support information and - activates the card's initialization process */ -uint8_t const ACMD41 = 0X29; -//------------------------------------------------------------------------------ -/** status for card in the ready state */ -uint8_t const R1_READY_STATE = 0X00; -/** status for card in the idle state */ -uint8_t const R1_IDLE_STATE = 0X01; -/** status bit for illegal command */ -uint8_t const R1_ILLEGAL_COMMAND = 0X04; -/** start data token for read or write single block*/ -uint8_t const DATA_START_BLOCK = 0XFE; -/** stop token for write multiple blocks*/ -uint8_t const STOP_TRAN_TOKEN = 0XFD; -/** start data token for write multiple blocks*/ -uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC; -/** mask for data response tokens after a write block operation */ -uint8_t const DATA_RES_MASK = 0X1F; -/** write data accepted token */ -uint8_t const DATA_RES_ACCEPTED = 0X05; -//------------------------------------------------------------------------------ -typedef struct CID { - // byte 0 - uint8_t mid; // Manufacturer ID - // byte 1-2 - char oid[2]; // OEM/Application ID - // byte 3-7 - char pnm[5]; // Product name - // byte 8 - unsigned prv_m : 4; // Product revision n.m - unsigned prv_n : 4; - // byte 9-12 - uint32_t psn; // Product serial number - // byte 13 - unsigned mdt_year_high : 4; // Manufacturing date - unsigned reserved : 4; - // byte 14 - unsigned mdt_month : 4; - unsigned mdt_year_low :4; - // byte 15 - unsigned always1 : 1; - unsigned crc : 7; -}cid_t; -//------------------------------------------------------------------------------ -// CSD for version 1.00 cards -typedef struct CSDV1 { - // byte 0 - unsigned reserved1 : 6; - unsigned csd_ver : 2; - // byte 1 - uint8_t taac; - // byte 2 - uint8_t nsac; - // byte 3 - uint8_t tran_speed; - // byte 4 - uint8_t ccc_high; - // byte 5 - unsigned read_bl_len : 4; - unsigned ccc_low : 4; - // byte 6 - unsigned c_size_high : 2; - unsigned reserved2 : 2; - unsigned dsr_imp : 1; - unsigned read_blk_misalign :1; - unsigned write_blk_misalign : 1; - unsigned read_bl_partial : 1; - // byte 7 - uint8_t c_size_mid; - // byte 8 - unsigned vdd_r_curr_max : 3; - unsigned vdd_r_curr_min : 3; - unsigned c_size_low :2; - // byte 9 - unsigned c_size_mult_high : 2; - unsigned vdd_w_cur_max : 3; - unsigned vdd_w_curr_min : 3; - // byte 10 - unsigned sector_size_high : 6; - unsigned erase_blk_en : 1; - unsigned c_size_mult_low : 1; - // byte 11 - unsigned wp_grp_size : 7; - unsigned sector_size_low : 1; - // byte 12 - unsigned write_bl_len_high : 2; - unsigned r2w_factor : 3; - unsigned reserved3 : 2; - unsigned wp_grp_enable : 1; - // byte 13 - unsigned reserved4 : 5; - unsigned write_partial : 1; - unsigned write_bl_len_low : 2; - // byte 14 - unsigned reserved5: 2; - unsigned file_format : 2; - unsigned tmp_write_protect : 1; - unsigned perm_write_protect : 1; - unsigned copy : 1; - unsigned file_format_grp : 1; - // byte 15 - unsigned always1 : 1; - unsigned crc : 7; -}csd1_t; -//------------------------------------------------------------------------------ -// CSD for version 2.00 cards -typedef struct CSDV2 { - // byte 0 - unsigned reserved1 : 6; - unsigned csd_ver : 2; - // byte 1 - uint8_t taac; - // byte 2 - uint8_t nsac; - // byte 3 - uint8_t tran_speed; - // byte 4 - uint8_t ccc_high; - // byte 5 - unsigned read_bl_len : 4; - unsigned ccc_low : 4; - // byte 6 - unsigned reserved2 : 4; - unsigned dsr_imp : 1; - unsigned read_blk_misalign :1; - unsigned write_blk_misalign : 1; - unsigned read_bl_partial : 1; - // byte 7 - unsigned reserved3 : 2; - unsigned c_size_high : 6; - // byte 8 - uint8_t c_size_mid; - // byte 9 - uint8_t c_size_low; - // byte 10 - unsigned sector_size_high : 6; - unsigned erase_blk_en : 1; - unsigned reserved4 : 1; - // byte 11 - unsigned wp_grp_size : 7; - unsigned sector_size_low : 1; - // byte 12 - unsigned write_bl_len_high : 2; - unsigned r2w_factor : 3; - unsigned reserved5 : 2; - unsigned wp_grp_enable : 1; - // byte 13 - unsigned reserved6 : 5; - unsigned write_partial : 1; - unsigned write_bl_len_low : 2; - // byte 14 - unsigned reserved7: 2; - unsigned file_format : 2; - unsigned tmp_write_protect : 1; - unsigned perm_write_protect : 1; - unsigned copy : 1; - unsigned file_format_grp : 1; - // byte 15 - unsigned always1 : 1; - unsigned crc : 7; -}csd2_t; -//------------------------------------------------------------------------------ -// union of old and new style CSD register -union csd_t { - csd1_t v1; - csd2_t v2; -}; -#endif // SdInfo_h +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef SdInfo_h +#define SdInfo_h +#include +// Based on the document: +// +// SD Specifications +// Part 1 +// Physical Layer +// Simplified Specification +// Version 2.00 +// September 25, 2006 +// +// www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf +//------------------------------------------------------------------------------ +// SD card commands +/** GO_IDLE_STATE - init card in spi mode if CS low */ +uint8_t const CMD0 = 0X00; +/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ +uint8_t const CMD8 = 0X08; +/** SEND_CSD - read the Card Specific Data (CSD register) */ +uint8_t const CMD9 = 0X09; +/** SEND_CID - read the card identification information (CID register) */ +uint8_t const CMD10 = 0X0A; +/** SEND_STATUS - read the card status register */ +uint8_t const CMD13 = 0X0D; +/** READ_BLOCK - read a single data block from the card */ +uint8_t const CMD17 = 0X11; +/** WRITE_BLOCK - write a single data block to the card */ +uint8_t const CMD24 = 0X18; +/** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */ +uint8_t const CMD25 = 0X19; +/** ERASE_WR_BLK_START - sets the address of the first block to be erased */ +uint8_t const CMD32 = 0X20; +/** ERASE_WR_BLK_END - sets the address of the last block of the continuous + range to be erased*/ +uint8_t const CMD33 = 0X21; +/** ERASE - erase all previously selected blocks */ +uint8_t const CMD38 = 0X26; +/** APP_CMD - escape for application specific command */ +uint8_t const CMD55 = 0X37; +/** READ_OCR - read the OCR register of a card */ +uint8_t const CMD58 = 0X3A; +/** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be + pre-erased before writing */ +uint8_t const ACMD23 = 0X17; +/** SD_SEND_OP_COMD - Sends host capacity support information and + activates the card's initialization process */ +uint8_t const ACMD41 = 0X29; +//------------------------------------------------------------------------------ +/** status for card in the ready state */ +uint8_t const R1_READY_STATE = 0X00; +/** status for card in the idle state */ +uint8_t const R1_IDLE_STATE = 0X01; +/** status bit for illegal command */ +uint8_t const R1_ILLEGAL_COMMAND = 0X04; +/** start data token for read or write single block*/ +uint8_t const DATA_START_BLOCK = 0XFE; +/** stop token for write multiple blocks*/ +uint8_t const STOP_TRAN_TOKEN = 0XFD; +/** start data token for write multiple blocks*/ +uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC; +/** mask for data response tokens after a write block operation */ +uint8_t const DATA_RES_MASK = 0X1F; +/** write data accepted token */ +uint8_t const DATA_RES_ACCEPTED = 0X05; +//------------------------------------------------------------------------------ +typedef struct CID { + // byte 0 + uint8_t mid; // Manufacturer ID + // byte 1-2 + char oid[2]; // OEM/Application ID + // byte 3-7 + char pnm[5]; // Product name + // byte 8 + unsigned prv_m : 4; // Product revision n.m + unsigned prv_n : 4; + // byte 9-12 + uint32_t psn; // Product serial number + // byte 13 + unsigned mdt_year_high : 4; // Manufacturing date + unsigned reserved : 4; + // byte 14 + unsigned mdt_month : 4; + unsigned mdt_year_low :4; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}cid_t; +//------------------------------------------------------------------------------ +// CSD for version 1.00 cards +typedef struct CSDV1 { + // byte 0 + unsigned reserved1 : 6; + unsigned csd_ver : 2; + // byte 1 + uint8_t taac; + // byte 2 + uint8_t nsac; + // byte 3 + uint8_t tran_speed; + // byte 4 + uint8_t ccc_high; + // byte 5 + unsigned read_bl_len : 4; + unsigned ccc_low : 4; + // byte 6 + unsigned c_size_high : 2; + unsigned reserved2 : 2; + unsigned dsr_imp : 1; + unsigned read_blk_misalign :1; + unsigned write_blk_misalign : 1; + unsigned read_bl_partial : 1; + // byte 7 + uint8_t c_size_mid; + // byte 8 + unsigned vdd_r_curr_max : 3; + unsigned vdd_r_curr_min : 3; + unsigned c_size_low :2; + // byte 9 + unsigned c_size_mult_high : 2; + unsigned vdd_w_cur_max : 3; + unsigned vdd_w_curr_min : 3; + // byte 10 + unsigned sector_size_high : 6; + unsigned erase_blk_en : 1; + unsigned c_size_mult_low : 1; + // byte 11 + unsigned wp_grp_size : 7; + unsigned sector_size_low : 1; + // byte 12 + unsigned write_bl_len_high : 2; + unsigned r2w_factor : 3; + unsigned reserved3 : 2; + unsigned wp_grp_enable : 1; + // byte 13 + unsigned reserved4 : 5; + unsigned write_partial : 1; + unsigned write_bl_len_low : 2; + // byte 14 + unsigned reserved5: 2; + unsigned file_format : 2; + unsigned tmp_write_protect : 1; + unsigned perm_write_protect : 1; + unsigned copy : 1; + unsigned file_format_grp : 1; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}csd1_t; +//------------------------------------------------------------------------------ +// CSD for version 2.00 cards +typedef struct CSDV2 { + // byte 0 + unsigned reserved1 : 6; + unsigned csd_ver : 2; + // byte 1 + uint8_t taac; + // byte 2 + uint8_t nsac; + // byte 3 + uint8_t tran_speed; + // byte 4 + uint8_t ccc_high; + // byte 5 + unsigned read_bl_len : 4; + unsigned ccc_low : 4; + // byte 6 + unsigned reserved2 : 4; + unsigned dsr_imp : 1; + unsigned read_blk_misalign :1; + unsigned write_blk_misalign : 1; + unsigned read_bl_partial : 1; + // byte 7 + unsigned reserved3 : 2; + unsigned c_size_high : 6; + // byte 8 + uint8_t c_size_mid; + // byte 9 + uint8_t c_size_low; + // byte 10 + unsigned sector_size_high : 6; + unsigned erase_blk_en : 1; + unsigned reserved4 : 1; + // byte 11 + unsigned wp_grp_size : 7; + unsigned sector_size_low : 1; + // byte 12 + unsigned write_bl_len_high : 2; + unsigned r2w_factor : 3; + unsigned reserved5 : 2; + unsigned wp_grp_enable : 1; + // byte 13 + unsigned reserved6 : 5; + unsigned write_partial : 1; + unsigned write_bl_len_low : 2; + // byte 14 + unsigned reserved7: 2; + unsigned file_format : 2; + unsigned tmp_write_protect : 1; + unsigned perm_write_protect : 1; + unsigned copy : 1; + unsigned file_format_grp : 1; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}csd2_t; +//------------------------------------------------------------------------------ +// union of old and new style CSD register +union csd_t { + csd1_t v1; + csd2_t v2; +}; +#endif // SdInfo_h diff --git a/libraries/SD/utility/SdVolume.cpp b/libraries/SD/utility/SdVolume.cpp index ece4acbac4e..e053beeed00 100644 --- a/libraries/SD/utility/SdVolume.cpp +++ b/libraries/SD/utility/SdVolume.cpp @@ -1,295 +1,295 @@ -/* Arduino SdFat Library - * Copyright (C) 2009 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ -#include -//------------------------------------------------------------------------------ -// raw block cache -// init cacheBlockNumber_to invalid SD block number -uint32_t SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; -cache_t SdVolume::cacheBuffer_; // 512 byte cache for Sd2Card -Sd2Card* SdVolume::sdCard_; // pointer to SD card object -uint8_t SdVolume::cacheDirty_ = 0; // cacheFlush() will write block if true -uint32_t SdVolume::cacheMirrorBlock_ = 0; // mirror block for second FAT -//------------------------------------------------------------------------------ -// find a contiguous group of clusters -uint8_t SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { - // start of group - uint32_t bgnCluster; - - // flag to save place to start next search - uint8_t setStart; - - // set search start cluster - if (*curCluster) { - // try to make file contiguous - bgnCluster = *curCluster + 1; - - // don't save new start location - setStart = false; - } else { - // start at likely place for free cluster - bgnCluster = allocSearchStart_; - - // save next search start if one cluster - setStart = 1 == count; - } - // end of group - uint32_t endCluster = bgnCluster; - - // last cluster of FAT - uint32_t fatEnd = clusterCount_ + 1; - - // search the FAT for free clusters - for (uint32_t n = 0;; n++, endCluster++) { - // can't find space checked all clusters - if (n >= clusterCount_) return false; - - // past end - start from beginning of FAT - if (endCluster > fatEnd) { - bgnCluster = endCluster = 2; - } - uint32_t f; - if (!fatGet(endCluster, &f)) return false; - - if (f != 0) { - // cluster in use try next cluster as bgnCluster - bgnCluster = endCluster + 1; - } else if ((endCluster - bgnCluster + 1) == count) { - // done - found space - break; - } - } - // mark end of chain - if (!fatPutEOC(endCluster)) return false; - - // link clusters - while (endCluster > bgnCluster) { - if (!fatPut(endCluster - 1, endCluster)) return false; - endCluster--; - } - if (*curCluster != 0) { - // connect chains - if (!fatPut(*curCluster, bgnCluster)) return false; - } - // return first cluster number to caller - *curCluster = bgnCluster; - - // remember possible next free cluster - if (setStart) allocSearchStart_ = bgnCluster + 1; - - return true; -} -//------------------------------------------------------------------------------ -uint8_t SdVolume::cacheFlush(void) { - if (cacheDirty_) { - if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { - return false; - } - // mirror FAT tables - if (cacheMirrorBlock_) { - if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) { - return false; - } - cacheMirrorBlock_ = 0; - } - cacheDirty_ = 0; - } - return true; -} -//------------------------------------------------------------------------------ -uint8_t SdVolume::cacheRawBlock(uint32_t blockNumber, uint8_t action) { - if (cacheBlockNumber_ != blockNumber) { - if (!cacheFlush()) return false; - if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) return false; - cacheBlockNumber_ = blockNumber; - } - cacheDirty_ |= action; - return true; -} -//------------------------------------------------------------------------------ -// cache a zero block for blockNumber -uint8_t SdVolume::cacheZeroBlock(uint32_t blockNumber) { - if (!cacheFlush()) return false; - - // loop take less flash than memset(cacheBuffer_.data, 0, 512); - for (uint16_t i = 0; i < 512; i++) { - cacheBuffer_.data[i] = 0; - } - cacheBlockNumber_ = blockNumber; - cacheSetDirty(); - return true; -} -//------------------------------------------------------------------------------ -// return the size in bytes of a cluster chain -uint8_t SdVolume::chainSize(uint32_t cluster, uint32_t* size) const { - uint32_t s = 0; - do { - if (!fatGet(cluster, &cluster)) return false; - s += 512UL << clusterSizeShift_; - } while (!isEOC(cluster)); - *size = s; - return true; -} -//------------------------------------------------------------------------------ -// Fetch a FAT entry -uint8_t SdVolume::fatGet(uint32_t cluster, uint32_t* value) const { - if (cluster > (clusterCount_ + 1)) return false; - uint32_t lba = fatStartBlock_; - lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; - if (lba != cacheBlockNumber_) { - if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; - } - if (fatType_ == 16) { - *value = cacheBuffer_.fat16[cluster & 0XFF]; - } else { - *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; - } - return true; -} -//------------------------------------------------------------------------------ -// Store a FAT entry -uint8_t SdVolume::fatPut(uint32_t cluster, uint32_t value) { - // error if reserved cluster - if (cluster < 2) return false; - - // error if not in FAT - if (cluster > (clusterCount_ + 1)) return false; - - // calculate block address for entry - uint32_t lba = fatStartBlock_; - lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; - - if (lba != cacheBlockNumber_) { - if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; - } - // store entry - if (fatType_ == 16) { - cacheBuffer_.fat16[cluster & 0XFF] = value; - } else { - cacheBuffer_.fat32[cluster & 0X7F] = value; - } - cacheSetDirty(); - - // mirror second FAT - if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; - return true; -} -//------------------------------------------------------------------------------ -// free a cluster chain -uint8_t SdVolume::freeChain(uint32_t cluster) { - // clear free cluster location - allocSearchStart_ = 2; - - do { - uint32_t next; - if (!fatGet(cluster, &next)) return false; - - // free cluster - if (!fatPut(cluster, 0)) return false; - - cluster = next; - } while (!isEOC(cluster)); - - return true; -} -//------------------------------------------------------------------------------ -/** - * Initialize a FAT volume. - * - * \param[in] dev The SD card where the volume is located. - * - * \param[in] part The partition to be used. Legal values for \a part are - * 1-4 to use the corresponding partition on a device formatted with - * a MBR, Master Boot Record, or zero if the device is formatted as - * a super floppy with the FAT boot sector in block zero. - * - * \return The value one, true, is returned for success and - * the value zero, false, is returned for failure. Reasons for - * failure include not finding a valid partition, not finding a valid - * FAT file system in the specified partition or an I/O error. - */ -uint8_t SdVolume::init(Sd2Card* dev, uint8_t part) { - uint32_t volumeStartBlock = 0; - sdCard_ = dev; - // if part == 0 assume super floppy with FAT boot sector in block zero - // if part > 0 assume mbr volume with partition table - if (part) { - if (part > 4)return false; - if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; - part_t* p = &cacheBuffer_.mbr.part[part-1]; - if ((p->boot & 0X7F) !=0 || - p->totalSectors < 100 || - p->firstSector == 0) { - // not a valid partition - return false; - } - volumeStartBlock = p->firstSector; - } - if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; - bpb_t* bpb = &cacheBuffer_.fbs.bpb; - if (bpb->bytesPerSector != 512 || - bpb->fatCount == 0 || - bpb->reservedSectorCount == 0 || - bpb->sectorsPerCluster == 0) { - // not valid FAT volume - return false; - } - fatCount_ = bpb->fatCount; - blocksPerCluster_ = bpb->sectorsPerCluster; - - // determine shift that is same as multiply by blocksPerCluster_ - clusterSizeShift_ = 0; - while (blocksPerCluster_ != (1 << clusterSizeShift_)) { - // error if not power of 2 - if (clusterSizeShift_++ > 7) return false; - } - blocksPerFat_ = bpb->sectorsPerFat16 ? - bpb->sectorsPerFat16 : bpb->sectorsPerFat32; - - fatStartBlock_ = volumeStartBlock + bpb->reservedSectorCount; - - // count for FAT16 zero for FAT32 - rootDirEntryCount_ = bpb->rootDirEntryCount; - - // directory start for FAT16 dataStart for FAT32 - rootDirStart_ = fatStartBlock_ + bpb->fatCount * blocksPerFat_; - - // data start for FAT16 and FAT32 - dataStartBlock_ = rootDirStart_ + ((32 * bpb->rootDirEntryCount + 511)/512); - - // total blocks for FAT16 or FAT32 - uint32_t totalBlocks = bpb->totalSectors16 ? - bpb->totalSectors16 : bpb->totalSectors32; - // total data blocks - clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); - - // divide by cluster size to get cluster count - clusterCount_ >>= clusterSizeShift_; - - // FAT type is determined by cluster count - if (clusterCount_ < 4085) { - fatType_ = 12; - } else if (clusterCount_ < 65525) { - fatType_ = 16; - } else { - rootDirStart_ = bpb->fat32RootCluster; - fatType_ = 32; - } - return true; -} +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +//------------------------------------------------------------------------------ +// raw block cache +// init cacheBlockNumber_to invalid SD block number +uint32_t SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; +cache_t SdVolume::cacheBuffer_; // 512 byte cache for Sd2Card +Sd2Card* SdVolume::sdCard_; // pointer to SD card object +uint8_t SdVolume::cacheDirty_ = 0; // cacheFlush() will write block if true +uint32_t SdVolume::cacheMirrorBlock_ = 0; // mirror block for second FAT +//------------------------------------------------------------------------------ +// find a contiguous group of clusters +uint8_t SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { + // start of group + uint32_t bgnCluster; + + // flag to save place to start next search + uint8_t setStart; + + // set search start cluster + if (*curCluster) { + // try to make file contiguous + bgnCluster = *curCluster + 1; + + // don't save new start location + setStart = false; + } else { + // start at likely place for free cluster + bgnCluster = allocSearchStart_; + + // save next search start if one cluster + setStart = 1 == count; + } + // end of group + uint32_t endCluster = bgnCluster; + + // last cluster of FAT + uint32_t fatEnd = clusterCount_ + 1; + + // search the FAT for free clusters + for (uint32_t n = 0;; n++, endCluster++) { + // can't find space checked all clusters + if (n >= clusterCount_) return false; + + // past end - start from beginning of FAT + if (endCluster > fatEnd) { + bgnCluster = endCluster = 2; + } + uint32_t f; + if (!fatGet(endCluster, &f)) return false; + + if (f != 0) { + // cluster in use try next cluster as bgnCluster + bgnCluster = endCluster + 1; + } else if ((endCluster - bgnCluster + 1) == count) { + // done - found space + break; + } + } + // mark end of chain + if (!fatPutEOC(endCluster)) return false; + + // link clusters + while (endCluster > bgnCluster) { + if (!fatPut(endCluster - 1, endCluster)) return false; + endCluster--; + } + if (*curCluster != 0) { + // connect chains + if (!fatPut(*curCluster, bgnCluster)) return false; + } + // return first cluster number to caller + *curCluster = bgnCluster; + + // remember possible next free cluster + if (setStart) allocSearchStart_ = bgnCluster + 1; + + return true; +} +//------------------------------------------------------------------------------ +uint8_t SdVolume::cacheFlush(void) { + if (cacheDirty_) { + if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { + return false; + } + // mirror FAT tables + if (cacheMirrorBlock_) { + if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) { + return false; + } + cacheMirrorBlock_ = 0; + } + cacheDirty_ = 0; + } + return true; +} +//------------------------------------------------------------------------------ +uint8_t SdVolume::cacheRawBlock(uint32_t blockNumber, uint8_t action) { + if (cacheBlockNumber_ != blockNumber) { + if (!cacheFlush()) return false; + if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) return false; + cacheBlockNumber_ = blockNumber; + } + cacheDirty_ |= action; + return true; +} +//------------------------------------------------------------------------------ +// cache a zero block for blockNumber +uint8_t SdVolume::cacheZeroBlock(uint32_t blockNumber) { + if (!cacheFlush()) return false; + + // loop take less flash than memset(cacheBuffer_.data, 0, 512); + for (uint16_t i = 0; i < 512; i++) { + cacheBuffer_.data[i] = 0; + } + cacheBlockNumber_ = blockNumber; + cacheSetDirty(); + return true; +} +//------------------------------------------------------------------------------ +// return the size in bytes of a cluster chain +uint8_t SdVolume::chainSize(uint32_t cluster, uint32_t* size) const { + uint32_t s = 0; + do { + if (!fatGet(cluster, &cluster)) return false; + s += 512UL << clusterSizeShift_; + } while (!isEOC(cluster)); + *size = s; + return true; +} +//------------------------------------------------------------------------------ +// Fetch a FAT entry +uint8_t SdVolume::fatGet(uint32_t cluster, uint32_t* value) const { + if (cluster > (clusterCount_ + 1)) return false; + uint32_t lba = fatStartBlock_; + lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; + if (lba != cacheBlockNumber_) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; + } + if (fatType_ == 16) { + *value = cacheBuffer_.fat16[cluster & 0XFF]; + } else { + *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; + } + return true; +} +//------------------------------------------------------------------------------ +// Store a FAT entry +uint8_t SdVolume::fatPut(uint32_t cluster, uint32_t value) { + // error if reserved cluster + if (cluster < 2) return false; + + // error if not in FAT + if (cluster > (clusterCount_ + 1)) return false; + + // calculate block address for entry + uint32_t lba = fatStartBlock_; + lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; + + if (lba != cacheBlockNumber_) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; + } + // store entry + if (fatType_ == 16) { + cacheBuffer_.fat16[cluster & 0XFF] = value; + } else { + cacheBuffer_.fat32[cluster & 0X7F] = value; + } + cacheSetDirty(); + + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + return true; +} +//------------------------------------------------------------------------------ +// free a cluster chain +uint8_t SdVolume::freeChain(uint32_t cluster) { + // clear free cluster location + allocSearchStart_ = 2; + + do { + uint32_t next; + if (!fatGet(cluster, &next)) return false; + + // free cluster + if (!fatPut(cluster, 0)) return false; + + cluster = next; + } while (!isEOC(cluster)); + + return true; +} +//------------------------------------------------------------------------------ +/** + * Initialize a FAT volume. + * + * \param[in] dev The SD card where the volume is located. + * + * \param[in] part The partition to be used. Legal values for \a part are + * 1-4 to use the corresponding partition on a device formatted with + * a MBR, Master Boot Record, or zero if the device is formatted as + * a super floppy with the FAT boot sector in block zero. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system in the specified partition or an I/O error. + */ +uint8_t SdVolume::init(Sd2Card* dev, uint8_t part) { + uint32_t volumeStartBlock = 0; + sdCard_ = dev; + // if part == 0 assume super floppy with FAT boot sector in block zero + // if part > 0 assume mbr volume with partition table + if (part) { + if (part > 4)return false; + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + part_t* p = &cacheBuffer_.mbr.part[part-1]; + if ((p->boot & 0X7F) !=0 || + p->totalSectors < 100 || + p->firstSector == 0) { + // not a valid partition + return false; + } + volumeStartBlock = p->firstSector; + } + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + bpb_t* bpb = &cacheBuffer_.fbs.bpb; + if (bpb->bytesPerSector != 512 || + bpb->fatCount == 0 || + bpb->reservedSectorCount == 0 || + bpb->sectorsPerCluster == 0) { + // not valid FAT volume + return false; + } + fatCount_ = bpb->fatCount; + blocksPerCluster_ = bpb->sectorsPerCluster; + + // determine shift that is same as multiply by blocksPerCluster_ + clusterSizeShift_ = 0; + while (blocksPerCluster_ != (1 << clusterSizeShift_)) { + // error if not power of 2 + if (clusterSizeShift_++ > 7) return false; + } + blocksPerFat_ = bpb->sectorsPerFat16 ? + bpb->sectorsPerFat16 : bpb->sectorsPerFat32; + + fatStartBlock_ = volumeStartBlock + bpb->reservedSectorCount; + + // count for FAT16 zero for FAT32 + rootDirEntryCount_ = bpb->rootDirEntryCount; + + // directory start for FAT16 dataStart for FAT32 + rootDirStart_ = fatStartBlock_ + bpb->fatCount * blocksPerFat_; + + // data start for FAT16 and FAT32 + dataStartBlock_ = rootDirStart_ + ((32 * bpb->rootDirEntryCount + 511)/512); + + // total blocks for FAT16 or FAT32 + uint32_t totalBlocks = bpb->totalSectors16 ? + bpb->totalSectors16 : bpb->totalSectors32; + // total data blocks + clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); + + // divide by cluster size to get cluster count + clusterCount_ >>= clusterSizeShift_; + + // FAT type is determined by cluster count + if (clusterCount_ < 4085) { + fatType_ = 12; + } else if (clusterCount_ < 65525) { + fatType_ = 16; + } else { + rootDirStart_ = bpb->fat32RootCluster; + fatType_ = 32; + } + return true; +}