r3851 - in vdr/vdr/trunk/debian: . patches
Tobias Grimm
tiber-guest at alioth.debian.org
Fri Jan 12 23:28:49 CET 2007
Author: tiber-guest
Date: 2007-01-12 23:28:45 +0100 (Fri, 12 Jan 2007)
New Revision: 3851
Added:
vdr/vdr/trunk/debian/patches/XX_patchtest-compile-error.dpatch
vdr/vdr/trunk/debian/patches/XX_patchtest-patch-error.dpatch
vdr/vdr/trunk/debian/patches/list_uncritical_patches
vdr/vdr/trunk/debian/patches/opt-20_liemikuutio.dpatch
vdr/vdr/trunk/debian/patches/opt-27-x_subtitles-ttxtsubs-volumebar-fix.dpatch
vdr/vdr/trunk/debian/patches/opt-30-x_analogtv.dpatch
vdr/vdr/trunk/debian/patches/opt-35_setup-show-valid.dpatch
vdr/vdr/trunk/debian/patches/opt-36_CutterQueue-AutoDelete.dpatch
vdr/vdr/trunk/debian/patches/opt-36_CutterQueue.dpatch
vdr/vdr/trunk/debian/patches/opt-37_submenu.dpatch
vdr/vdr/trunk/debian/patches/opt-38_disableDoubleEpgEntrys.dpatch
vdr/vdr/trunk/debian/patches/opt-39_noepg.dpatch
vdr/vdr/trunk/debian/patches/opt-40_wareagle-icons.dpatch
vdr/vdr/trunk/debian/patches/opt-41-x_timer-info.dpatch
vdr/vdr/trunk/debian/patches/opt-42-x_extrecmenu.dpatch
vdr/vdr/trunk/debian/patches/opt-43-x_epgsearch.dpatch
vdr/vdr/trunk/debian/patches/opt-44_rotor.dpatch
vdr/vdr/trunk/debian/patches/opt-45_yaepg.dpatch
vdr/vdr/trunk/debian/patches/opt-46-x_dmh-dvd-archive-debian.dpatch
vdr/vdr/trunk/debian/patches/opt-46_dmh-dvd-archive.dpatch
vdr/vdr/trunk/debian/patches/opt-46_dvdarchive.dpatch
vdr/vdr/trunk/debian/patches/opt-47_sourcecaps.dpatch
vdr/vdr/trunk/debian/patches/opt-48_pin.dpatch
vdr/vdr/trunk/debian/patches/opt-49_sharelnb.dpatch
vdr/vdr/trunk/debian/patches/patchtest
Modified:
vdr/vdr/trunk/debian/changelog
vdr/vdr/trunk/debian/patches/00list
Log:
* Added the complete list of optional patches from the vdr package at e-tobi.net
(Ubuntu might want to use them)
Modified: vdr/vdr/trunk/debian/changelog
===================================================================
--- vdr/vdr/trunk/debian/changelog 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/changelog 2007-01-12 22:28:45 UTC (rev 3851)
@@ -8,6 +8,8 @@
/usr/share/vdr-dev/plugin-template/rules not beeing a valid shell script
* Added linitan source overrided for "debian-rules-not-a-makefile"
* Removed lintian override for menu-command-not-in-package /usr/lib/menu/vdr:2
+ * Added the complete list of optional patches from the vdr package at e-tobi.net
+ (Ubuntu might want to use them)
[ Thomas Günther ]
* Replaced VDRdevel adaptions in debian/rules and plugin-template/rules
Modified: vdr/vdr/trunk/debian/patches/00list
===================================================================
--- vdr/vdr/trunk/debian/patches/00list 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/00list 2007-01-12 22:28:45 UTC (rev 3851)
@@ -10,8 +10,70 @@
15_dvbplayer
16_channels.conf.terr-fix
+81_Make_config
+82_valgrind
+
+# Patch collection (replaces enAIO).
+# opt-20_liemikuutio
+
# The Jump patch allows automatic jumping over cutting marks.
# opt-24_jumpplay
# Patch needed for the subtitles and the ttxtsubs plugin.
# opt-27_subtitles-ttxtsubs
+# opt-27-x_subtitles-ttxtsubs-volumebar-fix
+
+# Patch needed for the analogtv plugin.
+# opt-30-x_analogtv
+
+# Patch that shows if there is a valid setup value left or right with < and >.
+# opt-35_setup-show-valid
+
+# Patch to handle recordings that should be cutted in a queue (-/+ autodelete).
+# opt-36_CutterQueue
+# opt-36_CutterQueue-AutoDelete
+
+# Patch needed for the submenu plugin.
+# opt-37_submenu
+
+# Patch that suppresses double EPG entries.
+# opt-38_disableDoubleEpgEntrys
+
+# Patch to disable normal epg update for specified channels.
+# opt-39_noepg
+
+# Patch that adds some icons to timer, recording and channel list.
+# opt-40_wareagle-icons
+
+# Patch to show an info, if it is possible to record an event in the timer-info.
+# opt-41-x_timer-info
+
+# Patch to allow extrecmenu to replace the recordings menu with it's own version.
+# opt-42-x_extrecmenu
+
+# Patch to allow epgsearch to replace the schedule menu with it's own version.
+# opt-43-x_epgsearch
+
+# Patch needed for the rotor plugin.
+# opt-44_rotor
+
+# Patch needed for the yaepg plugin.
+# opt-45_yaepg
+
+# Patch to play on DVD archived VDR recordings.
+# opt-46_dvdarchive
+
+# Estension to opt-46_dvdarchive to play VIDEO-DVD's as archived VDR recordings.
+# opt-46_dmh-dvd-archive
+
+# Some Debian specific defaults for opt-46_dmh-dvd-archive
+# opt-46-x_dmh-dvd-archive-debian
+
+# Patch for assigning special satellites to one dvb card.
+# opt-47_sourcecaps
+
+# Patch for the PIN plugin
+# opt-48_pin
+
+# Patch to share one sat connection for several cards.
+# opt-49_sharelnb
Added: vdr/vdr/trunk/debian/patches/XX_patchtest-compile-error.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/XX_patchtest-compile-error.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/XX_patchtest-compile-error.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,20 @@
+#!/bin/sh /usr/share/dpatch/dpatch-run
+
+## XX_patchtest-compile-error
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch to check patchtest against compile error
+
+ at DPATCH@
+diff -Nur vdr.orig/vdr.c vdr/vdr.c
+--- vdr.orig/vdr.c 2004-03-12 21:37:17.000000000 +0100
++++ vdr/vdr.c 2004-03-13 14:22:01.000000000 +0100
+@@ -79,6 +79,8 @@
+
+ int main(int argc, char *argv[])
+ {
++ RaiseCompilerError();
++
+ // Save terminal settings:
+
+ struct termios savedTm;
Added: vdr/vdr/trunk/debian/patches/XX_patchtest-patch-error.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/XX_patchtest-patch-error.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/XX_patchtest-patch-error.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,20 @@
+#!/bin/sh /usr/share/dpatch/dpatch-run
+
+## XX_patchtest-patch-error
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch to check patchtest against patch error
+
+ at DPATCH@
+diff -Nur vdr.orig/vdr.c vdr/vdr.c
+--- vdr.orig/vdr.c 2004-03-12 21:37:17.000000000 +0100
++++ vdr/vdr.c 2004-03-13 14:22:01.000000000 +0100
+@@ -79,6 +79,8 @@
+
+ int main(int argc, char *argv[])
+ ***PATCH-BUG***
++ RaiseCompilerError();
++
+ // Save terminal settings:
+
+ struct termios savedTm;
Added: vdr/vdr/trunk/debian/patches/list_uncritical_patches
===================================================================
--- vdr/vdr/trunk/debian/patches/list_uncritical_patches 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/list_uncritical_patches 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# find all patches that don't modify any header files
+
+patches=`find ./ -name "*.dpatch"`
+
+for patch in $patches ; do
+ grep -q -e "^---.*\.h" $patch
+ if [ $? -ne 0 ] ; then
+ basename $patch
+ fi
+done
Added: vdr/vdr/trunk/debian/patches/opt-20_liemikuutio.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-20_liemikuutio.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-20_liemikuutio.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,1470 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-20_liemikuutio.dpatch by Rolf Ahrenberg <Rolf.Ahrenberg AT sci.fi>
+## http://www.saunalahti.fi/~rahrenbe/vdr/patches/vdr-1.4.4-liemikuutio-1.13.diff.gz
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch collection - see HISTORY-liemikuutio for details.
+
+ at DPATCH@
+diff -Nru vdr-1.4.4-vanilla/HISTORY-liemikuutio vdr-1.4.4-liemikuutio/HISTORY-liemikuutio
+--- vdr-1.4.4-vanilla/HISTORY-liemikuutio 1970-01-01 02:00:00.000000000 +0200
++++ vdr-1.4.4-liemikuutio/HISTORY-liemikuutio 2006-11-04 18:28:33.000000000 +0200
+@@ -0,0 +1,65 @@
++Liemikuutio Revision History
++----------------------------
++
++2006-01-08: Version 1.0
++
++- Based on enAIO with these original patches:
++ Simple recordings sorting by Walter at VDRPortal
++ Alternate rename recordings by Ralf Müller
++ Menu selection by Peter Dittmann
++ Recording length by Tobias Faust
++
++2006-01-15: Version 1.1
++
++- Removed patches already found in vdr-1.3.39.
++
++2006-01-25: Version 1.2
++
++- Added "Main menu command position" feature.
++
++2006-02-05: Version 1.3
++
++- Improved menu selection response.
++
++2006-04-18: Version 1.4
++
++- Added Estonian translation (Thanks to Arthur Konovalov).
++
++2006-04-30: Version 1.5
++
++- Added progress bar view into "What's on now?" menu.
++
++2006-06-06: Version 1.6
++
++- Added French translation (Thanks to ECLiPSE).
++
++2006-06-14: Version 1.7
++
++- Fixed RENR crash.
++
++2006-07-14: Version 1.8
++
++- Fixed RENR/OSD bug.
++
++2006-08-27: Version 1.9
++
++- Some modifications to the recording length and
++ rename recordings patches (Thanks to Firefly).
++- Added k1_k3_jumps_20s patch by Petri Hintukainen.
++
++2006-08-29: Version 1.10
++
++- The cRecording:Title() method now defaults to original formatting.
++
++2006-09-04: Version 1.11
++
++- Removed unused variable from cRecording::Title() method (Thanks to C.Y.M.).
++- Some modifications to the rename recordings patch (Thanks to Firefly).
++
++2006-09-13: Version 1.12
++
++- More modifications to the rename recordings patch (Thanks to Firefly).
++
++2006-10-01: Version 1.13
++
++- Removed unnecessary syslog printing (Thanks to Firefly).
+diff -Nru vdr-1.4.4-vanilla/config.c vdr-1.4.4-liemikuutio/config.c
+--- vdr-1.4.4-vanilla/config.c 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/config.c 2006-11-04 18:28:33.000000000 +0200
+@@ -275,6 +275,11 @@
+ CurrentDolby = 0;
+ InitialChannel = 0;
+ InitialVolume = -1;
++ ShowRecDate = 1;
++ ShowRecTime = 1;
++ ShowRecLength = 0;
++ ShowProgressBar = 0;
++ MenuCmdPosition = 0;
+ }
+
+ cSetup& cSetup::operator= (const cSetup &s)
+@@ -436,6 +441,11 @@
+ else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value);
+ else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = atoi(Value);
+ else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value);
++ else if (!strcasecmp(Name, "ShowRecDate")) ShowRecDate = atoi(Value);
++ else if (!strcasecmp(Name, "ShowRecTime")) ShowRecTime = atoi(Value);
++ else if (!strcasecmp(Name, "ShowRecLength")) ShowRecLength = atoi(Value);
++ else if (!strcasecmp(Name, "ShowProgressBar")) ShowProgressBar = atoi(Value);
++ else if (!strcasecmp(Name, "MenuCmdPosition")) MenuCmdPosition = atoi(Value);
+ else
+ return false;
+ return true;
+@@ -504,6 +514,11 @@
+ Store("CurrentDolby", CurrentDolby);
+ Store("InitialChannel", InitialChannel);
+ Store("InitialVolume", InitialVolume);
++ Store("ShowRecDate", ShowRecDate);
++ Store("ShowRecTime", ShowRecTime);
++ Store("ShowRecLength", ShowRecLength);
++ Store("ShowProgressBar", ShowProgressBar);
++ Store("MenuCmdPosition", MenuCmdPosition);
+
+ Sort();
+
+diff -Nru vdr-1.4.4-vanilla/config.h vdr-1.4.4-liemikuutio/config.h
+--- vdr-1.4.4-vanilla/config.h 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/config.h 2006-11-04 18:28:33.000000000 +0200
+@@ -35,6 +35,8 @@
+ // plugins to work with newer versions of the core VDR as long as no
+ // VDR header files have changed.
+
++#define LIEMIKUUTIO 113
++
+ #define MAXPRIORITY 99
+ #define MAXLIFETIME 99
+
+@@ -252,6 +254,7 @@
+ int CurrentDolby;
+ int InitialChannel;
+ int InitialVolume;
++ int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition;
+ int __EndData__;
+ cSetup(void);
+ cSetup& operator= (const cSetup &s);
+diff -Nru vdr-1.4.4-vanilla/i18n.c vdr-1.4.4-liemikuutio/i18n.c
+--- vdr-1.4.4-vanilla/i18n.c 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/i18n.c 2006-11-04 18:28:33.000000000 +0200
+@@ -6126,6 +6126,358 @@
+ "Ingen titel",
+ "Bez názvu",
+ },
++ { "Rename recording",
++ "Aufzeichnung umbenennen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Renommer l'enregistrement",
++ "",//TODO
++ "Nimeä tallenne",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "¿ÕàÕØÜÕÝÞÒÐâì ×ÐßØáì",
++ "",//TODO
++ "Ümbernimetamine",
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.OSD$Main menu command position",
++ "Befehle Position im Hauptmenü",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Position des commandes dans le menu",
++ "",//TODO
++ "Komentojen sijainti päävalikossa",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "ÀÐ×ÜÕéÕÝØÕ ÚÞÜÐÝÔ Ò ÓÛÐÒÝÞÜ ÜÕÝî",
++ "",//TODO
++ "Käsu asukoht peamenüüs",
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.EPG$Show progress bar",
++ "Zeitbalken anzeigen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Montrer la barre de progression",
++ "",//TODO
++ "Näytä aikajana",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Edenemisriba",
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.Recording$Show date",
++ "Aufnahmedatum anzeigen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Montrer la date d'enregistrement",
++ "",//TODO
++ "Näytä tallenteen päiväys",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "¿ÞÚÐ×ëÒÐâì ÔÐâã",
++ "",//TODO
++ "Salvestuse kuupäev",
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.Recording$Show time",
++ "AufnahmeZeit anzeigen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Montrer l'heure d'enregistrement",
++ "",//TODO
++ "Näytä tallenteen ajankohta",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "¿ÞÚÐ×ëÒÐâì ÒàÕÜï ×ÐßØáØ",
++ "",//TODO
++ "Salvestuse kellaaeg",
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.Recording$Show length",
++ "Länge der Aufnahme anzeigen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Monter la longueur de l'enregistrement",
++ "",//TODO
++ "Näytä tallenteen kesto",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "¿ÞÚÐ×ëÒÐâì ßàÞÔÞÛÖØâÕÛìÝÞáâì ×ÐßØáØ",
++ "",//TODO
++ "Salvestuse pikkus",
++ "",//TODO
++ "",//TODO
++ },
++ { "Path",
++ "Pfad",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Dossiers",
++ "",//TODO
++ "Polku",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Teekond",
++ "",//TODO
++ "",//TODO
++ },
++ { "Date",
++ "Datum",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Päiväys",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Length",
++ "Länge",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Pituus",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Size",
++ "Größe",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Koko",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Delete marks information?",
++ "Marks löschen?",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Poista tallenteen merkinnät?",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Delete resume information?",
++ "Resume löschen?",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Poista tallenteen paluutiedot?",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Rename$Up",
++ "Höher",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Haut",
++ "",//TODO
++ "Ylemmäs",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Üles",
++ "",//TODO
++ "",//TODO
++ },
++ { "Rename$Down",
++ "Tiefer",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Bas",
++ "",//TODO
++ "Alemmas",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Alla",
++ "",//TODO
++ "",//TODO
++ },
++ { "Rename$Next",
++ "Nächster",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Suivant",
++ "",//TODO
++ "Seuraava",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Järgmine",
++ "",//TODO
++ "",//TODO
++ },
++ { "Rename$Previous",
++ "Vorheriger",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Précédent",
++ "",//TODO
++ "Edellinen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Eelmine",
++ "",//TODO
++ "",//TODO
++ },
+ { NULL }
+ };
+
+diff -Nru vdr-1.4.4-vanilla/menu.c vdr-1.4.4-liemikuutio/menu.c
+--- vdr-1.4.4-vanilla/menu.c 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/menu.c 2006-11-04 18:28:33.000000000 +0200
+@@ -13,6 +13,7 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#include <math.h>
+ #include "channels.h"
+ #include "config.h"
+ #include "cutter.h"
+@@ -664,7 +665,21 @@
+ Add(new cMenuEditBitItem( tr("VPS"), &data.flags, tfVps));
+ Add(new cMenuEditIntItem( tr("Priority"), &data.priority, 0, MAXPRIORITY));
+ Add(new cMenuEditIntItem( tr("Lifetime"), &data.lifetime, 0, MAXLIFETIME));
+- Add(new cMenuEditStrItem( tr("File"), data.file, sizeof(data.file), tr(FileNameChars)));
++ char* p = strrchr(data.file, '~');
++ if (p) {
++ p++;
++ strn0cpy(name, p, sizeof(name));
++ strn0cpy(path, data.file, sizeof(path));
++ p = strrchr(path, '~');
++ if (p)
++ p[0] = 0;
++ }
++ else {
++ strn0cpy(name, data.file, sizeof(name));
++ strn0cpy(path, "", sizeof(path));
++ }
++ Add(new cMenuEditStrItem( tr("File"), name, sizeof(name), tr(FileNameChars)));
++ Add(new cMenuEditRecPathItem(tr("Path"), path, sizeof(path)));
+ SetFirstDayItem();
+ }
+ Timers.IncBeingEdited();
+@@ -704,6 +719,10 @@
+ Skins.Message(mtError, tr("*** Invalid Channel ***"));
+ break;
+ }
++ if(strlen(path))
++ snprintf(data.file, sizeof(data.file), "%s~%s", path, name);
++ else
++ snprintf(data.file, sizeof(data.file), "%s", name);
+ if (!*data.file)
+ strcpy(data.file, data.Channel()->ShortName(true));
+ if (timer) {
+@@ -1007,7 +1026,8 @@
+ const cChannel *channel;
+ bool withDate;
+ int timerMatch;
+- cMenuScheduleItem(const cEvent *Event, cChannel *Channel = NULL, bool WithDate = false);
++ bool withBar;
++ cMenuScheduleItem(const cEvent *Event, cChannel *Channel = NULL, bool WithDate = false, bool WithBar = false);
+ static void SetSortMode(eScheduleSortMode SortMode) { sortMode = SortMode; }
+ static void IncSortMode(void) { sortMode = eScheduleSortMode((sortMode == ssmAllAll) ? ssmAllThis : sortMode + 1); }
+ static eScheduleSortMode SortMode(void) { return sortMode; }
+@@ -1017,12 +1037,13 @@
+
+ cMenuScheduleItem::eScheduleSortMode cMenuScheduleItem::sortMode = ssmAllThis;
+
+-cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event, cChannel *Channel, bool WithDate)
++cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event, cChannel *Channel, bool WithDate, bool WithBar)
+ {
+ event = Event;
+ channel = Channel;
+ withDate = WithDate;
+ timerMatch = tmNone;
++ withBar = WithBar;
+ Update(true);
+ }
+
+@@ -1039,6 +1060,17 @@
+
+ static char *TimerMatchChars = " tT";
+
++static const char * const ProgressBar[7] =
++{
++ "[ ]",
++ "[| ]",
++ "[|| ]",
++ "[||| ]",
++ "[|||| ]",
++ "[||||| ]",
++ "[||||||]"
++};
++
+ bool cMenuScheduleItem::Update(bool Force)
+ {
+ bool result = false;
+@@ -1052,7 +1084,14 @@
+ if (channel && withDate)
+ asprintf(&buffer, "%d\t%.*s\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), 6, *event->GetDateString(), *event->GetTimeString(), t, v, r, event->Title());
+ else if (channel)
+- asprintf(&buffer, "%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), *event->GetTimeString(), t, v, r, event->Title());
++ if (Setup.ShowProgressBar && withBar) {
++ int progress = (int)roundf( (float)(time(NULL) - event->StartTime()) / (float)(event->Duration()) * 6.0 );
++ if (progress < 0) progress = 0;
++ else if (progress > 6) progress = 6;
++ asprintf(&buffer, "%d\t%.*s\t%s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), *event->GetTimeString(), ProgressBar[progress], t, v, r, event->Title());
++ }
++ else
++ asprintf(&buffer, "%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), *event->GetTimeString(), t, v, r, event->Title());
+ else
+ asprintf(&buffer, "%.*s\t%s\t%c%c%c\t%s", 6, *event->GetDateString(), *event->GetTimeString(), t, v, r, event->Title());
+ SetText(buffer, false);
+@@ -1086,7 +1125,7 @@
+ const cEvent *cMenuWhatsOn::scheduleEvent = NULL;
+
+ cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr)
+-:cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH, 7, 6, 4)
++:cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH, 7, 6, 4, 4)
+ {
+ now = Now;
+ helpKeys = -1;
+@@ -1098,7 +1137,7 @@
+ if (Schedule) {
+ const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent();
+ if (Event)
+- Add(new cMenuScheduleItem(Event, Channel), Channel->Number() == CurrentChannelNr);
++ Add(new cMenuScheduleItem(Event, Channel, false, Now), Channel->Number() == CurrentChannelNr);
+ }
+ }
+ }
+@@ -1823,7 +1862,7 @@
+ fileName = strdup(Recording->FileName());
+ name = NULL;
+ totalEntries = newEntries = 0;
+- SetText(Recording->Title('\t', true, Level));
++ SetText(Recording->Title('\t', true, Level, false));
+ if (*Text() == '\t')
+ name = strdup(Text() + 2); // 'Text() + 2' to skip the two '\t'
+ }
+@@ -1840,14 +1879,166 @@
+ if (New)
+ newEntries++;
+ char *buffer = NULL;
+- asprintf(&buffer, "%d\t%d\t%s", totalEntries, newEntries, name);
++ switch (Setup.ShowRecTime + Setup.ShowRecDate + Setup.ShowRecLength) {
++ case 0:
++ asprintf(&buffer, "%s", name);
++ break;
++ case 1:
++ asprintf(&buffer, "%d\t%s", totalEntries, name);
++ break;
++ case 2:
++ default:
++ asprintf(&buffer, "%d\t%d\t%s", totalEntries, newEntries, name);
++ break;
++ case 3:
++ asprintf(&buffer, "%d\t%d\t\t%s", totalEntries, newEntries, name);
++ break;
++ }
+ SetText(buffer, false);
+ }
+
++// --- cMenuRenameRecording --------------------------------------------------
++
++class cMenuRenameRecording : public cOsdMenu {
++private:
++ int lifetime;
++ int priority;
++ char name[MaxFileName];
++ char path[MaxFileName];
++ cOsdItem *marksItem, *resumeItem;
++ bool isResume, isMarks;
++ cRecording *recording;
++public:
++ cMenuRenameRecording(cRecording *Recording);
++ virtual eOSState ProcessKey(eKeys Key);
++};
++
++cMenuRenameRecording::cMenuRenameRecording(cRecording *Recording)
++:cOsdMenu(tr("Rename recording"), 12)
++{
++ cMarks marks;
++ char *buffer = NULL;
++
++ recording = Recording;
++ priority = recording->priority;
++ lifetime = recording->lifetime;
++
++ char* p = strrchr(recording->Name(), '~');
++ if (p) {
++ p++;
++ strn0cpy(name, p, sizeof(name));
++ strn0cpy(path, recording->Name(), sizeof(path));
++ p = strrchr(path, '~');
++ if (p)
++ p[0] = 0;
++ }
++ else {
++ strn0cpy(name, recording->Name(), sizeof(name));
++ strn0cpy(path, "", sizeof(path));
++ }
++ Add(new cMenuEditStrItem(tr("Name"), name, sizeof(name), tr(FileNameChars)));
++ Add(new cMenuEditRecPathItem(tr("Path"), path, sizeof(path) ));
++ Add(new cMenuEditIntItem(tr("Priority"), &priority, 0, MAXPRIORITY ));
++ Add(new cMenuEditIntItem(tr("Lifetime"), &lifetime, 0, MAXLIFETIME ));
++
++ Add(new cOsdItem("", osUnknown, false));
++
++ asprintf(&buffer, "%s:\t%s", tr("Date"), *DayDateTime(recording->start));
++ Add(new cOsdItem(buffer, osUnknown, false));
++ free(buffer);
++
++ cChannel *channel = Channels.GetByChannelID(((cRecordingInfo *)recording->Info())->ChannelID());
++ if (channel) {
++ asprintf(&buffer, "%s:\t%s", tr("Channel"), *ChannelString(channel, 0));
++ Add(new cOsdItem(buffer, osUnknown, false));
++ free(buffer);
++ }
++
++ cIndexFile *index = new cIndexFile(recording->FileName(), false);
++ if (index) {
++ asprintf(&buffer, "%s:\t%s", tr("Length"), *IndexToHMSF(index->Last()));
++ Add(new cOsdItem(buffer, osUnknown, false));
++ free(buffer);
++ }
++ delete index;
++
++ int dirSize = DirSizeMB(recording->FileName());
++ if (dirSize > 9999)
++ asprintf(&buffer, "%s:\t%.2f GB", tr("Size"), dirSize / 1024.0);
++ else
++ asprintf(&buffer, "%s:\t%d MB", tr("Size"), dirSize);
++ Add(new cOsdItem(buffer, osUnknown, false));
++ free(buffer);
++
++ Add(new cOsdItem("", osUnknown, false));
++
++ isMarks = marks.Load(recording->FileName()) && marks.Count();
++ marksItem = new cOsdItem(tr("Delete marks information?"), osUser1, isMarks);
++ Add(marksItem);
++
++ cResumeFile ResumeFile(recording->FileName());
++ isResume = (ResumeFile.Read() != -1);
++ resumeItem = new cOsdItem(tr("Delete resume information?"), osUser2, isResume);
++ Add(resumeItem);
++}
++
++eOSState cMenuRenameRecording::ProcessKey(eKeys Key)
++{
++ eOSState state = cOsdMenu::ProcessKey(Key);
++
++ if (state == osUnknown) {
++ if (Key == kOk) {
++ char buffer[MaxFileName];
++ if (strlen(path))
++ snprintf(buffer, sizeof(buffer), "%s~%s", path, name);
++ else
++ snprintf(buffer, sizeof(buffer), "%s", name);
++ if (recording->Rename(buffer, &priority, &lifetime)) {
++ Recordings.ChangeState();
++ Recordings.TouchUpdate();
++ return osRecordings;
++ }
++ else
++ Skins.Message(mtError, tr("Error while accessing recording!"));
++ }
++ return osContinue;
++ }
++ else if (state == osUser1) {
++ if (isMarks && Interface->Confirm(tr("Delete marks information?"))) {
++ cMarks marks;
++ marks.Load(recording->FileName());
++ cMark *mark = marks.First();
++ while (mark) {
++ cMark *nextmark = marks.Next(mark);
++ marks.Del(mark);
++ mark = nextmark;
++ }
++ marks.Save();
++ isMarks = false;
++ marksItem->SetSelectable(isMarks);
++ SetCurrent(First());
++ Display();
++ }
++ return osContinue;
++ }
++ else if (state == osUser2) {
++ if (isResume && Interface->Confirm(tr("Delete resume information?"))) {
++ cResumeFile ResumeFile(recording->FileName());
++ ResumeFile.Delete();
++ isResume = false;
++ resumeItem->SetSelectable(isResume);
++ SetCurrent(First());
++ Display();
++ }
++ return osContinue;
++ }
++ return state;
++}
++
+ // --- cMenuRecordings -------------------------------------------------------
+
+ cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus)
+-:cOsdMenu(Base ? Base : tr("Recordings"), 9, 7)
++:cOsdMenu(Base ? Base : tr("Recordings"), 9, 7, 7)
+ {
+ base = Base ? strdup(Base) : NULL;
+ level = Setup.RecordingDirs ? Level : -1;
+@@ -2067,6 +2258,19 @@
+ return osContinue;
+ }
+
++eOSState cMenuRecordings::Rename(void)
++{
++ if (HasSubMenu() || Count() == 0)
++ return osContinue;
++ cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
++ if (ri && !ri->IsDirectory()) {
++ cRecording *recording = GetRecording(ri);
++ if (recording)
++ return AddSubMenu(new cMenuRenameRecording(recording));
++ }
++ return osContinue;
++}
++
+ eOSState cMenuRecordings::ProcessKey(eKeys Key)
+ {
+ bool HadSubMenu = HasSubMenu();
+@@ -2079,7 +2283,12 @@
+ case kGreen: return Rewind();
+ case kYellow: return Delete();
+ case kBlue: return Info();
+- case k1...k9: return Commands(Key);
++ case k0: DirOrderState = !DirOrderState;
++ Set(true);
++ return osContinue;
++ case k8: return Rename();
++ case k9:
++ case k1...k7: return Commands(Key);
+ case kNone: if (Recordings.StateChanged(recordingsState))
+ Set(true);
+ break;
+@@ -2181,6 +2390,7 @@
+ Add(new cMenuEditBoolItem(tr("Setup.OSD$Scroll wraps"), &data.MenuScrollWrap));
+ Add(new cMenuEditBoolItem(tr("Setup.OSD$Menu button closes"), &data.MenuButtonCloses));
+ Add(new cMenuEditBoolItem(tr("Setup.OSD$Recording directories"), &data.RecordingDirs));
++ Add(new cMenuEditBoolItem(tr("Setup.OSD$Main menu command position"), &data.MenuCmdPosition, tr("bottom"), tr("top")));
+ SetCurrent(Get(current));
+ Display();
+ }
+@@ -2257,6 +2467,7 @@
+ Add(new cMenuEditIntItem( tr("Setup.EPG$EPG scan timeout (h)"), &data.EPGScanTimeout));
+ Add(new cMenuEditIntItem( tr("Setup.EPG$EPG bugfix level"), &data.EPGBugfixLevel, 0, MAXEPGBUGFIXLEVEL));
+ Add(new cMenuEditIntItem( tr("Setup.EPG$EPG linger time (min)"), &data.EPGLinger, 0));
++ Add(new cMenuEditBoolItem(tr("Setup.EPG$Show progress bar"), &data.ShowProgressBar));
+ Add(new cMenuEditBoolItem(tr("Setup.EPG$Set system time"), &data.SetSystemTime));
+ if (data.SetSystemTime)
+ Add(new cMenuEditTranItem(tr("Setup.EPG$Use time from transponder"), &data.TimeTransponder, &data.TimeSource));
+@@ -2572,6 +2783,9 @@
+ Add(new cMenuEditIntItem( tr("Setup.Recording$Instant rec. time (min)"), &data.InstantRecordTime, 1, MAXINSTANTRECTIME));
+ Add(new cMenuEditIntItem( tr("Setup.Recording$Max. video file size (MB)"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZE));
+ Add(new cMenuEditBoolItem(tr("Setup.Recording$Split edited files"), &data.SplitEditedFiles));
++ Add(new cMenuEditBoolItem(tr("Setup.Recording$Show date"), &data.ShowRecDate));
++ Add(new cMenuEditBoolItem(tr("Setup.Recording$Show time"), &data.ShowRecTime));
++ Add(new cMenuEditBoolItem(tr("Setup.Recording$Show length"), &data.ShowRecLength));
+ }
+
+ // --- cMenuSetupReplay ------------------------------------------------------
+@@ -2875,6 +3089,7 @@
+ replaying = NewReplaying;
+ // Replay control:
+ if (replaying && !stopReplayItem)
++ if (Setup.MenuCmdPosition) Ins(stopReplayItem = new cOsdItem(tr(" Stop replaying"), osStopReplay)); else
+ Add(stopReplayItem = new cOsdItem(tr(" Stop replaying"), osStopReplay));
+ else if (stopReplayItem && !replaying) {
+ Del(stopReplayItem->Index());
+@@ -2888,6 +3103,7 @@
+ // Editing control:
+ bool CutterActive = cCutter::Active();
+ if (CutterActive && !cancelEditingItem) {
++ if (Setup.MenuCmdPosition) Ins(cancelEditingItem = new cOsdItem(tr(" Cancel editing"), osCancelEdit)); else
+ Add(cancelEditingItem = new cOsdItem(tr(" Cancel editing"), osCancelEdit));
+ result = true;
+ }
+@@ -2910,6 +3126,7 @@
+ asprintf(&buffer, "%s%s", STOP_RECORDING, s);
+ cOsdItem *item = new cOsdItem(osStopRecord);
+ item->SetText(buffer, false);
++ if (Setup.MenuCmdPosition) Ins(item); else
+ Add(item);
+ if (!stopRecordingItem)
+ stopRecordingItem = item;
+@@ -4174,6 +4391,10 @@
+ case kFastFwd:
+ case kRight: Forward(); break;
+ case kRed: TimeSearch(); break;
++ case k1|k_Repeat:
++ case k1: SkipSeconds(-20); break;
++ case k3|k_Repeat:
++ case k3: SkipSeconds( 20); break;
+ case kGreen|k_Repeat:
+ case kGreen: SkipSeconds(-60); break;
+ case kYellow|k_Repeat:
+diff -Nru vdr-1.4.4-vanilla/menu.h vdr-1.4.4-liemikuutio/menu.h
+--- vdr-1.4.4-vanilla/menu.h 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/menu.h 2006-11-04 18:28:33.000000000 +0200
+@@ -35,6 +35,8 @@
+ private:
+ cTimer *timer;
+ cTimer data;
++ char name[MaxFileName];
++ char path[MaxFileName];
+ int channel;
+ bool addIfConfirmed;
+ cMenuEditDateItem *firstday;
+@@ -171,6 +173,7 @@
+ eOSState Delete(void);
+ eOSState Info(void);
+ eOSState Commands(eKeys Key = kNone);
++ eOSState Rename(void);
+ protected:
+ cRecording *GetRecording(cMenuRecordingItem *Item);
+ public:
+diff -Nru vdr-1.4.4-vanilla/menuitems.c vdr-1.4.4-liemikuutio/menuitems.c
+--- vdr-1.4.4-vanilla/menuitems.c 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/menuitems.c 2006-11-04 18:28:33.000000000 +0200
+@@ -547,6 +547,156 @@
+ return osContinue;
+ }
+
++// --- cMenuEditRecPathItem --------------------------------------------------
++
++cMenuEditRecPathItem::cMenuEditRecPathItem(const char* Name, char* Path,
++ int Length): cMenuEditStrItem(Name, Path, Length, tr(FileNameChars))
++{
++ SetBase(Path);
++}
++
++cMenuEditRecPathItem::~cMenuEditRecPathItem()
++{
++}
++
++void cMenuEditRecPathItem::SetBase(const char* Path)
++{
++ if (!Path)
++ base[0] = 0;
++ strn0cpy(base, Path, sizeof(base));
++ char* p = strrchr(base, '~');
++ if (p)
++ p[0] = 0;
++ else
++ base[0] = 0;
++}
++
++void cMenuEditRecPathItem::FindNextLevel()
++{
++ char item[MaxFileName];
++
++ for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording))
++ {
++ char* p;
++ strn0cpy(item, recording->Name(), sizeof(item));
++ stripspace(value);
++ if (!strlen(value))
++ p = strchr(item, '~');
++ else {
++ if (strstr(item, value) != item)
++ continue;
++ if (item[strlen(value)] != '~')
++ continue;
++ p = strchr(item + strlen(value) + 1, '~');
++ }
++ if (!p)
++ continue;
++ p[0] = 0;
++ strn0cpy(base, value, length);
++ strn0cpy(value, item, length);
++ return;
++ }
++}
++
++void cMenuEditRecPathItem::Find(bool Next)
++{
++ char item[MaxFileName];
++ char lastItem[MaxFileName] = "";
++
++ for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording))
++ {
++ const char* recName = recording->Name();
++ if (strlen(base) && strstr(recName, base) != recName)
++ continue;
++ if (strlen(base) && recName[strlen(base)] != '~')
++ continue;
++ strn0cpy(item, recName, sizeof(item));
++ char* p = strchr(item + strlen(base) + 1, '~');
++ if (!p)
++ continue;
++ p[0] = 0;
++ if (!Next && (strcmp(item, value) == 0)) {
++ if (strlen(lastItem))
++ strn0cpy(value, lastItem, length);
++ return;
++ }
++ if (strcmp(lastItem, item) != 0) {
++ if(Next && strlen(lastItem) && strcmp(lastItem, value) == 0) {
++ strn0cpy(value, item, length);
++ return;
++ }
++ strn0cpy(lastItem, item, sizeof(lastItem));
++ }
++ }
++}
++
++void cMenuEditRecPathItem::SetHelpKeys(void)
++{
++ cSkinDisplay::Current()->SetButtons(tr("Rename$Up"), tr("Rename$Down"), tr("Rename$Previous"), tr("Rename$Next"));
++}
++
++eOSState cMenuEditRecPathItem::ProcessKey(eKeys Key)
++{
++ switch (Key) {
++ case kLeft:
++ case kRed: // one level up
++ if (!InEditMode())
++ return cMenuEditItem::ProcessKey(Key);
++ strn0cpy(value, base, length);
++ SetBase(base);
++ pos = strlen(base);
++ if (pos)
++ pos++;
++ if (!strlen(value))
++ strn0cpy(value, " ", length);
++ break;
++ case kRight:
++ case kGreen: // one level down
++ if (InEditMode())
++ FindNextLevel();
++ if (!strlen(value))
++ strn0cpy(value, " ", length);
++ pos = strlen(base);
++ if (pos)
++ pos++;
++ SetHelpKeys();
++ break;
++ case kUp|k_Repeat:
++ case kUp:
++ case kYellow|k_Repeat:
++ case kYellow: // previous directory in list
++ if (!InEditMode())
++ return cMenuEditItem::ProcessKey(Key);
++ Find(false);
++ pos = strlen(base);
++ if (pos)
++ pos++;
++ break;
++ case kDown|k_Repeat:
++ case kDown:
++ case kBlue|k_Repeat:
++ case kBlue: // next directory in list
++ if (!InEditMode())
++ return cMenuEditItem::ProcessKey(Key);
++ Find(true);
++ pos = strlen(base);
++ if (pos)
++ pos++;
++ break;
++ case kOk: // done
++ if (!InEditMode())
++ return cMenuEditItem::ProcessKey(Key);
++ stripspace(value);
++ cSkinDisplay::Current()->SetButtons(NULL);
++ pos = -1;
++ break;
++ default:
++ return cMenuEditItem::ProcessKey(Key);
++ }
++ Set();
++ return osContinue;
++}
++
+ // --- cMenuEditStraItem -----------------------------------------------------
+
+ cMenuEditStraItem::cMenuEditStraItem(const char *Name, int *Value, int NumStrings, const char * const *Strings)
+diff -Nru vdr-1.4.4-vanilla/menuitems.h vdr-1.4.4-liemikuutio/menuitems.h
+--- vdr-1.4.4-vanilla/menuitems.h 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/menuitems.h 2006-11-04 18:28:33.000000000 +0200
+@@ -78,20 +78,20 @@
+ class cMenuEditStrItem : public cMenuEditItem {
+ private:
+ char *orgValue;
+- char *value;
+- int length;
+- char *allowed;
+- int pos;
+ bool insert, newchar, uppercase;
+ const char *charMap;
+ const char *currentChar;
+ eKeys lastKey;
+ cTimeMs autoAdvanceTimeout;
+- void SetHelpKeys(void);
+ void AdvancePos(void);
+- virtual void Set(void);
+ char Inc(char c, bool Up);
+ protected:
++ char *value;
++ int length;
++ char *allowed;
++ int pos;
++ virtual void SetHelpKeys(void);
++ virtual void Set(void);
+ bool InEditMode(void) { return pos >= 0; }
+ public:
+ cMenuEditStrItem(const char *Name, char *Value, int Length, const char *Allowed);
+@@ -99,6 +99,19 @@
+ virtual eOSState ProcessKey(eKeys Key);
+ };
+
++class cMenuEditRecPathItem : public cMenuEditStrItem {
++protected:
++ char base[MaxFileName];
++ virtual void SetHelpKeys(void);
++ void SetBase(const char* Path);
++ void FindNextLevel();
++ void Find(bool Next);
++public:
++ cMenuEditRecPathItem(const char* Name, char* Path, int Length);
++ ~cMenuEditRecPathItem();
++ virtual eOSState ProcessKey(eKeys Key);
++ };
++
+ class cMenuEditStraItem : public cMenuEditIntItem {
+ private:
+ const char * const *strings;
+diff -Nru vdr-1.4.4-vanilla/osdbase.c vdr-1.4.4-liemikuutio/osdbase.c
+--- vdr-1.4.4-vanilla/osdbase.c 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/osdbase.c 2006-11-04 18:28:33.000000000 +0200
+@@ -77,6 +77,7 @@
+ {
+ isMenu = true;
+ digit = 0;
++ key_nr = -1;
+ hasHotkeys = false;
+ title = NULL;
+ SetTitle(Title);
+@@ -111,7 +112,7 @@
+ digit = -1; // prevents automatic hotkeys - input already has them
+ if (digit >= 0) {
+ digit++;
+- snprintf(buffer, sizeof(buffer), " %c %s", (digit < 10) ? '0' + digit : ' ' , s);
++ snprintf(buffer, sizeof(buffer), " %2d%s %s", digit, (digit > 9) ? "" : " ", s);
+ s = buffer;
+ }
+ }
+@@ -425,18 +426,60 @@
+ }
+ }
+
++#define MENUKEY_TIMEOUT 1500
++
+ eOSState cOsdMenu::HotKey(eKeys Key)
+ {
+- for (cOsdItem *item = First(); item; item = Next(item)) {
++ bool match = false;
++ bool highlight = false;
++ int item_nr;
++ int i;
++
++ if (Key == kNone) {
++ if (lastActivity.TimedOut())
++ Key = kOk;
++ else
++ return osContinue;
++ }
++ else {
++ lastActivity.Set(MENUKEY_TIMEOUT);
++ }
++ for (cOsdItem *item = Last(); item; item = Prev(item)) {
+ const char *s = item->Text();
+- if (s && (s = skipspace(s)) != NULL) {
+- if (*s == Key - k1 + '1') {
++ i = 0;
++ item_nr = 0;
++ if (s && (s = skipspace(s)) != '\0' && '0' <= s[i] && s[i] <= '9') {
++ do {
++ item_nr = item_nr * 10 + (s[i] - '0');
++ }
++ while ( !((s[++i] == '\t')||(s[i] == ' ')) && (s[i] != '\0') && ('0' <= s[i]) && (s[i] <= '9'));
++ if ((Key == kOk) && (item_nr == key_nr)) {
+ current = item->Index();
+ cRemote::Put(kOk, true);
++ key_nr = -1;
+ break;
+ }
++ else if (Key != kOk) {
++ if (!highlight && (item_nr == (Key - k0))) {
++ highlight = true;
++ current = item->Index();
++ }
++ if (!match && (key_nr == -1) && ((item_nr / 10) == (Key - k0))) {
++ match = true;
++ key_nr = (Key - k0);
++ }
++ else if (((key_nr == -1) && (item_nr == (Key - k0))) || (!match && (key_nr >= 0) && (item_nr == (10 * key_nr + Key - k0)))) {
++ current = item->Index();
++ cRemote::Put(kOk, true);
++ key_nr = -1;
++ break;
++ }
++ }
+ }
+ }
++ if ((!match) && (Key != kNone)) {
++ key_nr = -1;
++ }
+ return osContinue;
+ }
+
+@@ -475,8 +518,8 @@
+ }
+ }
+ switch (Key) {
+- case k0: return osUnknown;
+- case k1...k9: return hasHotkeys ? HotKey(Key) : osUnknown;
++ case kNone:
++ case k0...k9: return hasHotkeys ? HotKey(Key) : osUnknown;
+ case kUp|k_Repeat:
+ case kUp: CursorUp(); break;
+ case kDown|k_Repeat:
+diff -Nru vdr-1.4.4-vanilla/osdbase.h vdr-1.4.4-liemikuutio/osdbase.h
+--- vdr-1.4.4-vanilla/osdbase.h 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/osdbase.h 2006-11-04 18:28:33.000000000 +0200
+@@ -94,6 +94,8 @@
+ char *status;
+ int digit;
+ bool hasHotkeys;
++ int key_nr;
++ cTimeMs lastActivity;
+ protected:
+ cSkinDisplayMenu *DisplayMenu(void) { return displayMenu; }
+ const char *hk(const char *s);
+diff -Nru vdr-1.4.4-vanilla/recording.c vdr-1.4.4-liemikuutio/recording.c
+--- vdr-1.4.4-vanilla/recording.c 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/recording.c 2006-11-04 18:28:33.000000000 +0200
+@@ -45,6 +45,7 @@
+ #endif
+ #define INFOFILESUFFIX "/info.vdr"
+ #define MARKSFILESUFFIX "/marks.vdr"
++#define INDEXFILESUFFIX "/index.vdr"
+
+ #define MINDISKSPACE 1024 // MB
+
+@@ -61,6 +62,7 @@
+ #define MAX_LINK_LEVEL 6
+
+ bool VfatFileSystem = false;
++bool DirOrderState = false;
+
+ cRecordings DeletedRecordings(true);
+
+@@ -688,6 +690,8 @@
+ int cRecording::Compare(const cListObject &ListObject) const
+ {
+ cRecording *r = (cRecording *)&ListObject;
++ if (DirOrderState)
++ return strcasecmp(FileName(), r->FileName());
+ return strcasecmp(SortName(), r->SortName());
+ }
+
+@@ -703,7 +707,7 @@
+ return fileName;
+ }
+
+-const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) const
++const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level, bool Original) const
+ {
+ char New = NewIndicator && IsNew() ? '*' : ' ';
+ free(titleBuffer);
+@@ -716,6 +720,7 @@
+ s++;
+ else
+ s = name;
++ if (Original) {
+ asprintf(&titleBuffer, "%02d.%02d.%02d%c%02d:%02d%c%c%s",
+ t->tm_mday,
+ t->tm_mon + 1,
+@@ -726,6 +731,42 @@
+ New,
+ Delimiter,
+ s);
++ }
++ else {
++ char RecLength[5], RecDate[9], RecTime[6], RecDelimiter[2];
++ snprintf(RecLength, sizeof(RecLength), "---");
++ if (Setup.ShowRecLength && FileName()) {
++ char *filename = NULL;
++ asprintf(&filename, "%s%s", FileName(), INDEXFILESUFFIX);
++ if (filename) {
++ if (access(filename, R_OK) == 0) {
++ struct stat buf;
++ if (stat(filename, &buf) == 0) {
++ struct tIndex { int offset; uchar type; uchar number; short reserved; };
++ int delta = buf.st_size % sizeof(tIndex);
++ if (delta) {
++ delta = sizeof(tIndex) - delta;
++ esyslog("ERROR: invalid file size (%ld) in '%s'", buf.st_size, filename);
++ }
++ snprintf(RecLength, sizeof(RecLength), "%ld'", (buf.st_size + delta) / sizeof(tIndex) / SecondsToFrames(60));
++ }
++ }
++ free(filename);
++ }
++ }
++ snprintf(RecDate, sizeof(RecDate), "%02d.%02d.%02d", t->tm_mday, t->tm_mon + 1, t->tm_year % 100);
++ snprintf(RecTime, sizeof(RecTime), "%02d:%02d", t->tm_hour, t->tm_min);
++ snprintf(RecDelimiter, sizeof(RecDelimiter), "%c", Delimiter);
++ asprintf(&titleBuffer, "%s%s%s%c%s%s%s%s",
++ (Setup.ShowRecDate ? RecDate : ""),
++ (Setup.ShowRecDate && Setup.ShowRecTime ? RecDelimiter : ""),
++ (Setup.ShowRecTime ? RecTime : ""),
++ New,
++ (Setup.ShowRecTime || Setup.ShowRecDate ? RecDelimiter : ""),
++ (Setup.ShowRecLength ? RecLength : ""),
++ (Setup.ShowRecLength ? RecDelimiter : ""),
++ s);
++ }
+ // let's not display a trailing '~':
+ if (!NewIndicator)
+ stripspace(titleBuffer);
+@@ -838,6 +879,42 @@
+ resume = RESUME_NOT_INITIALIZED;
+ }
+
++bool cRecording::Rename(const char *newName, int *newPriority, int *newLifetime)
++{
++ bool result = false;
++ char *newFileName;
++ struct tm tm_r;
++ struct tm *t = localtime_r(&start, &tm_r);
++ char *localNewName = ExchangeChars(strdup(newName), true);
++ asprintf(&newFileName, NAMEFORMAT, VideoDirectory, localNewName, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, *newPriority, *newLifetime);
++ free(localNewName);
++ if (strcmp(FileName(), newFileName)) {
++ if (access(newFileName, F_OK) == 0) {
++ isyslog("recording %s already exists", newFileName);
++ }
++ else {
++ isyslog("renaming recording %s to %s", FileName(), newFileName);
++ result = MakeDirs(newFileName, true);
++ if (result)
++ result = RenameVideoFile(FileName(), newFileName);
++ if (result) {
++ priority = *newPriority;
++ lifetime = *newLifetime;
++ free(fileName);
++ fileName = strdup(newFileName);
++ free(name);
++ name = strdup(newName);
++ free(sortBuffer);
++ sortBuffer = NULL;
++ free(titleBuffer);
++ titleBuffer = NULL;
++ }
++ }
++ }
++ free(newFileName);
++ return result;
++}
++
+ // --- cRecordings -----------------------------------------------------------
+
+ cRecordings Recordings;
+@@ -1149,8 +1226,6 @@
+ //XXX+ somewhere else???
+ // --- cIndexFile ------------------------------------------------------------
+
+-#define INDEXFILESUFFIX "/index.vdr"
+-
+ // The number of frames to stay off the end in case of time shift:
+ #define INDEXSAFETYLIMIT 150 // frames
+
+diff -Nru vdr-1.4.4-vanilla/recording.h vdr-1.4.4-liemikuutio/recording.h
+--- vdr-1.4.4-vanilla/recording.h 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/recording.h 2006-11-04 18:28:33.000000000 +0200
+@@ -19,6 +19,7 @@
+ #include "tools.h"
+
+ extern bool VfatFileSystem;
++extern bool DirOrderState;
+
+ void RemoveDeletedRecordings(void);
+ void AssertFreeDiskSpace(int Priority = 0, bool Force = false);
+@@ -84,7 +85,7 @@
+ virtual int Compare(const cListObject &ListObject) const;
+ const char *Name(void) const { return name; }
+ const char *FileName(void) const;
+- const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const;
++ const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1, bool Original = true) const;
+ const cRecordingInfo *Info(void) const { return info; }
+ const char *PrefixFileName(char Prefix);
+ int HierarchyLevels(void) const;
+@@ -98,6 +99,9 @@
+ bool Remove(void);
+ // Actually removes the file from the disk
+ // Returns false in case of error
++ bool Rename(const char *newName, int *newPriority, int *newLifetime);
++ // Changes the file name
++ // Returns false in case of error
+ };
+
+ class cRecordings : public cList<cRecording>, public cThread {
+diff -Nru vdr-1.4.4-vanilla/svdrp.c vdr-1.4.4-liemikuutio/svdrp.c
+--- vdr-1.4.4-vanilla/svdrp.c 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/svdrp.c 2006-11-04 18:28:33.000000000 +0200
+@@ -290,6 +290,8 @@
+ " format defined in vdr(5) for the 'epg.data' file. A '.' on a line\n"
+ " by itself terminates the input and starts processing of the data (all\n"
+ " entered data is buffered until the terminating '.' is seen).",
++ "RENR <number> <new name>\n"
++ " Rename recording. Number must be the Number as returned by LSTR command.",
+ "SCAN\n"
+ " Forces an EPG scan. If this is a single DVB device system, the scan\n"
+ " will be done on the primary device unless it is currently recording.",
+@@ -1412,6 +1414,38 @@
+ Reply(250, "EPG scan triggered");
+ }
+
++void cSVDRP::CmdRENR(const char *Option)
++{
++ bool recordings = Recordings.Update(true);
++ if (recordings) {
++ if (*Option) {
++ char *tail;
++ int n = strtol(Option, &tail, 10);
++ cRecording *recording = Recordings.Get(n - 1);
++ if (recording && tail && tail != Option) {
++ int priority = recording->priority;
++ int lifetime = recording->lifetime;
++ char *oldName = strdup(recording->Name());
++ tail = skipspace(tail);
++ if (recording->Rename(tail, &priority, &lifetime)) {
++ Reply(250, "Renamed \"%s\" to \"%s\"", oldName, recording->Name());
++ Recordings.ChangeState();
++ Recordings.TouchUpdate();
++ }
++ else
++ Reply(501, "Renaming \"%s\" to \"%s\" failed", oldName, tail);
++ free(oldName);
++ }
++ else
++ Reply(501, "Recording not found or wrong syntax");
++ }
++ else
++ Reply(501, "Missing Input settings");
++ }
++ else
++ Reply(550, "No recordings available");
++}
++
+ void cSVDRP::CmdSTAT(const char *Option)
+ {
+ if (*Option) {
+@@ -1526,6 +1560,7 @@
+ else if (CMD("PLAY")) CmdPLAY(s);
+ else if (CMD("PLUG")) CmdPLUG(s);
+ else if (CMD("PUTE")) CmdPUTE(s);
++ else if (CMD("RENR")) CmdRENR(s);
+ else if (CMD("SCAN")) CmdSCAN(s);
+ else if (CMD("STAT")) CmdSTAT(s);
+ else if (CMD("UPDT")) CmdUPDT(s);
+diff -Nru vdr-1.4.4-vanilla/svdrp.h vdr-1.4.4-liemikuutio/svdrp.h
+--- vdr-1.4.4-vanilla/svdrp.h 2006-11-04 18:27:33.000000000 +0200
++++ vdr-1.4.4-liemikuutio/svdrp.h 2006-11-04 18:28:33.000000000 +0200
+@@ -78,6 +78,7 @@
+ void CmdPLAY(const char *Option);
+ void CmdPLUG(const char *Option);
+ void CmdPUTE(const char *Option);
++ void CmdRENR(const char *Option);
+ void CmdSCAN(const char *Option);
+ void CmdSTAT(const char *Option);
+ void CmdUPDT(const char *Option);
Added: vdr/vdr/trunk/debian/patches/opt-27-x_subtitles-ttxtsubs-volumebar-fix.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-27-x_subtitles-ttxtsubs-volumebar-fix.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-27-x_subtitles-ttxtsubs-volumebar-fix.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,21 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-27-x_subtitles-ttxtsubs-volumebar-fix.dpatch by Thomas Günther <tom at toms-cafe.de>:
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Fixes bug in opt-27-x_subtitles-ttxtsubs which causes crash with
+## DP: text2skin + replaybar + volumebar
+## DP: (http://www.vdrportal.de/board/thread.php?postid=351009#post351009)
+
+ at DPATCH@
+diff -Nur vdr-1.4.1/vdr.c vdr-1.4.1.new/vdr.c
+--- vdr-1.4.1/vdr.c 2006-06-27 18:34:24.000000000 +0200
++++ vdr-1.4.1.new/vdr.c 2006-06-27 18:35:09.000000000 +0200
+@@ -975,7 +975,7 @@
+ }
+ else
+ cDevice::PrimaryDevice()->SetVolume(NORMALKEY(key) == kVolDn ? -VOLUMEDELTA : VOLUMEDELTA);
+- if (!Menu /*&& !cOsd::IsOpen()*/)
++ if (!Menu && !cOsd::IsOpen())
+ Menu = cDisplayVolume::Create();
+ cDisplayVolume::Process(key);
+ key = kNone; // nobody else needs to see these keys
Added: vdr/vdr/trunk/debian/patches/opt-30-x_analogtv.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-30-x_analogtv.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-30-x_analogtv.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,25 @@
+#!/bin/sh /usr/share/dpatch/dpatch-run
+
+## opt-30-x_analogtv.dpatch by Andreas Kool <akool at gmx.de>
+##
+## extracted from the analogtv plugin 0.3.6
+## original file: vdr-1.3.0.patch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch is needed for the analogtv plugin.
+
+ at DPATCH@
+--- vdr-1.3.0.orig/channels.c 2004-01-04 13:28:49.000000000 +0100
++++ vdr-1.3.0/channels.c 2004-01-04 18:50:40.000000000 +0100
+@@ -347,9 +347,9 @@
+ ST(" S ") q += sprintf(q, "%c", polarization);
+ ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
+ ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
+- ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
++ ST("C T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
+ ST("C T") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
+- ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
++ ST("C T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
+ ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
+ ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
+ ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
Added: vdr/vdr/trunk/debian/patches/opt-35_setup-show-valid.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-35_setup-show-valid.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-35_setup-show-valid.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,83 @@
+#!/bin/sh /usr/share/dpatch/dpatch-run
+
+## opt-35_setup-show-valid.dpatch by ravemax at vdrportal.de
+##
+## downloaded from http://vdrportal.de/board/thread.php?threadid=25984
+## original file: setup_option-show_valid_input.patch.bz2
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Show if there is a valid setup value left or right with < and >.
+
+ at DPATCH@
+diff -ur vdr_orig/menuitems.c vdr_patched/menuitems.c
+--- vdr_orig/menuitems.c 2004-12-05 17:59:12.452421104 +0100
++++ vdr_patched/menuitems.c 2004-12-05 18:01:54.726751656 +0100
+@@ -31,12 +31,18 @@
+ free(value);
+ }
+
+-void cMenuEditItem::SetValue(const char *Value)
++void cMenuEditItem::SetValue(const char *Value, bool HasPre, bool HasSucc)
+ {
+ free(value);
+ value = strdup(Value);
+ char *buffer = NULL;
+- asprintf(&buffer, "%s:\t%s", name, value);
++ const char* fmt;
++ if (HasPre)
++ fmt = HasSucc ? "%s:\t<%s>" : "%s\t<%s";
++ else
++ fmt = HasSucc ? "%s\t%s>" : "%s\t%s";
++
++ asprintf(&buffer, fmt, name, value);
+ SetText(buffer, false);
+ cStatus::MsgOsdCurrentItem(buffer);
+ }
+@@ -56,7 +62,7 @@
+ {
+ char buf[16];
+ snprintf(buf, sizeof(buf), "%d", *value);
+- SetValue(buf);
++ SetValue(buf, (*value > min), (*value < max));
+ }
+
+ eOSState cMenuEditIntItem::ProcessKey(eKeys Key)
+@@ -111,7 +117,7 @@
+ {
+ char buf[16];
+ snprintf(buf, sizeof(buf), "%s", *value ? trueString : falseString);
+- SetValue(buf);
++ SetValue(buf, *value, !*value);
+ }
+
+ // --- cMenuEditBitItem ------------------------------------------------------
+@@ -459,7 +465,7 @@
+
+ void cMenuEditStraItem::Set(void)
+ {
+- SetValue(strings[*value]);
++ SetValue(strings[*value], (*value > min), (*value < max));
+ }
+
+ // --- cMenuEditChanItem -----------------------------------------------------
+@@ -475,7 +481,7 @@
+ char buf[255];
+ cChannel *channel = Channels.GetByNumber(*value);
+ snprintf(buf, sizeof(buf), "%d %s", *value, channel ? channel->Name() : "");
+- SetValue(buf);
++ SetValue(buf, (*value > 1), (*value < Channels.MaxNumber()));
+ }
+
+ eOSState cMenuEditChanItem::ProcessKey(eKeys Key)
+diff -ur vdr_orig/menuitems.h vdr_patched/menuitems.h
+--- vdr_orig/menuitems.h 2004-12-05 17:59:24.719556216 +0100
++++ vdr_patched/menuitems.h 2004-12-05 18:04:29.681195000 +0100
+@@ -21,7 +21,7 @@
+ public:
+ cMenuEditItem(const char *Name);
+ ~cMenuEditItem();
+- void SetValue(const char *Value);
++ void cMenuEditItem::SetValue(const char *Value, bool HasPre=false, bool HasSucc=false);
+ };
+
+ class cMenuEditIntItem : public cMenuEditItem {
Added: vdr/vdr/trunk/debian/patches/opt-36_CutterQueue-AutoDelete.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-36_CutterQueue-AutoDelete.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-36_CutterQueue-AutoDelete.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,255 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-36_CutterQueue-AutoDelete-0.5.dpatch by Petri.Hintukainen at hut.fi
+## http://www.hut.fi/~phintuka/vdr/vdr-1.3.23-CutterQueue_and_CutterAutoDelete.patch
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - adapted to VDR-1.3.25
+##
+## Stefan Wagner <stefanwag at gmx.at>:
+## - added german translation
+## http://vdrportal.de/board/thread.php?postid=525334#post525334
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch to handle recordings that should be cutted in a queue. With this
+## DP: version the original recordings will be removed after cutting.
+
+ at DPATCH@
+--- vdr-1.3.19-orig/cutter.h 2002-06-22 13:03:15.000000000 +0300
++++ vdr-1.3.19/cutter.h 2005-01-26 18:23:48.000000000 +0200
+@@ -9,17 +9,19 @@
+
+ #ifndef __CUTTER_H
+ #define __CUTTER_H
+
+ class cCuttingThread;
++class cMutex;
+
+ class cCutter {
+ private:
+ static char *editedVersionName;
+ static cCuttingThread *cuttingThread;
+ static bool error;
+ static bool ended;
++ static cMutex *cutterLock;
+ public:
+ static bool Start(const char *FileName);
+ static void Stop(void);
+ static bool Active(void);
+ static bool Error(void);
+--- vdr-1.3.19-orig/cutter.c 2004-06-13 19:04:08.000000000 +0300
++++ vdr-1.3.19/cutter.c 2005-01-27 17:24:03.602233992 +0200
+@@ -11,10 +11,11 @@
+ #include "recording.h"
+ #include "remux.h"
+ #include "thread.h"
+ #include "videodir.h"
+
++
+ // --- cCuttingThread --------------------------------------------------------
+
+ class cCuttingThread : public cThread {
+ private:
+ const char *error;
+@@ -176,17 +177,59 @@
+ esyslog("no editing marks found!");
+ }
+
+ // --- cCutter ---------------------------------------------------------------
+
++#define WAIT_BEFORE_NEXT_CUT (10*1000) // 10 seconds
++
++#define CUTTER_QUEUE
++#define CUTTER_AUTO_DELETE
++
++class cStringListObject : public cListObject {
++ public:
++ cStringListObject(const char *s) { str = strdup(s); }
++ ~cStringListObject() { free(str); }
++
++ const char *Value() { return str; }
++ operator const char * () { return str; }
++
++ private:
++ char *str;
++};
++
+ char *cCutter::editedVersionName = NULL;
+ cCuttingThread *cCutter::cuttingThread = NULL;
+ bool cCutter::error = false;
+ bool cCutter::ended = false;
++cMutex *cCutter::cutterLock = new cMutex();
++
++static uint64 /*cCutter::*/lastCuttingEndTime = 0;
++static cList<cStringListObject> /**cCutter::*/cutterQueue /*= new cList<cStringListObject>*/;
+
+ bool cCutter::Start(const char *FileName)
+ {
++ cMutexLock(cutterLock);
++
++#ifdef CUTTER_QUEUE
++ if(FileName) {
++ /* Add file to queue.
++ * If cutter is still active, next cutting will be started
++ * when vdr.c:main calls cCutter::Active and previous cutting has
++ * been stopped > 10 s before
++ */
++ cutterQueue.Add(new cStringListObject(FileName));
++ }
++
++ if (cuttingThread)
++ return true;
++
++ /* cut next file from queue */
++ if(!(cutterQueue.First()))
++ return false;
++ FileName = cutterQueue.First()->Value();
++#endif
++
+ if (!cuttingThread) {
+ error = false;
+ ended = false;
+ cRecording Recording(FileName);
+ const char *evn = Recording.PrefixFileName('%');
+@@ -215,6 +258,8 @@
+
+ void cCutter::Stop(void)
+ {
++ cMutexLock(cutterLock);
++
+ bool Interrupted = cuttingThread && cuttingThread->Active();
+ const char *Error = cuttingThread ? cuttingThread->Error() : NULL;
+ delete cuttingThread;
+@@ -224,37 +271,73 @@
+ isyslog("editing process has been interrupted");
+ if (Error)
+ esyslog("ERROR: '%s' during editing process", Error);
+ RemoveVideoFile(editedVersionName); //XXX what if this file is currently being replayed?
+ Recordings.DelByName(editedVersionName);
++#ifdef CUTTER_QUEUE
++ cutterQueue.Del(cutterQueue.First());
++#endif
+ }
++#ifdef CUTTER_QUEUE
++ lastCuttingEndTime = cTimeMs::Now();
++#endif
+ }
+
+ bool cCutter::Active(void)
+ {
++ cMutexLock(cutterLock);
++
+ if (cuttingThread) {
+ if (cuttingThread->Active())
+ return true;
+ error = cuttingThread->Error();
+ Stop();
+ if (!error)
+ cRecordingUserCommand::InvokeCommand(RUC_EDITEDRECORDING, editedVersionName);
+ free(editedVersionName);
+ editedVersionName = NULL;
+ ended = true;
++#ifdef CUTTER_AUTO_DELETE
++ /* Remove original (if cutting was successful) */
++ if(!error) {
++ cRecording *recording = Recordings.GetByName(*cutterQueue.First());
++ if (!recording) {
++ esyslog("ERROR: Can't found '%s' after editing process", cutterQueue.First()->Value());
++ } else {
++ if (recording->Delete())
++ Recordings.Del(recording);
++ else
++ esyslog("ERROR: Can't delete '%s' after editing process", cutterQueue.First()->Value());
++ }
++ }
++ lastCuttingEndTime = cTimeMs::Now();
++#endif
++#ifdef CUTTER_QUEUE
++ cutterQueue.Del(cutterQueue.First());
++#endif
+ }
++#ifdef CUTTER_QUEUE
++ if(!cuttingThread && cutterQueue.First()) {
++ /* start next cutting from queue*/
++ if(cTimeMs::Now() > lastCuttingEndTime + WAIT_BEFORE_NEXT_CUT)
++ Start(NULL);
++ }
++#endif
++
+ return false;
+ }
+
+ bool cCutter::Error(void)
+ {
++ cMutexLock(cutterLock);
+ bool result = error;
+ error = false;
+ return result;
+ }
+
+ bool cCutter::Ended(void)
+ {
++ cMutexLock(cutterLock);
+ bool result = ended;
+ ended = false;
+ return result;
+ }
+--- vdr-1.3.12-orig/menu.c 2004-06-13 23:26:51.000000000 +0300
++++ vdr-1.3.12/menu.c 2004-10-01 21:00:42.000000000 +0300
+@@ -3277,20 +3557,25 @@
+
+ void cReplayControl::EditCut(void)
+ {
+ if (fileName) {
+ Hide();
++#if 0
+ if (!cCutter::Active()) {
++#else
++ if (!cCutter::Active() || Interface->Confirm(tr("Cutter already running - Add to cutting queue?"))) {
++#endif
+ if (!marks.Count())
+ Skins.Message(mtError, tr("No editing marks defined!"));
+ else if (!cCutter::Start(fileName))
+ Skins.Message(mtError, tr("Can't start editing process!"));
+ else
+ Skins.Message(mtInfo, tr("Editing process started"));
+ }
+- else
++ else
+ Skins.Message(mtError, tr("Editing process already active!"));
++
+ ShowMode();
+ }
+ }
+
+ void cReplayControl::EditTest(void)
+--- vdr-1.4.2.orig/i18n.c 2006-05-05 15:26:09.000000000 +0200
++++ vdr-1.4.2/i18n.c 2006-08-29 14:28:34.000000000 +0200
+@@ -2422,6 +2422,28 @@
+ "Kan ikke starte Transfer Mode!",
+ "Nelze zaèít s pøenosem",
+ },
++ { "Cutter already running - Add to cutting queue?",
++ "Schnitt läuft bereits - Zur Warteschlange hinzufügen?",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
+ { "No editing marks defined!",
+ "Keine Schnittmarken gesetzt!",
+ "Nobena prekinitvena toèka ni definirana!",
Added: vdr/vdr/trunk/debian/patches/opt-36_CutterQueue.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-36_CutterQueue.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-36_CutterQueue.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,254 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-36_CutterQueue-0.5.dpatch by Petri.Hintukainen at hut.fi
+## http://www.hut.fi/~phintuka/vdr/vdr-1.3.23-CutterQueue.patch
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - adapted to VDR-1.3.25
+##
+## Stefan Wagner <stefanwag at gmx.at>:
+## - added german translation
+## http://vdrportal.de/board/thread.php?postid=525334#post525334
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch to handle recordings that should be cutted in a queue.
+
+ at DPATCH@
+--- vdr-1.3.19-orig/cutter.h 2002-06-22 13:03:15.000000000 +0300
++++ vdr-1.3.19/cutter.h 2005-01-26 18:23:48.000000000 +0200
+@@ -9,17 +9,19 @@
+
+ #ifndef __CUTTER_H
+ #define __CUTTER_H
+
+ class cCuttingThread;
++class cMutex;
+
+ class cCutter {
+ private:
+ static char *editedVersionName;
+ static cCuttingThread *cuttingThread;
+ static bool error;
+ static bool ended;
++ static cMutex *cutterLock;
+ public:
+ static bool Start(const char *FileName);
+ static void Stop(void);
+ static bool Active(void);
+ static bool Error(void);
+--- vdr-1.3.19-orig/cutter.c 2004-06-13 19:04:08.000000000 +0300
++++ vdr-1.3.19/cutter.c 2005-01-27 17:24:03.602233992 +0200
+@@ -11,10 +11,11 @@
+ #include "recording.h"
+ #include "remux.h"
+ #include "thread.h"
+ #include "videodir.h"
+
++
+ // --- cCuttingThread --------------------------------------------------------
+
+ class cCuttingThread : public cThread {
+ private:
+ const char *error;
+@@ -176,17 +177,59 @@
+ esyslog("no editing marks found!");
+ }
+
+ // --- cCutter ---------------------------------------------------------------
+
++#define WAIT_BEFORE_NEXT_CUT (10*1000) // 10 seconds
++
++#define CUTTER_QUEUE
++//#define CUTTER_AUTO_DELETE
++
++class cStringListObject : public cListObject {
++ public:
++ cStringListObject(const char *s) { str = strdup(s); }
++ ~cStringListObject() { free(str); }
++
++ const char *Value() { return str; }
++ operator const char * () { return str; }
++
++ private:
++ char *str;
++};
++
+ char *cCutter::editedVersionName = NULL;
+ cCuttingThread *cCutter::cuttingThread = NULL;
+ bool cCutter::error = false;
+ bool cCutter::ended = false;
++cMutex *cCutter::cutterLock = new cMutex();
++
++static uint64 /*cCutter::*/lastCuttingEndTime = 0;
++static cList<cStringListObject> /**cCutter::*/cutterQueue /*= new cList<cStringListObject>*/;
+
+ bool cCutter::Start(const char *FileName)
+ {
++ cMutexLock(cutterLock);
++
++#ifdef CUTTER_QUEUE
++ if(FileName) {
++ /* Add file to queue.
++ * If cutter is still active, next cutting will be started
++ * when vdr.c:main calls cCutter::Active and previous cutting has
++ * been stopped > 10 s before
++ */
++ cutterQueue.Add(new cStringListObject(FileName));
++ }
++
++ if (cuttingThread)
++ return true;
++
++ /* cut next file from queue */
++ if(!(cutterQueue.First()))
++ return false;
++ FileName = cutterQueue.First()->Value();
++#endif
++
+ if (!cuttingThread) {
+ error = false;
+ ended = false;
+ cRecording Recording(FileName);
+ const char *evn = Recording.PrefixFileName('%');
+@@ -215,6 +258,8 @@
+
+ void cCutter::Stop(void)
+ {
++ cMutexLock(cutterLock);
++
+ bool Interrupted = cuttingThread && cuttingThread->Active();
+ const char *Error = cuttingThread ? cuttingThread->Error() : NULL;
+ delete cuttingThread;
+@@ -224,37 +271,73 @@
+ isyslog("editing process has been interrupted");
+ if (Error)
+ esyslog("ERROR: '%s' during editing process", Error);
+ RemoveVideoFile(editedVersionName); //XXX what if this file is currently being replayed?
+ Recordings.DelByName(editedVersionName);
++#ifdef CUTTER_QUEUE
++ cutterQueue.Del(cutterQueue.First());
++#endif
+ }
++#ifdef CUTTER_QUEUE
++ lastCuttingEndTime = cTimeMs::Now();
++#endif
+ }
+
+ bool cCutter::Active(void)
+ {
++ cMutexLock(cutterLock);
++
+ if (cuttingThread) {
+ if (cuttingThread->Active())
+ return true;
+ error = cuttingThread->Error();
+ Stop();
+ if (!error)
+ cRecordingUserCommand::InvokeCommand(RUC_EDITEDRECORDING, editedVersionName);
+ free(editedVersionName);
+ editedVersionName = NULL;
+ ended = true;
++#ifdef CUTTER_AUTO_DELETE
++ /* Remove original (if cutting was successful) */
++ if(!error) {
++ cRecording *recording = Recordings.GetByName(*cutterQueue.First());
++ if (!recording) {
++ esyslog("ERROR: Can't found '%s' after editing process", cutterQueue.First()->Value());
++ } else {
++ if (recording->Delete())
++ Recordings.Del(recording);
++ else
++ esyslog("ERROR: Can't delete '%s' after editing process", cutterQueue.First()->Value());
++ }
++ }
++ lastCuttingEndTime = cTimeMs::Now();
++#endif
++#ifdef CUTTER_QUEUE
++ cutterQueue.Del(cutterQueue.First());
++#endif
+ }
++#ifdef CUTTER_QUEUE
++ if(!cuttingThread && cutterQueue.First()) {
++ /* start next cutting from queue*/
++ if(cTimeMs::Now() > lastCuttingEndTime + WAIT_BEFORE_NEXT_CUT)
++ Start(NULL);
++ }
++#endif
++
+ return false;
+ }
+
+ bool cCutter::Error(void)
+ {
++ cMutexLock(cutterLock);
+ bool result = error;
+ error = false;
+ return result;
+ }
+
+ bool cCutter::Ended(void)
+ {
++ cMutexLock(cutterLock);
+ bool result = ended;
+ ended = false;
+ return result;
+ }
+--- vdr-1.3.12-orig/menu.c 2004-06-13 23:26:51.000000000 +0300
++++ vdr-1.3.12/menu.c 2004-10-01 21:00:42.000000000 +0300
+@@ -3277,20 +3557,25 @@
+
+ void cReplayControl::EditCut(void)
+ {
+ if (fileName) {
+ Hide();
++#if 0
+ if (!cCutter::Active()) {
++#else
++ if (!cCutter::Active() || Interface->Confirm(tr("Cutter already running - Add to cutting queue?"))) {
++#endif
+ if (!marks.Count())
+ Skins.Message(mtError, tr("No editing marks defined!"));
+ else if (!cCutter::Start(fileName))
+ Skins.Message(mtError, tr("Can't start editing process!"));
+ else
+ Skins.Message(mtInfo, tr("Editing process started"));
+ }
+- else
++ else
+ Skins.Message(mtError, tr("Editing process already active!"));
++
+ ShowMode();
+ }
+ }
+
+ void cReplayControl::EditTest(void)
+--- vdr-1.4.2.orig/i18n.c 2006-05-05 15:26:09.000000000 +0200
++++ vdr-1.4.2/i18n.c 2006-08-29 14:28:34.000000000 +0200
+@@ -2422,6 +2422,28 @@
+ "Kan ikke starte Transfer Mode!",
+ "Nelze zaèít s pøenosem",
+ },
++ { "Cutter already running - Add to cutting queue?",
++ "Schnitt läuft bereits - Zur Warteschlange hinzufügen?",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
+ { "No editing marks defined!",
+ "Keine Schnittmarken gesetzt!",
+ "Nobena prekinitvena toèka ni definirana!",
Added: vdr/vdr/trunk/debian/patches/opt-37_submenu.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-37_submenu.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-37_submenu.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,690 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-37_submenu.dpatch by Jlac, Sad <sad at ntica.com> (submenu plugin)
+## extracted from submenu plugin 0.0.2
+## original filename: vdr-submenu-patch-1.3.1x-from-orig.diff
+##
+## Tobias Grimm <tg at e-tobi.net>:
+## - free char buffers allocated by asprintf
+## Thomas Günther <tom at toms-cafe.de>:
+## - made independend from enAIO patch
+## - fixed current menu item
+## - set count of submenu entries to 255
+## - adapted to VDR-1.3.38
+## - fixed problems with MenuCmdPosition=top (from liemikuutio (enAIO) patch)
+## http://toms-cafe.de/vdr/download/vdr-submenu-0.7-1.3.38+.diff
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch is needed for the submenu plugin.
+
+ at DPATCH@
+diff -Naur vdr-1.3.42/Makefile vdr-1.3.42-submenu-0.7/Makefile
+--- vdr-1.3.42/Makefile 2006-02-05 14:37:11.000000000 +0100
++++ vdr-1.3.42-submenu-0.7/Makefile 2006-02-07 14:53:28.000000000 +0100
+@@ -49,7 +49,7 @@
+ lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
+ receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o\
+ skinclassic.o skins.o skinsttng.o sources.o spu.o status.o svdrp.o themes.o thread.o\
+- timers.o tools.o transfer.o vdr.o videodir.o
++ timers.o tools.o transfer.o vdr.o videodir.o submenu.o
+
+ FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1
+ OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1
+diff -Naur vdr-1.3.42/menu.c vdr-1.3.42-submenu-0.7/menu.c
+--- vdr-1.3.42/menu.c 2006-02-05 14:31:08.000000000 +0100
++++ vdr-1.3.42-submenu-0.7/menu.c 2006-02-07 14:53:28.000000000 +0100
+@@ -2773,11 +2773,110 @@
+ SetTitle("VDR");
+ SetHasHotkeys();
+
+- // Basic menu items:
+-
+- Add(new cOsdItem(hk(tr("Schedule")), osSchedule));
+- Add(new cOsdItem(hk(tr("Channels")), osChannels));
+- Add(new cOsdItem(hk(tr("Timers")), osTimers));
++//SubMenu Patch
++ bool SubMenuActive=cPluginManager::GetPlugin("submenu");
++ if (SubMenuActive)
++ submenu.offset = Count();
++
++if (SubMenuActive) // if ( SubmenuActive && !Plugin)
++{
++cPlugin *p;
++/*
++0::Schedule
++0::Channels
++0:1:Games
++1::games
++1::freecell
++1::solitaire
++*/
++
++// Parse info of current Menu
++// add item of menu
++ for( int i = 0; i < submenu.nbSubMenuItem; i++)
++ {
++ if( submenu.subMenuItem[i].menuLevel == submenu.currentMenuLevel )
++ {
++ if( submenu.subMenuItem[i].kindOfItem == 0 )
++ {
++ // Basic menu items:
++ if( strcmp(submenu.subMenuItem[i].name,"Schedule") == 0 )
++ Add(new cOsdItem(hk(tr("Schedule")), osSchedule));
++
++ if( strcmp(submenu.subMenuItem[i].name,"Channels") == 0 )
++ Add(new cOsdItem(hk(tr("Channels")), osChannels));
++
++ if( strcmp(submenu.subMenuItem[i].name,"Timers") == 0 )
++ Add(new cOsdItem(hk(tr("Timers")), osTimers));
++
++ if( strcmp(submenu.subMenuItem[i].name,"Recordings") == 0 )
++ Add(new cOsdItem(hk(tr("Recordings")), osRecordings));
++ if( strcmp(submenu.subMenuItem[i].name,"Setup") == 0 )
++ Add(new cOsdItem(hk(tr("Setup")), osSetup));
++
++ if( strcmp(submenu.subMenuItem[i].name,"Commands") == 0 )
++ {
++ if (Commands.Count())
++ Add(new cOsdItem(hk(tr("Commands")), osCommands));
++ }
++ // Plugins Item:
++ int j=0;
++ do
++ {
++ p = cPluginManager::GetPlugin(j);
++ if( p != NULL )
++ {
++ const char *item = p->MainMenuEntry();
++ if (item)
++ {
++ if( strcmp( submenu.subMenuItem[i].name , p->Name() ) == 0 )
++ Add(new cMenuPluginItem(hk(item), j));
++ }
++ }
++ j++;
++ }
++ while( p != NULL);
++ }
++ else
++ {
++ Add(new cOsdItem(hk(submenu.subMenuItem[i].name), osUser9));
++ }
++ }
++}
++ /* Add all plugin entry not listed in config file */
++if ( submenu.currentMenuLevel == 0 )
++{
++ int j=0;
++ do
++ {
++ p = cPluginManager::GetPlugin(j);
++ if( p != NULL )
++ {
++ const char *item = p->MainMenuEntry();
++ if (item)
++ {
++ int trv = 0;
++ for( int i = 0; i < submenu.nbSubMenuItem; i++)
++ {
++ if( strcmp( submenu.subMenuItem[i].name , p->Name() ) == 0 )
++ trv = 1;
++ }
++ if(trv == 0)
++ Add(new cMenuPluginItem(hk(item), j));
++ }
++ }
++ j++;
++ }
++ while( p != NULL);
++ }
++
++}
++else
++{
++// Basic menu items:
++
++Add(new cOsdItem(hk(tr("Schedule")), osSchedule));
++Add(new cOsdItem(hk(tr("Channels")), osChannels));
++Add(new cOsdItem(hk(tr("Timers")), osTimers));
+ Add(new cOsdItem(hk(tr("Recordings")), osRecordings));
+
+ // Plugins:
+@@ -2798,6 +2897,7 @@
+ Add(new cOsdItem(hk(tr("Setup")), osSetup));
+ if (Commands.Count())
+ Add(new cOsdItem(hk(tr("Commands")), osCommands));
++}
+
+ Update(true);
+
+@@ -2809,6 +2909,10 @@
+ bool cMenuMain::Update(bool Force)
+ {
+ bool result = false;
++ bool SubMenuActive=cPluginManager::GetPlugin("submenu");
++ cOsdItem* first = NULL;
++ if (SubMenuActive)
++ first = Get(submenu.offset);
+
+ // Title with disk usage:
+ if (Force || time(NULL) - lastDiskSpaceCheck > DISKSPACECHEK) {
+@@ -2874,6 +2978,9 @@
+ result = true;
+ }
+
++ if (SubMenuActive && first)
++ submenu.offset = first->Index();
++
+ return result;
+ }
+
+@@ -2904,6 +3011,24 @@
+ return osEnd;
+ }
+ break;
++ case osBack:
++ if (submenu.nbLevelMenu > 0)
++ {
++ submenu.nbLevelMenu--;
++ submenu.currentMenuLevel = submenu.oldNumberMenu[ submenu.nbLevelMenu ];
++ Set();
++ return osContinue;
++ }
++ else
++ return osEnd;
++ break;
++ case osUser9:
++ submenu.oldNumberMenu[ submenu.nbLevelMenu] = submenu.currentMenuLevel;
++ submenu.nbLevelMenu++;
++ submenu.currentMenuLevel = submenu.GetByLevel(submenu.currentMenuLevel,Current()-submenu.offset);
++ Set();
++ return osContinue;
++ break;
+ case osPlugin: {
+ cMenuPluginItem *item = (cMenuPluginItem *)Get(Current());
+ if (item) {
+diff -Naur vdr-1.3.42/menu.h vdr-1.3.42-submenu-0.7/menu.h
+--- vdr-1.3.42/menu.h 2006-01-22 15:24:31.000000000 +0100
++++ vdr-1.3.42-submenu-0.7/menu.h 2006-02-07 14:53:28.000000000 +0100
+@@ -18,6 +18,7 @@
+ #include "menuitems.h"
+ #include "recorder.h"
+ #include "skins.h"
++#include "submenu.h"
+
+ class cMenuText : public cOsdMenu {
+ private:
+@@ -55,6 +56,7 @@
+
+ class cMenuMain : public cOsdMenu {
+ private:
++ cSubMenu submenu;
+ time_t lastDiskSpaceCheck;
+ int lastFreeMB;
+ bool replaying;
+diff -Naur vdr-1.3.42/submenu.c vdr-1.3.42-submenu-0.7/submenu.c
+--- vdr-1.3.42/submenu.c 1970-01-01 01:00:00.000000000 +0100
++++ vdr-1.3.42-submenu-0.7/submenu.c 2006-02-07 14:53:28.000000000 +0100
+@@ -0,0 +1,397 @@
++#include "submenu.h"
++#include <string.h>
++#include <stdio.h>
++#include "plugin.h"
++
++cSubMenuItemInfo::cSubMenuItemInfo()
++ {
++ menuLevel = 0;
++ kindOfItem = 0;
++ name[0] = 0;
++ }
++
++cSubMenuItemInfo::~cSubMenuItemInfo()
++{
++}
++
++void cSubMenuItemInfo::setname(const char *n)
++{
++ int i,l;
++ l = strlen(n);
++
++ for(i=0;i<SIZEMAXNAMESUBMENUITEMINFO;i++)
++ name[i] = 0;
++
++ if( l >= SIZEMAXNAMESUBMENUITEMINFO )
++ l = SIZEMAXNAMESUBMENUITEMINFO;
++
++ for(i=0;i<l;i++)
++ {
++ name[i] = n[i];
++ }
++ name[i]=0;
++ name[l]=0;
++}
++
++
++void cSubMenu::LoadInfoSubMenu(void)
++{
++ FILE *f;
++ char *fichier;
++ char lig[80];
++ int j;
++
++
++ nbSubMenuItem = 0;
++ asprintf(&fichier,"%s/MainMenu.conf",cPlugin::ConfigDirectory());
++ f = fopen(fichier,"rt");
++ if ( f != NULL)
++ {
++ while (fgets(lig,80,f) )
++ {
++ ParseOneLigOfFile( lig );
++ }
++ fclose(f);
++ }
++ else
++ {
++ /* -- create example file -- */
++ FILE *fo;
++ cPlugin *p;
++
++ fo=fopen(fichier,"wt");
++ if (fo!=NULL)
++ {
++ fprintf(fo,"0::Schedule\n");
++ fprintf(fo,"0::Channels\n");
++ fprintf(fo,"0:1:Recorder\n");
++ fprintf(fo,"0:2:Plugins\n");
++ fprintf(fo,"0:3:Games\n");
++ fprintf(fo,"0:4:Installation\n");
++
++ fprintf(fo,"1::Timers\n");
++ fprintf(fo,"1::Recordings\n");
++ fprintf(fo,"4::Setup\n");
++ fprintf(fo,"4::Commands\n");
++
++ // Plugins Item:
++ j=0;
++ do
++ {
++ p = cPluginManager::GetPlugin(j);
++ if ( p != NULL )
++ {
++ fprintf(fo,"2::%s\n",p->Name());
++ }
++ j++;
++ }
++ while (p !=NULL);
++
++ fclose(fo);
++ LoadInfoSubMenu();
++ Arbo.Populate(this);
++ }
++ /* -- Create example file -- */
++ }
++ free(fichier);
++}
++
++void cSubMenu::ParseOneLigOfFile(const char *lig)
++{
++ int level=-1;
++ int kind=-1;
++ int i,j,l;
++ char txt[SIZEMAXNAMESUBMENUITEMINFO];
++ char name[SIZEMAXNAMESUBMENUITEMINFO];
++ int fin,status = 0;
++ int namefound = 0;
++
++ l = strlen(lig);
++
++ name[0]= 0;
++
++ fin = 0;
++
++ i=0;j=0;
++
++ while( fin == 0)
++ {
++ switch(status)
++ {
++ case 0: //looking for level
++ txt[j++] = lig[i];
++ if ( lig[i] == ':' )
++ {
++ txt[j] = 0;
++ status ++;
++ level = atoi(txt);
++ j = 0;
++ }
++
++ break;
++ case 1:
++ txt[j++] = lig[i];
++ if (lig[i] == ':')
++ {
++ txt[j] = 0;
++ status ++;
++ kind = atoi(txt);
++ j = 0;
++ }
++ break;
++ case 2:
++ if (lig[i]>32 || lig[i]<0)
++ name[j++] = lig[i];
++ if(lig[i]== 0)
++ {
++ name[j]=0;
++ namefound=1;
++ status++;
++ }
++
++ break;
++ default:
++ break;
++
++ }
++ if (lig[i] == '/')
++ fin = 1;
++ if (lig[i] == 0)
++ fin = 1;
++ if ( i == l )
++ fin = 1;
++
++ i++;
++ }
++
++ if (level!=-1 && kind!=-1 && namefound==1)
++ {
++ name[j]=0;
++ subMenuItem[nbSubMenuItem].menuLevel = level;
++ subMenuItem[nbSubMenuItem].kindOfItem = kind;
++ subMenuItem[nbSubMenuItem].setname(name);
++ nbSubMenuItem++;
++ }
++}
++
++void cSubMenu::SaveInfoSubMenu()
++{
++ //Dump();
++ FILE *f;
++ char *fichier;
++ asprintf(&fichier,"%s/MainMenu.conf",cPlugin::ConfigDirectory());
++ f=fopen(fichier,"w");
++ if (f)
++ {
++ for (int i=0;i<nbSubMenuItem;i++)
++ {
++ fprintf(f,"%i:%i:%s\n",subMenuItem[i].menuLevel,subMenuItem[i].kindOfItem,subMenuItem[i].name);
++ }
++ fclose(f);
++ }
++ free(fichier);
++}
++
++cSubMenu::~cSubMenu()
++{
++ delete [] subMenuItem;
++}
++
++cSubMenu::cSubMenu()
++{
++ subMenuItem = new cSubMenuItemInfo[NBMAXSUBMENUANDITEM];
++
++ nbLevelMenu = 0;
++ currentMenuLevel = 0;
++ LoadInfoSubMenu();
++ Arbo.Populate(this);
++ offset=0;
++}
++
++int cSubMenu::GetByLevel (int Level, int curr)
++{
++ int j=0;
++ int Index[NBMAXSUBMENUANDITEM];
++ for (int i=0;i<nbSubMenuItem;i++)
++ {
++ if (subMenuItem[i].menuLevel==Level)
++ {
++ Index[j]=i;
++ j++;
++ }
++ }
++ return subMenuItem[Index[curr]].kindOfItem;
++}
++int cSubMenu::GetByLevel (int Level)
++{
++ /*
++ int Index[NBMAXSUBMENUANDITEM];
++ int j=0;
++ for (int i=0;i<nbSubMenuItem;i++)
++ {
++ if (subMenuItem[i].menuLevel==Level)
++ {
++ Index[j]=i;
++ j++;
++ }
++ Index[j]=-1;
++ }
++ return Index;
++ */
++ return 0;
++}
++
++void cSubMenu::CreateItem(int type,int position,int where,char *Name)
++{
++ int OldMenuLevel;
++ switch(type)
++ {
++ case 0:
++ switch(where)
++ {
++ case 0:
++ OldMenuLevel=subMenuItem[position].menuLevel;
++ InsertItem(position);
++ subMenuItem[position].setname(Name);
++ subMenuItem[position].menuLevel=OldMenuLevel;
++ subMenuItem[position].kindOfItem=Arbo.MaxLevel+1;
++ break;
++ case 1:
++ OldMenuLevel=subMenuItem[position].menuLevel;
++ InsertItem(position);
++ subMenuItem[position+1].setname(Name);
++ subMenuItem[position+1].menuLevel=OldMenuLevel;
++ subMenuItem[position+1].kindOfItem=Arbo.MaxLevel+1;
++ break;
++ case 2:
++ OldMenuLevel=subMenuItem[position].kindOfItem;
++ InsertItem(position);
++ subMenuItem[position+1].setname(Name);
++ subMenuItem[position+1].menuLevel=OldMenuLevel;
++ subMenuItem[position+1].kindOfItem=Arbo.MaxLevel+1;
++ break;
++ default:
++ break;
++ }
++ Arbo.Populate(this);
++ break;
++ case 1 :
++ switch(where)
++ {
++ case 0:
++ OldMenuLevel=subMenuItem[position].menuLevel;
++ InsertItem(position);
++ subMenuItem[position].setname(Name);
++ subMenuItem[position].menuLevel=OldMenuLevel;
++ subMenuItem[position].kindOfItem=0;
++ break;
++ case 1:
++ OldMenuLevel=subMenuItem[position].menuLevel;
++ InsertItem(position);
++ subMenuItem[position+1].setname(Name);
++ subMenuItem[position+1].menuLevel=OldMenuLevel;
++ subMenuItem[position+1].kindOfItem=0;
++ break;
++ case 2:
++ OldMenuLevel=subMenuItem[position].kindOfItem;
++ InsertItem(position);
++ subMenuItem[position+1].setname(Name);
++ subMenuItem[position+1].menuLevel=OldMenuLevel;
++ subMenuItem[position+1].kindOfItem=0;
++ break;
++ }
++ Arbo.Populate(this);
++ break;
++ default :
++ break;
++ }
++}
++void cSubMenu::Dump(void)
++{
++ for (int i=0;i<nbSubMenuItem;i++)
++ {
++ fprintf(stderr,"%i Nom : %s Menu : %i Kind : %i\n",i,subMenuItem[i].name,subMenuItem[i].menuLevel,subMenuItem[i].kindOfItem);
++ }
++}
++
++void cSubMenu::DeleteItem(int position,int kindItem)
++{
++ int Kind;
++ if (kindItem!=-1)
++ Kind=kindItem;
++ else
++ Kind=subMenuItem[position].kindOfItem;
++ for(int i=position;i<nbSubMenuItem;i++)
++ {
++ subMenuItem[i]=subMenuItem[i+1];
++ }
++ nbSubMenuItem--;
++ Arbo.Populate(this);
++ if (Kind!=0)
++ {
++ for(int i=position;i<nbSubMenuItem;i++)
++ {
++ if (subMenuItem[i].menuLevel==Kind)
++ {
++ DeleteItem(i,subMenuItem[i].kindOfItem);
++ i--;
++ }
++ }
++ }
++ Arbo.Populate(this);
++}
++
++void cSubMenu::InsertItem(int position)
++{
++ for (int i=nbSubMenuItem;i>position;i--)
++ {
++ subMenuItem[i]=subMenuItem[i-1];
++ }
++ nbSubMenuItem++;
++ Arbo.Populate(this);
++}
++
++
++cArbo::cArbo(void)
++{
++ MaxLevel=0;
++ for (int i=0;i<NBMAXSUBMENUANDITEM;i++)
++ {
++ MaxItem[i]=0;
++ }
++}
++
++void cArbo::Clear()
++{
++ MaxLevel=0;
++ for (int i=0;i<NBMAXSUBMENUANDITEM;i++)
++ {
++ MaxItem[i]=0;
++ for (int j=0;j<NBMAXSUBMENUANDITEM;j++)
++ {
++ Index[i][j]=0;
++ }
++ }
++}
++
++cArbo::~cArbo(void)
++{
++}
++
++void cArbo::Populate(cSubMenu *submenu)
++{
++ Clear();
++ for (int i=0;i<submenu->nbSubMenuItem;i++)
++ {
++ Index[ submenu->subMenuItem[i].menuLevel ][ submenu->Arbo.MaxItem[submenu->subMenuItem[i].menuLevel]] = i;
++ submenu->Arbo.MaxItem[submenu->subMenuItem[i].menuLevel]++;
++ if (submenu->subMenuItem[i].menuLevel > submenu->Arbo.MaxLevel)
++ {
++ submenu->Arbo.MaxLevel = submenu->subMenuItem[i].menuLevel;
++ }
++ if (submenu->subMenuItem[i].kindOfItem > submenu->Arbo.MaxLevel)
++ {
++ submenu->Arbo.MaxLevel = submenu->subMenuItem[i].kindOfItem;
++ }
++ }
++}
+diff -Naur vdr-1.3.42/submenu.h vdr-1.3.42-submenu-0.7/submenu.h
+--- vdr-1.3.42/submenu.h 1970-01-01 01:00:00.000000000 +0100
++++ vdr-1.3.42-submenu-0.7/submenu.h 2006-02-07 14:53:28.000000000 +0100
+@@ -0,0 +1,62 @@
++#ifndef __SUBMENU_H
++#define __SUBMENU_H
++
++#define SIZEMAXNAMESUBMENUITEMINFO 30
++#define NBMAXSUBMENUANDITEM 255
++
++class cSubMenu;
++
++class cSubMenuItemInfo
++{
++ private:
++ public:
++ cSubMenuItemInfo();
++ ~cSubMenuItemInfo();
++
++ int menuLevel;
++ int kindOfItem;
++ char name[SIZEMAXNAMESUBMENUITEMINFO]; //todo revoir ca(la taille en dur)
++
++ void setname(const char *n);
++};
++
++class cArbo
++{
++ private:
++ public:
++ cArbo(void);
++ ~cArbo(void);
++ int Index[NBMAXSUBMENUANDITEM][NBMAXSUBMENUANDITEM];
++ int CurrentIndex[NBMAXSUBMENUANDITEM];
++ int MaxLevel;
++ int MaxItem[NBMAXSUBMENUANDITEM];
++ void Populate(cSubMenu *submenu);
++ void Clear(void);
++};
++
++class cSubMenu
++{
++ private:
++ public:
++ int currentMenuLevel;
++ cSubMenuItemInfo *subMenuItem;
++ cArbo Arbo;
++ int nbSubMenuItem;
++ int oldNumberMenu[ NBMAXSUBMENUANDITEM ];
++ int nbLevelMenu;
++
++ int offset; // For MenuCmdPosition issue
++
++ cSubMenu();
++ virtual ~cSubMenu();
++ void LoadInfoSubMenu(void);
++ void ParseOneLigOfFile (const char *lig);
++ void SaveInfoSubMenu(void);
++ int GetByLevel(int Level, int curr);
++ int GetByLevel(int Level);
++ void CreateItem(int type,int position,int where,char *Name="");
++ void DeleteItem(int position,int kindItem=-1);
++ void InsertItem(int position);
++ void Dump(void);
++};
++#endif //__SUBMENU_H
Added: vdr/vdr/trunk/debian/patches/opt-38_disableDoubleEpgEntrys.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-38_disableDoubleEpgEntrys.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-38_disableDoubleEpgEntrys.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,381 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-38_disableDoubleEpgEntrys.dpatch by Emanuel Wontorra <hoerzu2vdr at wontorra.net>
+## http://vdrportal.de/board/thread.php?postid=316384#post316384
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - adapted to VDR-1.3.32
+##
+## Stefan Wagner <stefanwag at gmx.at>:
+## - adapted to VDR-1.3.43
+##
+## Tobias Grimm <tg at e-tobi.net>:
+## - adapted to VDR-1.4.0 maintenance patch 1.4.0-2
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch suppresses double EPG entries.
+
+ at DPATCH@
+diff -urNad vdr-1.4.0~/config.c vdr-1.4.0/config.c
+--- vdr-1.4.0~/config.c 2006-06-06 02:07:33.000000000 +0200
++++ vdr-1.4.0/config.c 2006-06-06 02:07:33.000000000 +0200
+@@ -303,6 +303,10 @@
+ MinUserInactivity = 300;
+ MultiSpeedMode = 0;
+ ShowReplayMode = 0;
++ DoubleEpgTimeDelta = 15;
++ DoubleEpgAction = 0;
++ MixEpgAction = 0;
++ DisableVPS = 0;
+ ResumeID = 0;
+ JumpPlay = 0;
+ PlayJump = 0;
+@@ -473,6 +477,10 @@
+ else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value);
+ else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
+ else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
++ else if (!strcasecmp(Name, "DoubleEpgTimeDelta")) DoubleEpgTimeDelta = atoi(Value);
++ else if (!strcasecmp(Name, "DoubleEpgAction")) DoubleEpgAction = atoi(Value);
++ else if (!strcasecmp(Name, "MixEpgAction")) MixEpgAction = atoi(Value);
++ else if (!strcasecmp(Name, "DisableVPS")) DisableVPS = atoi(Value);
+ else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value);
+ else if (!strcasecmp(Name, "JumpPlay")) JumpPlay = atoi(Value);
+ else if (!strcasecmp(Name, "PlayJump")) PlayJump = atoi(Value);
+@@ -548,6 +556,10 @@
+ Store("SplitEditedFiles", SplitEditedFiles);
+ Store("MinEventTimeout", MinEventTimeout);
+ Store("MinUserInactivity", MinUserInactivity);
++ Store("DoubleEpgAction", DoubleEpgAction);
++ Store("MixEpgAction", MixEpgAction);
++ Store("DisableVPS", DisableVPS);
++ Store("DoubleEpgTimeDelta", DoubleEpgTimeDelta);
+ Store("MultiSpeedMode", MultiSpeedMode);
+ Store("ShowReplayMode", ShowReplayMode);
+ Store("ResumeID", ResumeID);
+diff -urNad vdr-1.4.0~/config.h vdr-1.4.0/config.h
+--- vdr-1.4.0~/config.h 2006-06-06 02:07:33.000000000 +0200
++++ vdr-1.4.0/config.h 2006-06-06 02:07:33.000000000 +0200
+@@ -268,6 +268,10 @@
+ int MinEventTimeout, MinUserInactivity;
+ int MultiSpeedMode;
+ int ShowReplayMode;
++ int DoubleEpgTimeDelta;
++ int DoubleEpgAction;
++ int MixEpgAction;
++ int DisableVPS;
+ int ResumeID;
+ int JumpPlay;
+ int PlayJump;
+diff -urNad vdr-1.4.0~/eit.c vdr-1.4.0/eit.c
+--- vdr-1.4.0~/eit.c 2006-06-06 02:07:33.000000000 +0200
++++ vdr-1.4.0/eit.c 2006-06-06 02:13:14.000000000 +0200
+@@ -72,7 +72,83 @@
+ // not be overwritten.
+ if (pEvent->TableID() == 0x00) {
+ if (pEvent->Version() == getVersionNumber())
+- continue;
++ {
++ if(Setup.MixEpgAction == 0)
++ continue;
++
++ //printf("in");
++ //printf("%s", pEvent->GetTimeString());
++ // to use the info of the original epg, update the extern one,
++ // if it has less info
++ SI::Descriptor *d;
++ SI::ExtendedEventDescriptors *ExtendedEventDescriptors = NULL;
++ //SI::ExtendedEventDescriptor *eed = NULL;
++ SI::ShortEventDescriptor *ShortEventDescriptor = NULL;
++ //SI::ShortEventDescriptor *sed = NULL;
++ //SI::TimeShiftedEventDescriptor *tsed = NULL;
++ //cLinkChannels *LinkChannels = NULL;
++ for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2));)
++ {
++ if(d->getDescriptorTag() == SI::ShortEventDescriptorTag)
++ {
++ int LanguagePreferenceShort = -1;
++ SI::ShortEventDescriptor *sed = (SI::ShortEventDescriptor *)d;
++ if (I18nIsPreferredLanguage(Setup.EPGLanguages, sed->languageCode, LanguagePreferenceShort) || !ShortEventDescriptor)
++ {
++ delete ShortEventDescriptor;
++ ShortEventDescriptor = sed;
++ d = NULL; // so that it is not deleted
++ }
++ }
++ else if(d->getDescriptorTag() == SI::ExtendedEventDescriptorTag)
++ {
++ int LanguagePreferenceExt = -1;
++ bool UseExtendedEventDescriptor = false;
++ SI::ExtendedEventDescriptor *eed = (SI::ExtendedEventDescriptor *)d;
++ if (I18nIsPreferredLanguage(Setup.EPGLanguages, eed->languageCode, LanguagePreferenceExt) || !ExtendedEventDescriptors)
++ {
++ delete ExtendedEventDescriptors;
++ ExtendedEventDescriptors = new SI::ExtendedEventDescriptors;
++ UseExtendedEventDescriptor = true;
++ }
++ if (UseExtendedEventDescriptor)
++ {
++ ExtendedEventDescriptors->Add(eed);
++ d = NULL; // so that it is not deleted
++ }
++ if (eed->getDescriptorNumber() == eed->getLastDescriptorNumber())
++ UseExtendedEventDescriptor = false;
++ }
++ delete d;
++ }
++ if(pEvent)
++ {
++
++ if(ShortEventDescriptor)
++ {
++ char buffer[256];
++ if(ShortEventDescriptor->text.getText(buffer, sizeof(buffer)) && pEvent->ShortText() && (strlen(ShortEventDescriptor->text.getText(buffer, sizeof(buffer))) > strlen(pEvent->ShortText())))
++ {
++ pEvent->SetShortText(ShortEventDescriptor->text.getText(buffer, sizeof(buffer)));
++ pEvent->FixEpgBugs();
++ }
++ }
++ if(ExtendedEventDescriptors)
++ {
++ char buffer[ExtendedEventDescriptors->getMaximumTextLength(": ") + 1];
++ //pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": "));
++
++ if(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": ") && pEvent->Description() && (strlen(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": ")) > strlen(pEvent->Description())))
++ {
++ pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": "));
++ pEvent->FixEpgBugs();
++ }
++ }
++ }
++ delete ExtendedEventDescriptors;
++ delete ShortEventDescriptor;
++ continue;
++ }
+ HasExternalData = ExternalData = true;
+ }
+ // If the new event has a higher table ID, let's skip it.
+@@ -95,7 +171,7 @@
+ pEvent->SetDuration(SiEitEvent.getDuration());
+ }
+ if (Tid == 0x4E) { // we trust only the present/following info on the actual TS
+- if (SiEitEvent.getRunningStatus() >= SI::RunningStatusNotRunning)
++ if (Setup.DisableVPS == 0 && SiEitEvent.getRunningStatus() >= SI::RunningStatusNotRunning)
+ pSchedule->SetRunningStatus(pEvent, SiEitEvent.getRunningStatus(), channel);
+ }
+ if (OnlyRunningStatus)
+@@ -249,6 +325,80 @@
+ if (LinkChannels)
+ channel->SetLinkChannels(LinkChannels);
+ Modified = true;
++
++ //to avoid double epg-entrys from ext and int epg sources :EW
++ if (pEvent && pEvent->TableID() != 0x00)
++ {
++ cEvent *pPreviousEvent = (cEvent *)pSchedule->GetPreviousEvent(pEvent);
++
++ if (pPreviousEvent)
++ {
++ if(Setup.DoubleEpgAction == 0)
++ {
++ pPreviousEvent->SetStartTime(pEvent->StartTime());
++ pPreviousEvent->SetDuration(pEvent->Duration());
++
++ if(Setup.DisableVPS == 0)
++ {
++ if(channel)
++ pPreviousEvent->SetRunningStatus(pEvent->RunningStatus(), channel);
++ else
++ pPreviousEvent->SetRunningStatus(pEvent->RunningStatus());
++ }
++
++ // to use the info of the original epg, update the extern one,
++ // if it has less info
++ char buffer_short_intern[256];
++ char buffer_short_extern[256];
++ int len_short_intern = 0;
++ int len_short_extern = 0;
++
++ if (pEvent->ShortText())
++ len_short_intern = sprintf (buffer_short_intern, "%s", pEvent->ShortText());
++
++ if (pPreviousEvent->ShortText())
++ len_short_extern = sprintf (buffer_short_extern, "%s",pPreviousEvent->ShortText());
++
++ if(len_short_intern > 0)
++ {
++ if(len_short_extern < 1)
++ pPreviousEvent->SetShortText(buffer_short_intern);
++ else if (len_short_intern > len_short_extern)
++ pPreviousEvent->SetShortText(buffer_short_intern);
++ }
++
++ if(pEvent->Description())
++ {
++ char buffer_title_intern[4096];
++ char buffer_title_extern[4096];
++ int len_title_intern = 0;
++ int len_title_extern = 0;
++
++ if (pEvent->Description())
++ len_title_intern = sprintf (buffer_title_intern, "%s", pEvent->Description());
++
++ if (pPreviousEvent->Description())
++ len_title_extern = sprintf (buffer_title_extern, "%s", pPreviousEvent->Description());
++
++ if(len_title_intern > 0)
++ {
++ if(len_title_extern < 1)
++ pPreviousEvent->SetDescription(buffer_title_intern);
++ else if (len_title_intern > len_title_extern)
++ pPreviousEvent->SetDescription(buffer_title_intern);
++ }
++ }
++
++ if(pPreviousEvent->Vps() == 0 && pEvent->Vps() != 0)
++ pPreviousEvent->SetVps(pEvent->Vps());
++
++ pSchedule->DelEvent(pEvent);
++ pPreviousEvent->FixEpgBugs();
++ }
++ else
++ pSchedule->DelEvent(pPreviousEvent);
++ }
++ }
+ }
+ if (Empty && Tid == 0x4E && getSectionNumber() == 0)
+ // ETR 211: an empty entry in section 0 of table 0x4E means there is currently no event running
+diff -urNad vdr-1.4.0~/epg.c vdr-1.4.0/epg.c
+--- vdr-1.4.0~/epg.c 2006-06-06 02:07:33.000000000 +0200
++++ vdr-1.4.0/epg.c 2006-06-06 02:07:33.000000000 +0200
+@@ -734,6 +734,29 @@
+ return pe;
+ }
+
++const cEvent *cSchedule::GetPreviousEvent(cEvent *Event) const
++{
++
++ if(!Event || Event->Duration() == 0 || Event->StartTime() == 0)
++ return NULL;
++ // Returns either the event info to the previous/following event to the given EventID or, if that one can't be found NULL :EW
++ cEvent *pt = NULL;
++ int epgTimeDelta = Setup.DoubleEpgTimeDelta * 60 + 1;
++ for (pt = events.First(); pt; pt = events.Next(pt))
++ if(pt && pt->TableID() == 0x00)
++ if ((Event->StartTime() - pt->StartTime()) > - epgTimeDelta && (Event->StartTime() - pt->StartTime()) < epgTimeDelta)
++ {
++ if((pt->Duration() + (pt->Duration()/ 5) + 1) > Event->Duration() && (pt->Duration() - (pt->Duration()/ 5) - 1) < Event->Duration())
++ return pt;
++ else if (pt->Title() && Event->Title() && (strcmp(pt->Title(), ".") != 0 && strcmp(Event->Title(), ".") != 0))
++ {
++ if (strstr(pt->Title(), Event->Title()) != NULL || strstr(Event->Title(), pt->Title()) != NULL)
++ return pt;
++ }
++ }
++ return NULL;
++}
++
+ void cSchedule::SetRunningStatus(cEvent *Event, int RunningStatus, cChannel *Channel)
+ {
+ for (cEvent *p = events.First(); p; p = events.Next(p)) {
+diff -urNad vdr-1.4.0~/epg.h vdr-1.4.0/epg.h
+--- vdr-1.4.0~/epg.h 2006-03-25 13:39:39.000000000 +0100
++++ vdr-1.4.0/epg.h 2006-06-06 02:07:33.000000000 +0200
+@@ -136,6 +136,7 @@
+ void DropOutdated(time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version);
+ void Cleanup(time_t Time);
+ void Cleanup(void);
++ const cEvent *GetPreviousEvent(cEvent *Event) const; //:EW
+ cEvent *AddEvent(cEvent *Event);
+ void DelEvent(cEvent *Event);
+ void HashEvent(cEvent *Event);
+diff -urNad vdr-1.4.0~/i18n.c vdr-1.4.0/i18n.c
+--- vdr-1.4.0~/i18n.c 2006-06-06 02:07:33.000000000 +0200
++++ vdr-1.4.0/i18n.c 2006-06-06 02:07:33.000000000 +0200
+@@ -4630,6 +4630,74 @@
+ "som før",
+ "jako naposledy",
+ },
++ { "Setup.EPG$Period for double EPG search(min)",
++ "Zeitspanne für dop. EPG-Suche(min)",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ },
++ { "Setup.EPG$extern double Epg entry",
++ "Doppelten externen EPG-Eintrag",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ },
++ { "Setup.EPG$Mix intern and extern EPG",
++ "Internen und externen EPG mischen",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ },
++ { "Setup.EPG$Disable running VPS event",
++ "Erk. des lauf. VPS-Events abschalten",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ },
+ // The days of the week:
+ { "MTWTFSS",
+ "MDMDFSS",
+diff -urNad vdr-1.4.0~/menu.c vdr-1.4.0/menu.c
+--- vdr-1.4.0~/menu.c 2006-06-06 02:07:33.000000000 +0200
++++ vdr-1.4.0/menu.c 2006-06-06 02:07:33.000000000 +0200
+@@ -2467,6 +2467,10 @@
+ Add(new cMenuEditIntItem( tr("Setup.EPG$Preferred languages"), &numLanguages, 0, I18nNumLanguages));
+ for (int i = 0; i < numLanguages; i++)
+ Add(new cMenuEditStraItem(tr("Setup.EPG$Preferred language"), &data.EPGLanguages[i], I18nNumLanguages, I18nLanguages()));
++ Add(new cMenuEditIntItem(tr("Setup.EPG$Period for double EPG search(min)"), &data.DoubleEpgTimeDelta));
++ Add(new cMenuEditBoolItem(tr("Setup.EPG$extern double Epg entry"), &data.DoubleEpgAction, "adjust", "delete"));
++ Add(new cMenuEditBoolItem(tr("Setup.EPG$Mix intern and extern EPG"), &data.MixEpgAction));
++ Add(new cMenuEditBoolItem(tr("Setup.EPG$Disable running VPS event"), &data.DisableVPS));
+
+ SetCurrent(Get(current));
+ Display();
Added: vdr/vdr/trunk/debian/patches/opt-39_noepg.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-39_noepg.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-39_noepg.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,102 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-39_noepg.dpatch by Torsten Kunkel <vdr at tkunkel.de>
+## extracted from noepg plugin version 0.0.2 (vdr-1.3.41-plain.patch)
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - solved conflicts with other patches
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: The patch allows to disable normal epg update for specified channels.
+## DP: This is useful if you get epg data of the channels from external sources.
+
+ at DPATCH@
+--- vdr-1.3.41/channels.c
++++ vdr-1.3.41/channels.c
+@@ -7,6 +7,7 @@
+ * $Id: channels.c 1.48 2006/01/14 15:51:02 kls Exp $
+ */
+
++#include "config.h"
+ #include "channels.h"
+ #include <linux/dvb/frontend.h>
+ #include <ctype.h>
+@@ -1030,6 +1031,17 @@
+ return NULL;
+ }
+
++//TK
++bool cChannels::keinEPGScan(tChannelID kanalID)
++{
++ bool rc=false;
++
++ if (strstr(::Setup.noEPG,kanalID.ToString())!=NULL){
++ rc=true;
++ }
++ return rc;
++}
++
+ cString ChannelString(const cChannel *Channel, int Number)
+ {
+ char buffer[256];
+--- vdr-1.3.41/channels.h
++++ vdr-1.3.41/channels.h
+@@ -248,6 +248,7 @@
+ ///< modification has been made, and 2 if the user has made a modification.
+ ///< Calling this function resets the 'modified' flag to 0.
+ cChannel *NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid = 0);
++ bool keinEPGScan(tChannelID kanalID);//TK
+ };
+
+ extern cChannels Channels;
+--- vdr-1.3.41/config.c
++++ vdr-1.3.41/config.c
+@@ -238,6 +238,7 @@
+ EPGScanTimeout = 5;
+ EPGBugfixLevel = 3;
+ EPGLinger = 0;
++ strcpy(noEPG, "");
+ SVDRPTimeout = 300;
+ ZapTimeout = 3;
+ SortTimers = 1;
+@@ -398,6 +399,7 @@
+ else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
+ else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
+ else if (!strcasecmp(Name, "EPGLinger")) EPGLinger = atoi(Value);
++ else if (!strcasecmp(Name, "noEPG")) strn0cpy(noEPG, Value, 999);
+ else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
+ else if (!strcasecmp(Name, "ZapTimeout")) ZapTimeout = atoi(Value);
+ else if (!strcasecmp(Name, "SortTimers")) SortTimers = atoi(Value);
+@@ -465,6 +467,7 @@
+ Store("EPGScanTimeout", EPGScanTimeout);
+ Store("EPGBugfixLevel", EPGBugfixLevel);
+ Store("EPGLinger", EPGLinger);
++ Store("noEPG", noEPG);
+ Store("SVDRPTimeout", SVDRPTimeout);
+ Store("ZapTimeout", ZapTimeout);
+ Store("SortTimers", SortTimers);
+--- vdr-1.3.41/config.h
++++ vdr-1.3.41/config.h
+@@ -210,6 +210,7 @@
+ int EPGScanTimeout;
+ int EPGBugfixLevel;
+ int EPGLinger;
++ char noEPG[999];
+ int SVDRPTimeout;
+ int ZapTimeout;
+ int SortTimers;
+--- vdr-1.3.41/eit.c
++++ vdr-1.3.41/eit.c
+@@ -35,6 +35,13 @@
+ if (!channel)
+ return; // only collect data for known channels
+
++ //TK
++ tChannelID kanalID;
++ kanalID=channel->GetChannelID();
++ if (Channels.keinEPGScan(kanalID)){
++ return;
++ }
++
+ cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true);
+
+ bool Empty = true;
Added: vdr/vdr/trunk/debian/patches/opt-40_wareagle-icons.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-40_wareagle-icons.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-40_wareagle-icons.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,1732 @@
+#!/bin/sh /usr/share/dpatch/dpatch-run
+
+## opt-40_wareagle-icons.dpatch by Torsten Kunkel <vdr at tkunkel.de> (http://vdr.sjur.de)
+##
+## downloaded from http://vdrportal.de/board/thread.php?postid=266960#post266960
+## original filename: wareagle-icon-patch-vdr1.3.20.diff.gz
+##
+## fixed and extended by Thomas Günther <tom at toms-cafe.de>:
+## - fixed small symbols in fontsml-iso8859-15.c
+## - fixed timers menu: show arrow symbol instead of '!'
+## - added setup option WarEagleIcons to disable the icons (e.g. for skins
+## with truetype fonts) - as default the icons are enabled
+## http://toms-cafe.de/vdr/download/vdr-wareagle-icons+setup-1.3.22.diff
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - adapted to sort-options patch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Adds some icons to timer, recording and channel list.
+
+ at DPATCH@
+diff -Naur vdr-1.3.22/config.c vdr-1.3.22-icon/config.c
+--- vdr-1.3.22/config.c 2005-02-20 13:52:59.000000000 +0100
++++ vdr-1.3.22-icon/config.c 2005-03-06 01:54:41.000000000 +0100
+@@ -247,6 +247,7 @@
+ OSDLanguage = 0;
+ strcpy(OSDSkin, "sttng");
+ strcpy(OSDTheme, "default");
++ WarEagleIcons = 1;
+ PrimaryDVB = 1;
+ ShowInfoOnChSwitch = 1;
+ MenuScrollPage = 1;
+@@ -404,6 +405,7 @@
+ if (!strcasecmp(Name, "OSDLanguage")) OSDLanguage = atoi(Value);
+ else if (!strcasecmp(Name, "OSDSkin")) strn0cpy(OSDSkin, Value, MaxSkinName);
+ else if (!strcasecmp(Name, "OSDTheme")) strn0cpy(OSDTheme, Value, MaxThemeName);
++ else if (!strcasecmp(Name, "WarEagleIcons")) WarEagleIcons = atoi(Value);
+ else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value);
+ else if (!strcasecmp(Name, "ShowInfoOnChSwitch")) ShowInfoOnChSwitch = atoi(Value);
+ else if (!strcasecmp(Name, "MenuScrollPage")) MenuScrollPage = atoi(Value);
+@@ -468,6 +470,7 @@
+ Store("OSDLanguage", OSDLanguage);
+ Store("OSDSkin", OSDSkin);
+ Store("OSDTheme", OSDTheme);
++ Store("WarEagleIcons", WarEagleIcons);
+ Store("PrimaryDVB", PrimaryDVB);
+ Store("ShowInfoOnChSwitch", ShowInfoOnChSwitch);
+ Store("MenuScrollPage", MenuScrollPage);
+diff -Naur vdr-1.3.22/config.h vdr-1.3.22-icon/config.h
+--- vdr-1.3.22/config.h 2005-02-20 13:50:37.000000000 +0100
++++ vdr-1.3.22-icon/config.h 2005-03-06 01:52:21.000000000 +0100
+@@ -208,6 +208,7 @@
+ int OSDLanguage;
+ char OSDSkin[MaxSkinName];
+ char OSDTheme[MaxThemeName];
++ int WarEagleIcons;
+ int PrimaryDVB;
+ int ShowInfoOnChSwitch;
+ int MenuScrollPage;
+diff -Naur vdr-1.3.22/fontosd-iso8859-15.c vdr-1.3.22-icon/fontosd-iso8859-15.c
+--- vdr-1.3.22/fontosd-iso8859-15.c 2004-12-18 17:14:49.000000000 +0100
++++ vdr-1.3.22-icon/fontosd-iso8859-15.c 2005-03-04 19:58:28.000000000 +0100
+@@ -6210,35 +6210,65 @@
+ 0x00000000, // ......
+ },
+ { // 239
+- 6, 27,
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000033, // **..**
+- 0x00000033, // **..**
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x0000000C, // ..**..
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000000, // ......
+- 0x00000000, // ......
+- },
++ 16, 27,
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x381c, // ..................###......###..
++ 0x1c38, // ...................###....###...
++ 0xe70, // ....................###..###....
++ 0x7e0, // .....................######.....
++ 0x3ffc, // ..................############..
++ 0x7ffe, // .................##############.
++ 0x700e, // .................###........###.
++ 0x6006, // .................##..........##.
++ 0x6c06, // .................##.##.......##.
++ 0x6ff6, // .................##.########.##.
++ 0x6ff6, // .................##.########.##.
++ 0x6db6, // .................##.##.##.##.##.
++ 0x61b6, // .................##....##.##.##.
++ 0x61b6, // .................##....##.##.##.
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x7ffe, // .................##############.
++ 0x3ffc, // ..................############..
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ },
++// { // 239
++// 6, 27,
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000033, // **..**
++// 0x00000033, // **..**
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x0000000C, // ..**..
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000000, // ......
++// 0x00000000, // ......
++// },
+ { // 240
+ 13, 27,
+ 0x00000000, // .............
+@@ -6360,65 +6390,125 @@
+ 0x00000000, // .............
+ },
+ { // 244
+- 13, 27,
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x000000E0, // .....***.....
+- 0x000001A0, // ....**.*.....
+- 0x00000130, // ....*..**....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x000001F0, // ....*****....
+- 0x000007F8, // ..********...
+- 0x0000061C, // ..**....***..
+- 0x00000C0E, // .**......***.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C0E, // .**......***.
+- 0x0000061C, // ..**....***..
+- 0x000007F8, // ..********...
+- 0x000001F0, // ....*****....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- },
++ 16, 27,
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x1c, // ...........................###..
++ 0x38, // ..........................###...
++ 0x70, // .........................###....
++ 0xe0, // ........................###.....
++ 0x1c0, // .......................###......
++ 0x380, // ......................###.......
++ 0x300, // ......................##........
++ 0x300, // ......................##........
++ 0x7ffe, // .................##############.
++ 0x7ffe, // .................##############.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x7ffe, // .................##############.
++ 0x7ffe, // .................##############.
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ },
++// { // 244
++// 13, 27,
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x000000E0, // .....***.....
++// 0x000001A0, // ....**.*.....
++// 0x00000130, // ....*..**....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x000001F0, // ....*****....
++// 0x000007F8, // ..********...
++// 0x0000061C, // ..**....***..
++// 0x00000C0E, // .**......***.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C0E, // .**......***.
++// 0x0000061C, // ..**....***..
++// 0x000007F8, // ..********...
++// 0x000001F0, // ....*****....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// },
+ { // 245
+- 13, 27,
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000180, // ....**.......
+- 0x000003F8, // ...*******...
+- 0x00000270, // ...*..***....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x000001F0, // ....*****....
+- 0x000007F8, // ..********...
+- 0x0000061C, // ..**....***..
+- 0x00000C0E, // .**......***.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C0E, // .**......***.
+- 0x0000061C, // ..**....***..
+- 0x000007F8, // ..********...
+- 0x000001F0, // ....*****....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- },
++ 16, 27,
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x381c, // ..................###......###..
++ 0x1c38, // ...................###....###...
++ 0xe70, // ....................###..###....
++ 0x7e0, // .....................######.....
++ 0x3ffc, // ..................############..
++ 0x7ffe, // .................##############.
++ 0x700e, // .................###........###.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x7ffe, // .................##############.
++ 0x3ffc, // ..................############..
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x0, // ................................
++ },
++// { // 245
++// 13, 27,
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000180, // ....**.......
++// 0x000003F8, // ...*******...
++// 0x00000270, // ...*..***....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x000001F0, // ....*****....
++// 0x000007F8, // ..********...
++// 0x0000061C, // ..**....***..
++// 0x00000C0E, // .**......***.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C0E, // .**......***.
++// 0x0000061C, // ..**....***..
++// 0x000007F8, // ..********...
++// 0x000001F0, // ....*****....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// },
+ { // 246
+ 13, 27,
+ 0x00000000, // .............
+@@ -6510,95 +6600,185 @@
+ 0x00000000, // ..............
+ },
+ { // 249
+- 13, 27,
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000380, // ...***.......
+- 0x000000C0, // .....**......
+- 0x00000040, // ......*......
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C1C, // .**.....***..
+- 0x00000FFC, // .**********..
+- 0x000003E0, // ...*****.....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- },
++ 16, 27,
++ 0x0, // ................
++ 0xf800, // #####...........
++ 0xfc00, // ######..........
++ 0xcc00, // ##..##..........
++ 0xfc00, // ######..........
++ 0xf000, // ####............
++ 0xf800, // #####...........
++ 0xfc00, // ######..........
++ 0xdc00, // ##.###..........
++ 0x0, // ................
++ 0x1f80, // ...######.......
++ 0x1f80, // ...######.......
++ 0x1800, // ...##...........
++ 0x1e00, // ...####.........
++ 0x1e00, // ...####.........
++ 0x1800, // ...##...........
++ 0x1f80, // ...######.......
++ 0x1f80, // ...######.......
++ 0x0, // ................
++ 0x3c0, // ......####......
++ 0x7e0, // .....######.....
++ 0xe60, // ....###..##.....
++ 0xc00, // ....##..........
++ 0xc00, // ....##..........
++ 0xe60, // ....###..##.....
++ 0x7e0, // .....######.....
++ 0x3c0, // ......####......
++ },
++// { // 249
++// 13, 27,
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000380, // ...***.......
++// 0x000000C0, // .....**......
++// 0x00000040, // ......*......
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C1C, // .**.....***..
++// 0x00000FFC, // .**********..
++// 0x000003E0, // ...*****.....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// },
+ { // 250
+- 13, 27,
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000070, // ......***....
+- 0x00000060, // ......**.....
+- 0x000000C0, // .....**......
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C1C, // .**.....***..
+- 0x00000FFC, // .**********..
+- 0x000003E0, // ...*****.....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- },
++ 16, 27,
++ 0x0, // ................
++ 0xc600, // ##...##.........
++ 0xe600, // ###..##.........
++ 0xf600, // ####.##.........
++ 0xf600, // ####.##.........
++ 0xde00, // ##.####.........
++ 0xde00, // ##.####.........
++ 0xce00, // ##..###.........
++ 0xc600, // ##...##.........
++ 0x0, // ................
++ 0x1fc0, // ...#######......
++ 0x1fc0, // ...#######......
++ 0x1800, // ...##...........
++ 0x1f00, // ...#####........
++ 0x1f00, // ...#####........
++ 0x1800, // ...##...........
++ 0x1fc0, // ...#######......
++ 0x1fc0, // ...#######......
++ 0x0, // ................
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x3f8, // ......#######...
++ 0x1f0, // .......#####....
++ },
++// { // 250
++// 13, 27,
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000070, // ......***....
++// 0x00000060, // ......**.....
++// 0x000000C0, // .....**......
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C1C, // .**.....***..
++// 0x00000FFC, // .**********..
++// 0x000003E0, // ...*****.....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// },
+ { // 251
+- 13, 27,
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x000000E0, // .....***.....
+- 0x000001A0, // ....**.*.....
+- 0x00000130, // ....*..**....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C0C, // .**......**..
+- 0x00000C1C, // .**.....***..
+- 0x00000FFC, // .**********..
+- 0x000003E0, // ...*****.....
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- },
++ 16, 27,
++ 0x0, // ................
++ 0x0, // ................
++ 0x78, // ..........####..
++ 0xfc, // .........######.
++ 0x1e6, // ........####..##
++ 0x1fe, // ........########
++ 0x1de, // ........###.####
++ 0x1e0, // ........####....
++ 0x70f8, // ..###....#####..
++ 0xf8c0, // .#####...##.....
++ 0x19dc0, // ##..###.###.....
++ 0x18f80, // ##...#####......
++ 0x1c780, // ###...####......
++ 0xcf00, // .##..####.......
++ 0x1f98, // ....######..##..
++ 0x39f0, // ...###..#####...
++ 0x70e0, // ..###....###....
++ 0xe000, // .###............
++ 0x1e000, // ####............
++ 0x1b000, // ##.##...........
++ 0x19800, // ##..##..........
++ 0xcc00, // .##..##.........
++ 0x6600, // ..##..##........
++ 0x3b80, // ...###.###......
++ 0x3b80, // ...###.###......
++ 0x0, // ................
++ 0x0, // ................
++ },
++// { // 251
++// 13, 27,
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x000000E0, // .....***.....
++// 0x000001A0, // ....**.*.....
++// 0x00000130, // ....*..**....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C0C, // .**......**..
++// 0x00000C1C, // .**.....***..
++// 0x00000FFC, // .**********..
++// 0x000003E0, // ...*****.....
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// },
+ { // 252
+ 13, 27,
+ 0x00000000, // .............
+@@ -6630,93 +6810,196 @@
+ 0x00000000, // .............
+ },
+ { // 253
+- 12, 27,
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000038, // ......***...
+- 0x00000070, // .....***....
+- 0x00000040, // .....*......
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000606, // .**......**.
+- 0x0000060E, // .**.....***.
+- 0x0000060C, // .**.....**..
+- 0x0000030C, // ..**....**..
+- 0x00000318, // ..**...**...
+- 0x00000318, // ..**...**...
+- 0x00000198, // ...**..**...
+- 0x000001B0, // ...**.**....
+- 0x000001B0, // ...**.**....
+- 0x000000F0, // ....****....
+- 0x000000E0, // ....***.....
+- 0x000000E0, // ....***.....
+- 0x000000C0, // ....**......
+- 0x000000C0, // ....**......
+- 0x000001C0, // ...***......
+- 0x00000780, // .****.......
+- 0x00000700, // .***........
+- },
++ 16, 27,
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x6006, // .##..........##.
++ 0xf3cf, // ####..####..####
++ 0xf7ef, // ####.######.####
++ 0x3c3c, // ..####....####..
++ 0x1998, // ...##..##..##...
++ 0x318c, // ..##...##...##..
++ 0x318c, // ..##...##...##..
++ 0x30cc, // ..##....##..##..
++ 0x38dc, // ..###...##.###..
++ 0x1c38, // ...###....###...
++ 0xff0, // ....########....
++ 0xff0, // ....########....
++ 0xc30, // ....##....##....
++ 0x1818, // ...##......##...
++ 0x381c, // ..###......###..
++ 0xfc3f, // ######....######
++ 0xfc3f, // ######....######
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ },
++// { // 253
++// 12, 27,
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000038, // ......***...
++// 0x00000070, // .....***....
++// 0x00000040, // .....*......
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000606, // .**......**.
++// 0x0000060E, // .**.....***.
++// 0x0000060C, // .**.....**..
++// 0x0000030C, // ..**....**..
++// 0x00000318, // ..**...**...
++// 0x00000318, // ..**...**...
++// 0x00000198, // ...**..**...
++// 0x000001B0, // ...**.**....
++// 0x000001B0, // ...**.**....
++// 0x000000F0, // ....****....
++// 0x000000E0, // ....***.....
++// 0x000000E0, // ....***.....
++// 0x000000C0, // ....**......
++// 0x000000C0, // ....**......
++// 0x000001C0, // ...***......
++// 0x00000780, // .****.......
++// 0x00000700, // .***........
++// },
+ { // 254
+- 13, 27,
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000000, // .............
+- 0x00000C00, // .**..........
+- 0x00000C00, // .**..........
+- 0x00000C00, // .**..........
+- 0x00000C00, // .**..........
+- 0x00000DF0, // .**.*****....
+- 0x00000FFC, // .**********..
+- 0x00000F1C, // .****...***..
+- 0x00000E0E, // .***.....***.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000C06, // .**.......**.
+- 0x00000E0E, // .***.....***.
+- 0x00000F1C, // .****...***..
+- 0x00000FFC, // .**********..
+- 0x00000CF0, // .**..****....
+- 0x00000C00, // .**..........
+- 0x00000C00, // .**..........
+- 0x00000C00, // .**..........
+- 0x00000C00, // .**..........
+- 0x00000C00, // .**..........
+- },
++ 16, 27,
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x4, // ..............#.
++ 0x1180c, // #...##.......##.
++ 0x19c18, // ##..###.....##..
++ 0xd630, // .##.#.##...##...
++ 0x7360, // ..###..##.##....
++ 0x31c0, // ...##...###.....
++ 0x19f0, // ....##..#####...
++ 0x1f50, // ....#####.#.#...
++ 0x1650, // ....#.##..#.#...
++ 0x1f50, // ....#####.#.#...
++ 0x19f0, // ....##..#####...
++ 0x31c0, // ...##...###.....
++ 0x7360, // ..###..##.##....
++ 0xd630, // .##.#.##...##...
++ 0x19c18, // ##..###.....##..
++ 0x1180c, // #...##.......##.
++ 0x4, // ..............#.
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ },
++// { // 254
++// 13, 27,
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000000, // .............
++// 0x00000C00, // .**..........
++// 0x00000C00, // .**..........
++// 0x00000C00, // .**..........
++// 0x00000C00, // .**..........
++// 0x00000DF0, // .**.*****....
++// 0x00000FFC, // .**********..
++// 0x00000F1C, // .****...***..
++// 0x00000E0E, // .***.....***.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000C06, // .**.......**.
++// 0x00000E0E, // .***.....***.
++// 0x00000F1C, // .****...***..
++// 0x00000FFC, // .**********..
++// 0x00000CF0, // .**..****....
++// 0x00000C00, // .**..........
++// 0x00000C00, // .**..........
++// 0x00000C00, // .**..........
++// 0x00000C00, // .**..........
++// 0x00000C00, // .**..........
++// },
+ { // 255
+- 12, 27,
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x000001B8, // ...**.***...
+- 0x000001B8, // ...**.***...
+- 0x00000000, // ............
+- 0x00000000, // ............
+- 0x00000606, // .**......**.
+- 0x0000060E, // .**.....***.
+- 0x0000060C, // .**.....**..
+- 0x0000030C, // ..**....**..
+- 0x00000318, // ..**...**...
+- 0x00000318, // ..**...**...
+- 0x00000198, // ...**..**...
+- 0x000001B0, // ...**.**....
+- 0x000001B0, // ...**.**....
+- 0x000000F0, // ....****....
+- 0x000000E0, // ....***.....
+- 0x000000E0, // ....***.....
+- 0x000000C0, // ....**......
+- 0x000000C0, // ....**......
+- 0x000001C0, // ...***......
+- 0x00000780, // .****.......
+- 0x00000700, // .***........
+- },
++ 16, 27,
++ 0x0, // ................
++ 0x0, // ................
++ 0x7f80, // ..########......
++ 0xffc0, // .##########.....
++ 0x1ffe0, // ############....
++ 0x1f3e0, // #####..#####....
++ 0x1e1e0, // ####....####....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c7fc, // ###...#########.
++ 0x1c3f8, // ###....#######..
++ 0x1c1f0, // ###.....#####...
++ 0x1c0e0, // ###......###....
++ 0x40, // ..........#.....
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ },
++// { // 255
++// 12, 27,
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x000001B8, // ...**.***...
++// 0x000001B8, // ...**.***...
++// 0x00000000, // ............
++// 0x00000000, // ............
++// 0x00000606, // .**......**.
++// 0x0000060E, // .**.....***.
++// 0x0000060C, // .**.....**..
++// 0x0000030C, // ..**....**..
++// 0x00000318, // ..**...**...
++// 0x00000318, // ..**...**...
++// 0x00000198, // ...**..**...
++// 0x000001B0, // ...**.**....
++// 0x000001B0, // ...**.**....
++// 0x000000F0, // ....****....
++// 0x000000E0, // ....***.....
++// 0x000000E0, // ....***.....
++// 0x000000C0, // ....**......
++// 0x000000C0, // ....**......
++// 0x000001C0, // ...***......
++// 0x00000780, // .****.......
++// 0x00000700, // .***........
++// },
+ };
++
++// WarEagle-Symbol-Patch
++// Zeichen Symbol
++//
++// 255 Pfeil
++// 254 Lautsprecher
++// 253 Wecker
++// 251 Maennchen
++// 250 "NEU"
++// 249 "REC"
++// 244 Weiter-Links
++// 245 TV
++// 239 TV-verschluesselt
+diff -Naur vdr-1.3.22/fontsml-iso8859-15.c vdr-1.3.22-icon/fontsml-iso8859-15.c
+--- vdr-1.3.22/fontsml-iso8859-15.c 2004-12-18 17:14:51.000000000 +0100
++++ vdr-1.3.22-icon/fontsml-iso8859-15.c 2005-03-07 03:48:59.000000000 +0100
+@@ -5175,30 +5175,55 @@
+ 0x00000000, // ......
+ },
+ { // 239
+- 5, 22,
+- 0x00000000, // .....
+- 0x00000000, // .....
+- 0x00000000, // .....
+- 0x00000000, // .....
+- 0x0000001B, // **.**
+- 0x0000001B, // **.**
+- 0x00000000, // .....
+- 0x00000000, // .....
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x0000000C, // .**..
+- 0x00000000, // .....
+- 0x00000000, // .....
+- 0x00000000, // .....
+- 0x00000000, // .....
+- },
++ 16, 22,
++ 0x0, // ................................
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x381c, // ..................###......###..
++ 0x1c38, // ...................###....###...
++ 0xe70, // ....................###..###....
++ 0x7e0, // .....................######.....
++ 0x3ffc, // ..................############..
++ 0x7ffe, // .................##############.
++ 0x700e, // .................###........###.
++ 0x6006, // .................##..........##.
++ 0x6c06, // .................##.##.......##.
++ 0x6ff6, // .................##.########.##.
++ 0x6ff6, // .................##.########.##.
++ 0x6db6, // .................##.##.##.##.##.
++ 0x61b6, // .................##....##.##.##.
++ 0x61b6, // .................##....##.##.##.
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x7ffe, // .................##############.
++ 0x3ffc, // ..................############..
++ 0x0, // ................................
++ },
++// { // 239
++// 5, 22,
++// 0x00000000, // .....
++// 0x00000000, // .....
++// 0x00000000, // .....
++// 0x00000000, // .....
++// 0x0000001B, // **.**
++// 0x0000001B, // **.**
++// 0x00000000, // .....
++// 0x00000000, // .....
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x0000000C, // .**..
++// 0x00000000, // .....
++// 0x00000000, // .....
++// 0x00000000, // .....
++// 0x00000000, // .....
++// },
+ { // 240
+ 11, 22,
+ 0x00000000, // ...........
+@@ -5300,55 +5325,105 @@
+ 0x00000000, // ...........
+ },
+ { // 244
+- 11, 22,
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000060, // ....**.....
+- 0x000000F0, // ...****....
+- 0x00000198, // ..**..**...
+- 0x00000000, // ...........
+- 0x000000F8, // ...*****...
+- 0x000001FC, // ..*******..
+- 0x0000018C, // ..**...**..
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x0000018C, // ..**...**..
+- 0x000001FC, // ..*******..
+- 0x000000F8, // ...*****...
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- },
++ 16, 22,
++ 0x0, // ................................
++ 0x0, // ................................
++ 0x1c, // ...........................###..
++ 0x38, // ..........................###...
++ 0x70, // .........................###....
++ 0xe0, // ........................###.....
++ 0x1c0, // .......................###......
++ 0x380, // ......................###.......
++ 0x300, // ......................##........
++ 0x300, // ......................##........
++ 0x7ffe, // .................##############.
++ 0x7ffe, // .................##############.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x7ffe, // .................##############.
++ 0x7ffe, // .................##############.
++ 0x0, // ................................
++ },
++// { // 244
++// 11, 22,
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000060, // ....**.....
++// 0x000000F0, // ...****....
++// 0x00000198, // ..**..**...
++// 0x00000000, // ...........
++// 0x000000F8, // ...*****...
++// 0x000001FC, // ..*******..
++// 0x0000018C, // ..**...**..
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x0000018C, // ..**...**..
++// 0x000001FC, // ..*******..
++// 0x000000F8, // ...*****...
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// },
+ { // 245
+- 11, 22,
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x000000C8, // ...**..*...
+- 0x00000168, // ..*.**.*...
+- 0x00000130, // ..*..**....
+- 0x00000000, // ...........
+- 0x000000F8, // ...*****...
+- 0x000001FC, // ..*******..
+- 0x0000018C, // ..**...**..
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x0000018C, // ..**...**..
+- 0x000001FC, // ..*******..
+- 0x000000F8, // ...*****...
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- },
++ 16, 22,
++ 0x0, // ................................
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x381c, // ..................###......###..
++ 0x1c38, // ...................###....###...
++ 0xe70, // ....................###..###....
++ 0x7e0, // .....................######.....
++ 0x3ffc, // ..................############..
++ 0x7ffe, // .................##############.
++ 0x700e, // .................###........###.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x6006, // .................##..........##.
++ 0x700e, // .................###........###.
++ 0x7ffe, // .................##############.
++ 0x3ffc, // ..................############..
++ 0x0, // ................................
++ },
++// { // 245
++// 11, 22,
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x000000C8, // ...**..*...
++// 0x00000168, // ..*.**.*...
++// 0x00000130, // ..*..**....
++// 0x00000000, // ...........
++// 0x000000F8, // ...*****...
++// 0x000001FC, // ..*******..
++// 0x0000018C, // ..**...**..
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x0000018C, // ..**...**..
++// 0x000001FC, // ..*******..
++// 0x000000F8, // ...*****...
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// },
+ { // 246
+ 11, 22,
+ 0x00000000, // ...........
+@@ -5425,80 +5500,155 @@
+ 0x00000000, // ...........
+ },
+ { // 249
+- 10, 22,
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000060, // ...**.....
+- 0x00000030, // ....**....
+- 0x00000018, // .....**...
+- 0x00000000, // ..........
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x0000018E, // .**...***.
+- 0x000001FE, // .********.
+- 0x000000F6, // ..****.**.
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- },
++ 16, 22,
++ 0x0, // ................
++ 0xf800, // #####...........
++ 0xcc00, // ##..##..........
++ 0xfc00, // ######..........
++ 0xf800, // #####...........
++ 0xdc00, // ##.###..........
++ 0x0, // ................
++ 0x1f80, // ...######.......
++ 0x1f80, // ...######.......
++ 0x1800, // ...##...........
++ 0x1e00, // ...####.........
++ 0x1800, // ...##...........
++ 0x1f80, // ...######.......
++ 0x1f80, // ...######.......
++ 0x0, // ................
++ 0x3c0, // ......####......
++ 0x7e0, // .....######.....
++ 0xe60, // ....###..##.....
++ 0xc00, // ....##..........
++ 0xe60, // ....###..##.....
++ 0x7e0, // .....######.....
++ 0x3c0, // ......####......
++ },
++// { // 249
++// 10, 22,
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000060, // ...**.....
++// 0x00000030, // ....**....
++// 0x00000018, // .....**...
++// 0x00000000, // ..........
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x0000018E, // .**...***.
++// 0x000001FE, // .********.
++// 0x000000F6, // ..****.**.
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// },
+ { // 250
+- 10, 22,
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x0000000C, // ......**..
+- 0x00000018, // .....**...
+- 0x00000030, // ....**....
+- 0x00000000, // ..........
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x0000018E, // .**...***.
+- 0x000001FE, // .********.
+- 0x000000F6, // ..****.**.
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- },
++ 16, 22,
++ 0x0, // ................
++ 0xc600, // ##...##.........
++ 0xe600, // ###..##.........
++ 0xf600, // ####.##.........
++ 0xde00, // ##.####.........
++ 0xce00, // ##..###.........
++ 0xc600, // ##...##.........
++ 0x0, // ................
++ 0x1fc0, // ...#######......
++ 0x1fc0, // ...#######......
++ 0x1800, // ...##...........
++ 0x1f00, // ...#####........
++ 0x1800, // ...##...........
++ 0x1fc0, // ...#######......
++ 0x1fc0, // ...#######......
++ 0x0, // ................
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x318, // ......##...##...
++ 0x3f8, // ......#######...
++ 0x1f0, // .......#####....
++ },
++// { // 250
++// 10, 22,
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x0000000C, // ......**..
++// 0x00000018, // .....**...
++// 0x00000030, // ....**....
++// 0x00000000, // ..........
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x0000018E, // .**...***.
++// 0x000001FE, // .********.
++// 0x000000F6, // ..****.**.
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// },
+ { // 251
+- 10, 22,
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000030, // ....**....
+- 0x00000078, // ...****...
+- 0x000000CC, // ..**..**..
+- 0x00000000, // ..........
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x0000018E, // .**...***.
+- 0x000001FE, // .********.
+- 0x000000F6, // ..****.**.
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- },
++ 16, 22,
++ 0x0, // ................
++ 0x78, // ..........####..
++ 0xfc, // .........######.
++ 0x1e6, // ........####..##
++ 0x1de, // ........###.####
++ 0x1e0, // ........####....
++ 0x70f8, // ..###....#####..
++ 0xf8c0, // .#####...##.....
++ 0x19dc0, // ##..###.###.....
++ 0x18f80, // ##...#####......
++ 0x1c780, // ###...####......
++ 0xcf00, // .##..####.......
++ 0x1f98, // ....######..##..
++ 0x39f0, // ...###..#####...
++ 0x70e0, // ..###....###....
++ 0xe000, // .###............
++ 0x1e000, // ####............
++ 0x1b000, // ##.##...........
++ 0x19800, // ##..##..........
++ 0x6600, // ..##..##........
++ 0x3b80, // ...###.###......
++ 0x0, // ................
++ },
++// { // 251
++// 10, 22,
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000030, // ....**....
++// 0x00000078, // ...****...
++// 0x000000CC, // ..**..**..
++// 0x00000000, // ..........
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x0000018E, // .**...***.
++// 0x000001FE, // .********.
++// 0x000000F6, // ..****.**.
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// },
+ { // 252
+ 10, 22,
+ 0x00000000, // ..........
+@@ -5525,78 +5675,165 @@
+ 0x00000000, // ..........
+ },
+ { // 253
+- 10, 22,
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x0000000C, // ......**..
+- 0x00000018, // .....**...
+- 0x00000030, // ....**....
+- 0x00000000, // ..........
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x000000CC, // ..**..**..
+- 0x000000CC, // ..**..**..
+- 0x000000CC, // ..**..**..
+- 0x00000048, // ...*..*...
+- 0x00000078, // ...****...
+- 0x00000030, // ....**....
+- 0x00000030, // ....**....
+- 0x00000030, // ....**....
+- 0x00000030, // ....**....
+- 0x000000E0, // ..***.....
+- 0x000000E0, // ..***.....
+- },
++ 16, 22,
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x6006, // .##..........##.
++ 0xf3cf, // ####..####..####
++ 0xf7ef, // ####.######.####
++ 0x3c3c, // ..####....####..
++ 0x1998, // ...##..##..##...
++ 0x318c, // ..##...##...##..
++ 0x318c, // ..##...##...##..
++ 0x30cc, // ..##....##..##..
++ 0x38dc, // ..###...##.###..
++ 0x1c38, // ...###....###...
++ 0xff0, // ....########....
++ 0xff0, // ....########....
++ 0xc30, // ....##....##....
++ 0x1818, // ...##......##...
++ 0x381c, // ..###......###..
++ 0xfc3f, // ######....######
++ 0xfc3f, // ######....######
++ 0x0, // ................
++ 0x0, // ................
++ },
++// { // 253
++// 10, 22,
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x0000000C, // ......**..
++// 0x00000018, // .....**...
++// 0x00000030, // ....**....
++// 0x00000000, // ..........
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x000000CC, // ..**..**..
++// 0x000000CC, // ..**..**..
++// 0x000000CC, // ..**..**..
++// 0x00000048, // ...*..*...
++// 0x00000078, // ...****...
++// 0x00000030, // ....**....
++// 0x00000030, // ....**....
++// 0x00000030, // ....**....
++// 0x00000030, // ....**....
++// 0x000000E0, // ..***.....
++// 0x000000E0, // ..***.....
++// },
+ { // 254
+- 11, 22,
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000000, // ...........
+- 0x00000300, // .**........
+- 0x00000300, // .**........
+- 0x00000300, // .**........
+- 0x00000300, // .**........
+- 0x00000378, // .**.****...
+- 0x000003FC, // .********..
+- 0x0000038C, // .***...**..
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x00000306, // .**.....**.
+- 0x0000038C, // .***...**..
+- 0x000003FC, // .********..
+- 0x00000378, // .**.****...
+- 0x00000300, // .**........
+- 0x00000300, // .**........
+- 0x00000300, // .**........
+- 0x00000300, // .**........
+- },
+- { // 255
+- 10, 22,
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x000000CC, // ..**..**..
+- 0x000000CC, // ..**..**..
+- 0x00000000, // ..........
+- 0x00000000, // ..........
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x00000186, // .**....**.
+- 0x000000CC, // ..**..**..
+- 0x000000CC, // ..**..**..
+- 0x000000CC, // ..**..**..
+- 0x00000048, // ...*..*...
+- 0x00000078, // ...****...
+- 0x00000030, // ....**....
+- 0x00000030, // ....**....
+- 0x00000030, // ....**....
+- 0x00000030, // ....**....
+- 0x000000E0, // ..***.....
+- 0x000000E0, // ..***.....
+- },
++ 16, 22,
++ 0x0, // ................
++ 0x0, // ................
++ 0x0, // ................
++ 0x4, // ..............#.
++ 0x1180c, // #...##.......##.
++ 0x19c18, // ##..###.....##..
++ 0xd630, // .##.#.##...##...
++ 0x7360, // ..###..##.##....
++ 0x31c0, // ...##...###.....
++ 0x19f0, // ....##..#####...
++ 0x1f50, // ....#####.#.#...
++ 0x1650, // ....#.##..#.#...
++ 0x1f50, // ....#####.#.#...
++ 0x19f0, // ....##..#####...
++ 0x31c0, // ...##...###.....
++ 0x7360, // ..###..##.##....
++ 0xd630, // .##.#.##...##...
++ 0x19c18, // ##..###.....##..
++ 0x1180c, // #...##.......##.
++ 0x4, // ..............#.
++ 0x0, // ................
++ 0x0, // ................
++ },
++// { // 254
++// 11, 22,
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000000, // ...........
++// 0x00000300, // .**........
++// 0x00000300, // .**........
++// 0x00000300, // .**........
++// 0x00000300, // .**........
++// 0x00000378, // .**.****...
++// 0x000003FC, // .********..
++// 0x0000038C, // .***...**..
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x00000306, // .**.....**.
++// 0x0000038C, // .***...**..
++// 0x000003FC, // .********..
++// 0x00000378, // .**.****...
++// 0x00000300, // .**........
++// 0x00000300, // .**........
++// 0x00000300, // .**........
++// 0x00000300, // .**........
++// },
++ { // 255
++ 16, 22,
++ 0x0, // ................
++ 0x7f80, // ..########......
++ 0xffc0, // .##########.....
++ 0x1ffe0, // ############....
++ 0x1f3e0, // #####..#####....
++ 0x1e1e0, // ####....####....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c0e0, // ###......###....
++ 0x1c7fc, // ###...#########.
++ 0x1c3f8, // ###....#######..
++ 0x1c1f0, // ###.....#####...
++ 0x1c0e0, // ###......###....
++ 0x40, // ..........#.....
++ 0x0, // ................
++ 0x0, // ................
++ },
++// { // 255
++// 10, 22,
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x000000CC, // ..**..**..
++// 0x000000CC, // ..**..**..
++// 0x00000000, // ..........
++// 0x00000000, // ..........
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x00000186, // .**....**.
++// 0x000000CC, // ..**..**..
++// 0x000000CC, // ..**..**..
++// 0x000000CC, // ..**..**..
++// 0x00000048, // ...*..*...
++// 0x00000078, // ...****...
++// 0x00000030, // ....**....
++// 0x00000030, // ....**....
++// 0x00000030, // ....**....
++// 0x00000030, // ....**....
++// 0x000000E0, // ..***.....
++// 0x000000E0, // ..***.....
++// },
+ };
++
++// WarEagle-Symbol-Patch
++// Zeichen Symbol
++//
++// 255 Pfeil
++// 254 Lautsprecher
++// 253 Wecker
++// 251 Maennchen
++// 250 "NEU"
++// 249 "REC"
++// 244 Weiter-Links
++// 245 TV
+diff -Naur vdr-1.3.22/i18n.c vdr-1.3.22-icon/i18n.c
+--- vdr-1.3.22/i18n.c 2005-02-27 10:45:57.000000000 +0100
++++ vdr-1.3.22-icon/i18n.c 2005-03-06 02:04:44.000000000 +0100
+@@ -2611,6 +2611,35 @@
+ "Teema",
+ "Tema",
+ },
++ { "Setup.OSD$WarEagle icons",
++ "WarEagle-Symbole",
++ "", // Slovenski
++ "", // Italiano
++ "", // Nederlands
++ "", // Português
++ "", // Français
++ "", // Norsk
++ "", // Suomi
++ "", // Polski
++ "", // Español
++ "", // Greek
++ "", // Svenska
++ "", // Romaneste
++ "", // Magyar
++ "", // Català
++#if VDRVERSNUM > 10302
++ "", // Russian
++#if VDRVERSNUM > 10307
++ "", // Hrvatski
++#if VDRVERSNUM > 10313
++ "", // Eesti
++#if VDRVERSNUM > 10316
++ "", // Dansk
++#endif
++#endif
++#endif
++#endif
++ },
+ { "Setup.OSD$Left",
+ "Links",
+ "",// TODO
+diff -Naur vdr-1.3.22/iconpatch.h vdr-1.3.22-icon/iconpatch.h
+--- vdr-1.3.22/iconpatch.h 1970-01-01 01:00:00.000000000 +0100
++++ vdr-1.3.22-icon/iconpatch.h 2005-03-04 19:58:28.000000000 +0100
+@@ -0,0 +1,24 @@
++/*
++ * iconpatch.h: Information of iconpatch
++ *
++ * Diese Datei ist die Übersichtsdatei für den Iconpatch.
++ * Hier werden kleine Infos abgelegt.
++ * Der Iconpatch ändert die Dateien:
++ * iconpatch.h
++ * menu.c
++ * recording.c
++ * fontosd.c
++ *
++ */
++
++//Iconpatch-Variablen - Anfang
++#define ICON_RADIO char(244)
++#define ICON_TV char(245)
++#define ICON_TV_VERSCHL char(239)
++#define ICON_REC char(249)
++#define ICON_NEU char(250)
++#define ICON_RENNER char(251)
++#define ICON_UHR char(253)
++#define ICON_LAUTSPRECHER char(254)
++#define ICON_PFEIL char(255)
++//Iconpatch-Variablen - Ende
+diff -Naur vdr-1.3.22/menu.c vdr-1.3.22-icon/menu.c
+--- vdr-1.3.22/menu.c 2005-02-27 15:09:00.000000000 +0100
++++ vdr-1.3.22-icon/menu.c 2005-03-07 03:57:22.000000000 +0100
+@@ -8,6 +8,7 @@
+ */
+
+ #include "menu.h"
++#include "iconpatch.h"
+ #include <ctype.h>
+ #include <limits.h>
+ #include <stdio.h>
+@@ -371,6 +372,14 @@
+ } else {
+ if (sortMode == csmProvider || sortMode == csmProviderNumber)
+ asprintf(&buffer, "%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name());
++ else if (Setup.WarEagleIcons) {
++ if (channel->Vpid() == 1 || channel->Vpid() == 0)
++ asprintf(&buffer, "%d\t%c %-30s", channel->Number(), ICON_RADIO, channel->Name());
++ else if (channel->Ca() == 0)
++ asprintf(&buffer, "%d\t%c %-30s", channel->Number(), ICON_TV, channel->Name());
++ else
++ asprintf(&buffer, "%d\t%c %-30s", channel->Number(), ICON_TV_VERSCHL, channel->Name());
++ }
+ else
+ asprintf(&buffer, "%d\t%s", channel->Number(), channel->Name());
+ }
+@@ -735,7 +744,7 @@
+ {
+ char *buffer = NULL;
+ asprintf(&buffer, "%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s",
+- !(timer->HasFlags(tfActive)) ? ' ' : timer->FirstDay() ? '!' : timer->Recording() ? '#' : '>',
++ !(timer->HasFlags(tfActive)) ? ' ' : timer->FirstDay() ? Setup.WarEagleIcons ? ICON_PFEIL : '!' : timer->Recording() ? Setup.WarEagleIcons ? ICON_REC : '#' : Setup.WarEagleIcons ? ICON_UHR : '>',
+ timer->Channel()->Number(),
+ timer->IsSingleEvent() ? *WeekDayName(timer->StartTime()) : "",
+ timer->IsSingleEvent() ? " " : "",
+@@ -1762,6 +1771,7 @@
+ Add(new cMenuEditStraItem(tr("Setup.OSD$Skin"), &skinIndex, numSkins, skinDescriptions));
+ if (themes.NumThemes())
+ Add(new cMenuEditStraItem(tr("Setup.OSD$Theme"), &themeIndex, themes.NumThemes(), themes.Descriptions()));
++ Add(new cMenuEditBoolItem(tr("Setup.OSD$WarEagle icons"), &data.WarEagleIcons));
+ Add(new cMenuEditIntItem( tr("Setup.OSD$Left"), &data.OSDLeft, 0, MAXOSDWIDTH));
+ Add(new cMenuEditIntItem( tr("Setup.OSD$Top"), &data.OSDTop, 0, MAXOSDHEIGHT));
+ Add(new cMenuEditIntItem( tr("Setup.OSD$Width"), &data.OSDWidth, MINOSDWIDTH, MAXOSDWIDTH));
+diff -Naur vdr-1.3.22/recording.c vdr-1.3.22-icon/recording.c
+--- vdr-1.3.22/recording.c 2005-02-12 11:17:47.000000000 +0100
++++ vdr-1.3.22-icon/recording.c 2005-03-04 20:03:31.000000000 +0100
+@@ -8,6 +8,7 @@
+ */
+
+ #include "recording.h"
++#include "iconpatch.h"
+ #include <dirent.h>
+ #include <errno.h>
+ #include <fcntl.h>
+@@ -492,7 +493,7 @@
+
+ const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) const
+ {
+- char New = NewIndicator && IsNew() ? '*' : ' ';
++ char New = NewIndicator && IsNew() ? Setup.WarEagleIcons ? ICON_NEU : '*' : ' ';
+ free(titleBuffer);
+ titleBuffer = NULL;
+ if (Level < 0 || Level == HierarchyLevels()) {
Added: vdr/vdr/trunk/debian/patches/opt-41-x_timer-info.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-41-x_timer-info.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-41-x_timer-info.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,302 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-41-x_timer-info.dpatch by Andreas Brugger <brougs78 at gmx.net>, Thomas Günther <tom at toms-cafe.de>
+## http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.3.45.diff
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Shows info, if it is possible to record an event in the timer-info of
+## DP: vdr - see README.timer-info for details.
+
+ at DPATCH@
+diff -urNad vdr-1.3.45~/README.timer-info vdr-1.3.45/README.timer-info
+--- vdr-1.3.45~/README.timer-info 1970-01-01 01:00:00.000000000 +0100
++++ vdr-1.3.45/README.timer-info 2006-03-26 20:11:11.000000000 +0200
+@@ -0,0 +1,53 @@
+++------------------------------------------------------------------------------+
++| Info about the timer-info-patch by Brougs78 |
++| brougs78 at gmx.net / home.pages.at/brougs78 |
+++------------------------------------------------------------------------------+
++
++
++README timer-info:
++------------------
++
++Features:
++ - Shows info, if it is possible to record an event in the timer menu of vdr.
++ For calculations the free space incl. the deleted recordings is used,
++ considering an average consumtion of 25.75 MB/min (also used by vdr itself).
++ The first column in the timer-list shows:
++ ( + ) recording will be most probably possible (enough space)
++ (+/-) recording may be possible
++ ( - ) recording will most probably fail (to less space)
++ The calculations also consider repeating timers.
++ - It is possible to deactivate the patch in the OSD-menu of VDR.
++
++
++HISTORY timer-info:
++-------------------
++
++25.11.2004: v0.1
++ - Initial release
++
++11.01.2005: v0.1b
++ - Bugfixes for vdr-1.3.18
++ - In the menu the free recording-time no longer includes the space of the
++ deleted recordings, because this slowed the vdr down to much.
++
++08.07.2005: v0.1c
++ - Made the patch configurable
++
++29.01.2006: v0.2 - Thomas Günther <tom at toms-cafe.de>
++ - Rewritten great parts for vdr-1.3.38+
++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.2-1.3.38+.diff
++
++05.02.2006: v0.3 - Thomas Günther <tom at toms-cafe.de>
++ - Fixed refresh of timer menu in cMenuTimers::OnOff
++ - Fixed check of repeating timers
++ - Syslog debug messages can be enabled with Define DEBUG_TIMER_INFO
++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.3-1.3.38+.diff
++
++03.03.2006: v0.4 - Thomas Günther <tom at toms-cafe.de>
++ - Adapted to vdr-1.3.44
++ - Removed setup parameter "Show timer-info"
++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.3.44.diff
++
++03.03.2006: v0.5 - Tobias Grimm <tg at e-tobi.net>
++ - Adapted to vdr-1.3.45
++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.3.45.diff
+diff -urNad vdr-1.3.45~/menu.c vdr-1.3.45/menu.c
+--- vdr-1.3.45~/menu.c 2006-02-28 14:58:00.000000000 +0100
++++ vdr-1.3.45/menu.c 2006-03-26 20:10:17.000000000 +0200
+@@ -41,6 +41,8 @@
+
+ #define CHNUMWIDTH (numdigits(Channels.MaxNumber()) + 1)
+
++#define MB_PER_MINUTE 25.75 // this is just an estimate!
++
+ // --- cMenuEditCaItem -------------------------------------------------------
+
+ class cMenuEditCaItem : public cMenuEditIntItem {
+@@ -713,8 +715,10 @@
+ class cMenuTimerItem : public cOsdItem {
+ private:
+ cTimer *timer;
++ char diskStatus;
+ public:
+ cMenuTimerItem(cTimer *Timer);
++ void SetDiskStatus(char DiskStatus);
+ virtual int Compare(const cListObject &ListObject) const;
+ virtual void Set(void);
+ cTimer *Timer(void) { return timer; }
+@@ -723,6 +727,7 @@
+ cMenuTimerItem::cMenuTimerItem(cTimer *Timer)
+ {
+ timer = Timer;
++ diskStatus = ' ';
+ Set();
+ }
+
+@@ -760,9 +765,64 @@
+ timer->Stop() / 100,
+ timer->Stop() % 100,
+ timer->File());
++ char *buffer2 = buffer;
++ buffer = NULL;
++ asprintf(&buffer, "%c%s", diskStatus, buffer2);
++ free(buffer2);
+ SetText(buffer, false);
+ }
+
++void cMenuTimerItem::SetDiskStatus(char DiskStatus)
++{
++ diskStatus = DiskStatus;
++ Set();
++}
++
++// --- cTimerEntry -----------------------------------------------------------
++
++class cTimerEntry : public cListObject {
++private:
++ cMenuTimerItem *item;
++ const cTimer *timer;
++ time_t start;
++public:
++ cTimerEntry(cMenuTimerItem *item) : item(item), timer(item->Timer()), start(timer->StartTime()) {}
++ cTimerEntry(const cTimer *timer, time_t start) : item(NULL), timer(timer), start(start) {}
++ virtual int Compare(const cListObject &ListObject) const;
++ bool active(void) const { return timer->HasFlags(tfActive); }
++ time_t startTime(void) const { return start; }
++ int priority(void) const { return timer->Priority(); }
++ int duration(void) const;
++ bool repTimer(void) const { return !timer->IsSingleEvent(); }
++ bool isDummy(void) const { return item == NULL; }
++ const cTimer *Timer(void) const { return timer; }
++ void SetDiskStatus(char DiskStatus);
++ };
++
++int cTimerEntry::Compare(const cListObject &ListObject) const
++{
++ cTimerEntry *entry = (cTimerEntry *)&ListObject;
++ int r = startTime() - entry->startTime();
++ if (r == 0)
++ r = entry->priority() - priority();
++ return r;
++}
++
++int cTimerEntry::duration(void) const
++{
++ int dur = (timer->Stop() / 100 * 60 + timer->Stop() % 100) -
++ (timer->Start() / 100 * 60 + timer->Start() % 100);
++ if (dur < 0)
++ dur += 24 * 60;
++ return dur;
++}
++
++void cTimerEntry::SetDiskStatus(char DiskStatus)
++{
++ if (item)
++ item->SetDiskStatus(DiskStatus);
++}
++
+ // --- cMenuTimers -----------------------------------------------------------
+
+ class cMenuTimers : public cOsdMenu {
+@@ -775,14 +835,17 @@
+ eOSState Info(void);
+ cTimer *CurrentTimer(void);
+ void SetHelpKeys(void);
++ void ActualiseDiskStatus(void);
++ bool actualiseDiskStatus;
+ public:
+ cMenuTimers(void);
+ virtual ~cMenuTimers();
++ virtual void Display(void);
+ virtual eOSState ProcessKey(eKeys Key);
+ };
+
+ cMenuTimers::cMenuTimers(void)
+-:cOsdMenu(tr("Timers"), 2, CHNUMWIDTH, 10, 6, 6)
++:cOsdMenu(tr("Timers"), 3, CHNUMWIDTH, 10, 6, 6)
+ {
+ helpKeys = -1;
+ for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) {
+@@ -793,6 +856,7 @@
+ SetCurrent(First());
+ SetHelpKeys();
+ Timers.IncBeingEdited();
++ actualiseDiskStatus = true;
+ }
+
+ cMenuTimers::~cMenuTimers()
+@@ -831,7 +895,7 @@
+ timer->OnOff();
+ timer->SetEventFromSchedule();
+ RefreshCurrent();
+- DisplayCurrent(true);
++ Display();
+ if (timer->FirstDay())
+ isyslog("timer %s first day set to %s", *timer->ToDescr(), *timer->PrintFirstDay());
+ else
+@@ -890,6 +954,67 @@
+ return osContinue;
+ }
+
++void cMenuTimers::ActualiseDiskStatus(void)
++{
++ if (!actualiseDiskStatus || !Count())
++ return;
++
++ // compute free disk space
++ int freeMB, freeMinutes, runshortMinutes;
++ VideoDiskSpace(&freeMB);
++ freeMinutes = int(double(freeMB) * 1.1 / MB_PER_MINUTE); // overestimate by 10 percent
++ runshortMinutes = freeMinutes / 5; // 20 Percent
++
++ // fill entries list
++ cTimerEntry *entry;
++ cList<cTimerEntry> entries;
++ for (cOsdItem *item = First(); item; item = Next(item))
++ entries.Add(new cTimerEntry((cMenuTimerItem *)item));
++
++ // search last start time
++ time_t last = 0;
++ for (entry = entries.First(); entry; entry = entries.Next(entry))
++ last = max(entry->startTime(), last);
++
++ // add entries for repeating timers
++ for (entry = entries.First(); entry; entry = entries.Next(entry))
++ if (entry->repTimer() && !entry->isDummy())
++ for (time_t start = cTimer::IncDay(entry->startTime(), 1);
++ start <= last;
++ start = cTimer::IncDay(start, 1))
++ if (entry->Timer()->DayMatches(start))
++ entries.Add(new cTimerEntry(entry->Timer(), start));
++
++ // set the disk-status
++ entries.Sort();
++ for (entry = entries.First(); entry; entry = entries.Next(entry)) {
++ char status = ' ';
++ if (entry->active()) {
++ freeMinutes -= entry->duration();
++ status = freeMinutes > runshortMinutes ? '+' : freeMinutes > 0 ? 177 /* +/- */ : '-';
++ }
++ entry->SetDiskStatus(status);
++#ifdef DEBUG_TIMER_INFO
++ dsyslog("timer-info: %c | %d | %s | %s | %3d | %+5d -> %+5d",
++ status,
++ entry->startTime(),
++ entry->active() ? "aktiv " : "n.akt.",
++ entry->repTimer() ? entry->isDummy() ? " dummy " : "mehrmalig" : "einmalig ",
++ entry->duration(),
++ entry->active() ? freeMinutes + entry->duration() : freeMinutes,
++ freeMinutes);
++#endif
++ }
++
++ actualiseDiskStatus = false;
++}
++
++void cMenuTimers::Display(void)
++{
++ ActualiseDiskStatus();
++ cOsdMenu::Display();
++}
++
+ eOSState cMenuTimers::ProcessKey(eKeys Key)
+ {
+ int TimerNumber = HasSubMenu() ? Count() : -1;
+@@ -898,17 +1023,21 @@
+ if (state == osUnknown) {
+ switch (Key) {
+ case kOk: return Edit();
+- case kRed: state = OnOff(); break; // must go through SetHelpKeys()!
++ case kRed: actualiseDiskStatus = true;
++ state = OnOff(); break; // must go through SetHelpKeys()!
+ case kGreen: return New();
+- case kYellow: state = Delete(); break;
++ case kYellow: actualiseDiskStatus = true;
++ state = Delete(); break;
+ case kBlue: return Info();
+ break;
+ default: break;
+ }
+ }
+- if (TimerNumber >= 0 && !HasSubMenu() && Timers.Get(TimerNumber)) {
+- // a newly created timer was confirmed with Ok
+- Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true);
++ if (TimerNumber >= 0 && !HasSubMenu()) {
++ if (Timers.Get(TimerNumber)) // a newly created timer was confirmed with Ok
++ Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true);
++ Sort();
++ actualiseDiskStatus = true;
+ Display();
+ }
+ if (Key != kNone)
+@@ -2814,8 +2943,6 @@
+ Display();
+ }
+
+-#define MB_PER_MINUTE 25.75 // this is just an estimate!
+-
+ bool cMenuMain::Update(bool Force)
+ {
+ bool result = false;
Added: vdr/vdr/trunk/debian/patches/opt-42-x_extrecmenu.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-42-x_extrecmenu.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-42-x_extrecmenu.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,41 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-xx_extrecmenu.dpatch by Martin Prochnow <nordlicht at martins-kabuff.de>
+## From the vdr-extrecmenu plugin: http://martins-kabuff.de/extrecmenu.html
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch allows the extrecmenu plugin to replace the recordings
+## DP: menu with it's own version.
+
+ at DPATCH@
+diff -urNad vdr-1.4.2~/menu.c vdr-1.4.2/menu.c
+--- vdr-1.4.2~/menu.c 2006-08-27 22:49:17.000000000 +0200
++++ vdr-1.4.2/menu.c 2006-08-27 22:49:17.000000000 +0200
+@@ -3133,7 +3133,11 @@
+ case osSchedule: AddSubMenu(new cMenuSchedule); break;
+ case osChannels: AddSubMenu(new cMenuChannels); break;
+ case osTimers: AddSubMenu(new cMenuTimers); break;
+- case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, true)); break;
++ case osRecordings: {
++ cPlugin *p = cPluginManager::GetPlugin("extrecmenu");
++ (p && !p->SetupParse("IsOrgRecMenu", "0")) ? AddSubMenu((cOsdMenu *)p->MainMenuAction()) : AddSubMenu(new cMenuRecordings(NULL, 0, true));
++ }
++ break;
+ case osSetup: AddSubMenu(new cMenuSetup); break;
+ case osCommands: AddSubMenu(new cMenuCommands(tr("Commands"), &Commands)); break;
+ default: break;
+@@ -3376,7 +3380,14 @@
+ case osSchedule: return AddSubMenu(new cMenuSchedule);
+ case osChannels: return AddSubMenu(new cMenuChannels);
+ case osTimers: return AddSubMenu(new cMenuTimers);
+- case osRecordings: return AddSubMenu(new cMenuRecordings);
++ case osRecordings: {
++ cPlugin *p = cPluginManager::GetPlugin("extrecmenu");
++ if (p && !p->SetupParse("IsOrgRecMenu", "0"))
++ return AddSubMenu((cOsdMenu *)p->MainMenuAction());
++ else
++ return AddSubMenu(new cMenuRecordings);
++ }
++ break;
+ case osSetup: return AddSubMenu(new cMenuSetup);
+ case osCommands: return AddSubMenu(new cMenuCommands(tr("Commands"), &Commands));
+ case osStopRecord: if (Interface->Confirm(tr("Stop recording?"))) {
Added: vdr/vdr/trunk/debian/patches/opt-43-x_epgsearch.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-43-x_epgsearch.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-43-x_epgsearch.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,43 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-42_epgsearch.dpatch by Christian Wieninger <cwieninger at gmx.de>
+## From the vdr-epgsearch plugin: http://www.cwieninger.de.vu
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch allows the epgsearch plugin to replace the schedule
+## DP: menu with it's own version.
+
+ at DPATCH@
+diff -urNad vdr-1.4.2~/menu.c vdr-1.4.2/menu.c
+--- vdr-1.4.2~/menu.c 2006-08-30 19:06:47.000000000 +0200
++++ vdr-1.4.2/menu.c 2006-08-30 19:06:47.000000000 +0200
+@@ -3130,7 +3130,11 @@
+ // Initial submenus:
+
+ switch (State) {
+- case osSchedule: AddSubMenu(new cMenuSchedule); break;
++ case osSchedule: {
++ cPlugin *p = cPluginManager::GetPlugin("epgsearch");
++ (p && !p->SetupParse("IsOrgSchedule", "0")) ? AddSubMenu((cOsdMenu *)p->MainMenuAction()) : AddSubMenu(new cMenuSchedule);
++ }
++ break;
+ case osChannels: AddSubMenu(new cMenuChannels); break;
+ case osTimers: AddSubMenu(new cMenuTimers); break;
+ case osRecordings: {
+@@ -3377,7 +3381,16 @@
+ HadSubMenu |= HasSubMenu();
+
+ switch (state) {
+- case osSchedule: return AddSubMenu(new cMenuSchedule);
++ case osSchedule: {
++ cPlugin *p = cPluginManager::GetPlugin("epgsearch");
++ if (p && !p->SetupParse("IsOrgSchedule", "0")) {
++ return AddSubMenu((cOsdMenu *)p->MainMenuAction());
++ state = osEnd;
++ }
++ else
++ return AddSubMenu(new cMenuSchedule);
++ }
++ break;
+ case osChannels: return AddSubMenu(new cMenuChannels);
+ case osTimers: return AddSubMenu(new cMenuTimers);
+ case osRecordings: {
Added: vdr/vdr/trunk/debian/patches/opt-44_rotor.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-44_rotor.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-44_rotor.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,115 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-44_rotor.dpatch by Thomas Bergwinkl <Bergwinkl.Thomas at vr-web.de>
+## extracted from the rotor plugin 0.1.1
+## original filename: vdr-1.3.31-Rotor.diff
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - adapted to VDR-1.3.38
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch is needed for the rotor plugin.
+
+ at DPATCH@
+diff -urNad vdr-1.3.37~/device.h vdr-1.3.37/device.h
+--- vdr-1.3.37~/device.h 2005-11-27 23:56:28.000000000 +0100
++++ vdr-1.3.37/device.h 2005-11-27 23:56:28.000000000 +0100
+@@ -22,6 +22,7 @@
+ #include "spu.h"
+ #include "thread.h"
+ #include "tools.h"
++#include <linux/dvb/frontend.h>
+
+ #define MAXDEVICES 16 // the maximum number of devices in the system
+ #define MAXPIDHANDLES 64 // the maximum number of different PIDs per device
+@@ -245,6 +246,7 @@
+ virtual bool HasProgramme(void);
+ ///< Returns true if the device is currently showing any programme to
+ ///< the user, either through replaying or live.
++ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd) {return false;}
+
+ // PID handle facilities
+
+diff -urNad vdr-1.3.37~/dvbdevice.c vdr-1.3.37/dvbdevice.c
+--- vdr-1.3.37~/dvbdevice.c 2005-11-27 23:56:28.000000000 +0100
++++ vdr-1.3.37/dvbdevice.c 2005-11-27 23:57:51.000000000 +0100
+@@ -71,6 +71,7 @@
+ class cDvbTuner : public cThread {
+ private:
+ enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
++ bool SendDiseqc;
+ int fd_frontend;
+ int cardIndex;
+ fe_type_t frontendType;
+@@ -84,6 +85,7 @@
+ cMutex mutex;
+ cCondVar locked;
+ cCondVar newSet;
++ dvb_diseqc_master_cmd diseqc_cmd;
+ bool GetFrontendStatus(fe_status_t &Status, int TimeoutMs = 0);
+ bool SetFrontend(void);
+ virtual void Action(void);
+@@ -89,12 +91,14 @@
+ virtual ~cDvbTuner();
+ bool IsTunedTo(const cChannel *Channel) const;
+ void Set(const cChannel *Channel, bool Tune);
++ bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd);
+ bool Locked(int TimeoutMs = 0);
+ };
+
+ cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_type_t FrontendType, cCiHandler *CiHandler)
+ {
+ fd_frontend = Fd_Frontend;
++ SendDiseqc=false;
+ cardIndex = CardIndex;
+ frontendType = FrontendType;
+ ciHandler = CiHandler;
+@@ -147,6 +151,15 @@
+ return tunerStatus >= tsLocked;
+ }
+
++bool cDvbTuner::SendDiseqcCmd(dvb_diseqc_master_cmd cmd)
++{
++ if (frontendType!=FE_QPSK || SendDiseqc)
++ return false;
++ diseqc_cmd=cmd;
++ SendDiseqc=true;
++ return true;
++}
++
+ bool cDvbTuner::GetFrontendStatus(fe_status_t &Status, int TimeoutMs)
+ {
+ if (TimeoutMs) {
+@@ -291,6 +304,10 @@
+ bool hasEvent = GetFrontendEvent(event, 1);
+
+ cMutexLock MutexLock(&mutex);
++ if (SendDiseqc) {
++ CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &diseqc_cmd));
++ SendDiseqc=false;
++ }
+ switch (tunerStatus) {
+ case tsIdle:
+ break;
+@@ -846,6 +863,11 @@
+ return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false;
+ }
+
++bool cDvbDevice::SendDiseqcCmd(dvb_diseqc_master_cmd cmd)
++{
++ return dvbTuner->SendDiseqcCmd(cmd);
++}
++
+ int cDvbDevice::GetAudioChannelDevice(void)
+ {
+ if (HasDecoder()) {
+diff -urNad vdr-1.3.37~/dvbdevice.h vdr-1.3.37/dvbdevice.h
+--- vdr-1.3.37~/dvbdevice.h 2005-11-11 15:51:38.000000000 +0100
++++ vdr-1.3.37/dvbdevice.h 2005-11-27 23:56:28.000000000 +0100
+@@ -66,6 +66,7 @@
+ virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
+ public:
+ virtual bool HasLock(int TimeoutMs = 0);
++ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd);
+
+ // PID handle facilities
+
Added: vdr/vdr/trunk/debian/patches/opt-45_yaepg.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-45_yaepg.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-45_yaepg.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,5507 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-45_yaepg.dpatch by bball950 at yahoo.com
+## http://www.hoochvdr.info/yaepg/vdr-1.3.19-core-yaepg.diff
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - replaced OSD_OpenRaw with OSD_Command(OSD_MoveWindow+1) to compile with
+## Debian-Package linux-kernel-headers_2.5.999-test7-bk-17 (Sarge)
+## - adapted to VDR-1.3.25
+## - adapted to VDR-1.3.42
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch is needed for the yaepg plugin.
+
+ at DPATCH@
+diff -ruN vdr-1.3.18/device.h vdr-1.3.18.yaepg/device.h
+--- vdr-1.3.18/device.h 2005-01-07 06:57:01.000000000 -0800
++++ vdr-1.3.18.yaepg/device.h 2005-01-10 10:47:15.000000000 -0800
+@@ -206,12 +206,12 @@
+ ///< Direction (only the sign of Direction is evaluated, positive values
+ ///< switch to higher channel numbers).
+ private:
+- eSetChannelResult SetChannel(const cChannel *Channel, bool LiveView);
+- ///< Sets the device to the given channel (general setup).
+ protected:
+ virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
+ ///< Sets the device to the given channel (actual physical setup).
+ public:
++ eSetChannelResult SetChannel(const cChannel *Channel, bool LiveView);
++ ///< Sets the device to the given channel (general setup).
+ static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; }
+ ///< Returns the number of the current channel on the primary device.
+ virtual bool HasLock(int TimeoutMs = 0);//XXX PLUGINS.html
+diff -ruN vdr-1.3.18/dvbosd.c vdr-1.3.18.yaepg/dvbosd.c
+--- vdr-1.3.18/dvbosd.c 2004-11-20 06:29:25.000000000 -0800
++++ vdr-1.3.18.yaepg/dvbosd.c 2005-01-10 10:47:15.000000000 -0800
+@@ -67,6 +67,10 @@
+ Cmd(OSD_Close);
+ }
+ }
++ if (vidWin.bpp != 0) {
++ Cmd(OSD_SetWindow, 0, 5);
++ Cmd(OSD_Close);
++ }
+ }
+
+ eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
+@@ -164,6 +168,11 @@
+ Cmd(OSD_SetWindow, 0, i + 1);
+ Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0());
+ }
++ if (vidWin.bpp != 0) {
++ Cmd(OSD_SetWindow, 0, 5);
++ Cmd(OSD_Command(OSD_MoveWindow+1), vidWin.bpp, vidWin.x1, vidWin.y1,
++ vidWin.x2, vidWin.y2, (void *)0);
++ }
+ shown = true;
+ }
+ }
+diff -ruN vdr-1.3.18/font.c vdr-1.3.18.yaepg/font.c
+--- vdr-1.3.18/font.c 2004-12-18 05:41:19.000000000 -0800
++++ vdr-1.3.18.yaepg/font.c 2005-01-10 10:47:42.000000000 -0800
+@@ -11,6 +11,7 @@
+ #include <ctype.h>
+ #include "font.h"
+ #include "tools.h"
++#include "fontyaepg.c"
+
+ #include "fontfix-iso8859-1.c"
+ #include "fontosd-iso8859-1.c"
+@@ -35,11 +36,11 @@
+ // --- cFont -----------------------------------------------------------------
+
+ static const void *const FontData[eDvbCodeSize][eDvbFontSize] = {
+- { FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 },
+- { FontOsd_iso8859_2, FontFix_iso8859_2, FontSml_iso8859_2 },
+- { FontOsd_iso8859_5, FontFix_iso8859_5, FontSml_iso8859_5 },
+- { FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 },
+- { FontOsd_iso8859_13, FontFix_iso8859_13, FontSml_iso8859_13 },
+- { FontOsd_iso8859_15, FontFix_iso8859_15, FontSml_iso8859_15 },
++ { FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1, FontYaepg },
++ { FontOsd_iso8859_2, FontFix_iso8859_2, FontSml_iso8859_2, FontYaepg },
++ { FontOsd_iso8859_5, FontFix_iso8859_5, FontSml_iso8859_5, FontYaepg },
++ { FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7, FontYaepg },
++ { FontOsd_iso8859_13, FontFix_iso8859_13, FontSml_iso8859_13, FontYaepg },
++ { FontOsd_iso8859_15, FontFix_iso8859_15, FontSml_iso8859_15, FontYaepg },
+ };
+
+ static const char *FontCode[eDvbCodeSize] = {
+diff -ruN vdr-1.3.18/font.h vdr-1.3.18.yaepg/font.h
+--- vdr-1.3.18/font.h 2004-10-23 07:06:37.000000000 -0700
++++ vdr-1.3.18.yaepg/font.h 2005-01-10 10:47:15.000000000 -0800
+@@ -15,8 +15,9 @@
+ enum eDvbFont {
+ fontOsd,
+ fontFix,
+- fontSml
+-#define eDvbFontSize (fontSml + 1)
++ fontSml,
++ fontYaepg
++#define eDvbFontSize (fontYaepg + 1)
+ };
+
+ enum eDvbCode {
+diff -ruN vdr-1.3.18/fontyaepg.c vdr-1.3.18.yaepg/fontyaepg.c
+--- vdr-1.3.18/fontyaepg.c 1969-12-31 16:00:00.000000000 -0800
++++ vdr-1.3.18.yaepg/fontyaepg.c 2005-01-10 10:47:15.000000000 -0800
+@@ -0,0 +1,5378 @@
++cFont::tPixelData FontYaepg[][23] = {
++ { // 32
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 33
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x00000008, // ...*..
++ 0x00000008, // ...*..
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 34
++ 9, 21,
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x000001DC, // .***.***.
++ 0x000001DC, // .***.***.
++ 0x000001DC, // .***.***.
++ 0x000001DC, // .***.***.
++ 0x00000088, // ..*...*..
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ },
++ { // 35
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000CC, // ...**..**.
++ 0x000000CC, // ...**..**.
++ 0x000000C8, // ...**..*..
++ 0x000003FE, // .*********
++ 0x000003FE, // .*********
++ 0x00000198, // ..**..**..
++ 0x00000198, // ..**..**..
++ 0x00000190, // ..**..*...
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x00000330, // .**..**...
++ 0x00000330, // .**..**...
++ 0x00000320, // .**..*....
++ 0x00000360, // .**.**....
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 36
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000040, // ....*.....
++ 0x000001F0, // ..*****...
++ 0x000003FC, // .********.
++ 0x0000075C, // ***.*.***.
++ 0x0000074E, // ***.*..***
++ 0x00000740, // ***.*.....
++ 0x000003C0, // .****.....
++ 0x000001F8, // ..******..
++ 0x0000007C, // ....*****.
++ 0x0000005E, // ....*.****
++ 0x0000074E, // ***.*..***
++ 0x0000074E, // ***.*..***
++ 0x000003FC, // .********.
++ 0x000001F8, // ..******..
++ 0x00000040, // ....*.....
++ 0x00000040, // ....*.....
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 37
++ 16, 21,
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00007020, // ..***......*....
++ 0x0000FC60, // .******...**....
++ 0x0001CE40, // ***..***..*.....
++ 0x0001CE80, // ***..***.*......
++ 0x0001CE80, // ***..***.*......
++ 0x0000FD00, // .******.*.......
++ 0x00007B00, // ..****.**.......
++ 0x00000278, // .......*..****..
++ 0x000006FC, // ......**.******.
++ 0x000005CE, // ......*.***..***
++ 0x00000DCE, // .....**.***..***
++ 0x000008FC, // .....*...******.
++ 0x00001878, // ....**....****..
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ },
++ { // 38
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x000003C0, // ....****.....
++ 0x000007E0, // ...******....
++ 0x00000EE0, // ..***.***....
++ 0x00000EE0, // ..***.***....
++ 0x000007E0, // ...******....
++ 0x00000780, // ...****......
++ 0x00000F9C, // ..*****..***.
++ 0x00001FDC, // .*******.***.
++ 0x00001CFC, // .***..******.
++ 0x000018F8, // .**...*****..
++ 0x00001CF8, // .***..*****..
++ 0x00000FFC, // ..**********.
++ 0x0000079C, // ...****..***.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 39
++ 4, 21,
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x0000000E, // .***
++ 0x0000000E, // .***
++ 0x0000000E, // .***
++ 0x0000000E, // .***
++ 0x00000004, // ..*.
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ 0x00000000, // ....
++ },
++ { // 40
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000000C, // ...**.
++ 0x0000000C, // ...**.
++ 0x00000018, // ..**..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000030, // .**...
++ 0x00000070, // ***...
++ 0x00000070, // ***...
++ 0x00000070, // ***...
++ 0x00000070, // ***...
++ 0x00000070, // ***...
++ 0x00000030, // .**...
++ 0x00000038, // .***..
++ 0x00000018, // ..**..
++ 0x00000018, // ..**..
++ 0x0000000C, // ...**.
++ 0x00000004, // ....*.
++ },
++ { // 41
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000018, // ..**..
++ 0x00000018, // ..**..
++ 0x0000001C, // ..***.
++ 0x0000000C, // ...**.
++ 0x0000000E, // ...***
++ 0x0000000E, // ...***
++ 0x0000000E, // ...***
++ 0x0000000E, // ...***
++ 0x0000000E, // ...***
++ 0x0000000C, // ...**.
++ 0x0000001C, // ..***.
++ 0x00000018, // ..**..
++ 0x00000038, // .***..
++ 0x00000030, // .**...
++ 0x00000060, // **....
++ },
++ { // 42
++ 7, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000010, // ...*...
++ 0x00000052, // .*.*..*
++ 0x000000FC, // ******.
++ 0x00000038, // ..***..
++ 0x00000068, // .**.*..
++ 0x00000028, // ..*.*..
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ },
++ { // 43
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x000003FE, // .*********
++ 0x000003FE, // .*********
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 44
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000004, // ...*.
++ 0x0000000C, // ..**.
++ 0x00000018, // .**..
++ 0x00000000, // .....
++ },
++ { // 45
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000007C, // *****.
++ 0x0000007C, // *****.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 46
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 47
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000002, // ....*
++ 0x00000006, // ...**
++ 0x00000004, // ...*.
++ 0x00000004, // ...*.
++ 0x00000004, // ...*.
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000018, // .**..
++ 0x00000010, // .*...
++ 0x00000010, // .*...
++ 0x00000010, // .*...
++ 0x00000020, // *....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 48
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000003FC, // .********.
++ 0x0000039C, // .***..***.
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000039C, // .***..***.
++ 0x000003FC, // .********.
++ 0x000000F0, // ...****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 49
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000030, // .....**...
++ 0x00000070, // ....***...
++ 0x000003F0, // .******...
++ 0x000003F0, // .******...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 50
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000003F8, // .*******..
++ 0x0000039C, // .***..***.
++ 0x0000031C, // .**...***.
++ 0x0000071C, // ***...***.
++ 0x0000001C, // ......***.
++ 0x00000038, // .....***..
++ 0x00000070, // ....***...
++ 0x000000E0, // ...***....
++ 0x000001C0, // ..***.....
++ 0x00000380, // .***......
++ 0x000003FC, // .********.
++ 0x000003FC, // .********.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 51
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000003F8, // .*******..
++ 0x0000039C, // .***..***.
++ 0x0000031C, // .**...***.
++ 0x0000001C, // ......***.
++ 0x00000078, // ....****..
++ 0x0000007C, // ....*****.
++ 0x0000003E, // .....*****
++ 0x0000000E, // .......***
++ 0x0000030E, // .**....***
++ 0x0000031E, // .**...****
++ 0x000003FC, // .********.
++ 0x000001F8, // ..******..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 52
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000038, // .....***..
++ 0x00000078, // ....****..
++ 0x000000F8, // ...*****..
++ 0x000000F8, // ...*****..
++ 0x000001B8, // ..**.***..
++ 0x000001B8, // ..**.***..
++ 0x00000338, // .**..***..
++ 0x00000638, // **...***..
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x00000038, // .....***..
++ 0x00000038, // .....***..
++ 0x00000038, // .....***..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 53
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001FE, // ..********
++ 0x000001FE, // ..********
++ 0x00000100, // ..*.......
++ 0x00000300, // .**.......
++ 0x00000370, // .**.***...
++ 0x000003FC, // .********.
++ 0x0000039C, // .***..***.
++ 0x0000000E, // .......***
++ 0x0000000E, // .......***
++ 0x0000000E, // .......***
++ 0x0000031E, // .**...****
++ 0x000003FC, // .********.
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 54
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F8, // ...*****..
++ 0x000003FC, // .********.
++ 0x0000039E, // .***..****
++ 0x00000700, // ***.......
++ 0x00000700, // ***.......
++ 0x00000778, // ***.****..
++ 0x000007FC, // *********.
++ 0x0000079E, // ****..****
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000039E, // .***..****
++ 0x000003FC, // .********.
++ 0x000000F0, // ...****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 55
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000003FE, // .*********
++ 0x000003FE, // .*********
++ 0x0000000C, // .......**.
++ 0x0000001C, // ......***.
++ 0x00000018, // ......**..
++ 0x00000030, // .....**...
++ 0x00000030, // .....**...
++ 0x00000070, // ....***...
++ 0x00000060, // ....**....
++ 0x000000E0, // ...***....
++ 0x000000E0, // ...***....
++ 0x000000E0, // ...***....
++ 0x000000C0, // ...**.....
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 56
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000003F8, // .*******..
++ 0x000003FC, // .********.
++ 0x0000079E, // ****..****
++ 0x0000070E, // ***....***
++ 0x0000070E, // ***....***
++ 0x0000071E, // ***...****
++ 0x000003FC, // .********.
++ 0x000001F8, // ..******..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 57
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000003F8, // .*******..
++ 0x00000798, // ****..**..
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x0000079C, // ****..***.
++ 0x000003FC, // .********.
++ 0x000001FC, // ..*******.
++ 0x0000001C, // ......***.
++ 0x00000718, // ***...**..
++ 0x000003F8, // .*******..
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 58
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 59
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x00000004, // ....*.
++ 0x0000000C, // ...**.
++ 0x00000018, // ..**..
++ 0x00000000, // ......
++ },
++ { // 60
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000002, // .........*
++ 0x0000000E, // .......***
++ 0x0000007C, // ....*****.
++ 0x000003E0, // .*****....
++ 0x00000380, // .***......
++ 0x000003C0, // .****.....
++ 0x000001F8, // ..******..
++ 0x0000003E, // .....*****
++ 0x00000006, // ........**
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 61
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000003FE, // .*********
++ 0x000003FE, // .*********
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000003FE, // .*********
++ 0x000003FE, // .*********
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 62
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000200, // .*........
++ 0x00000300, // .**.......
++ 0x000003E0, // .*****....
++ 0x0000007C, // ....*****.
++ 0x0000000E, // .......***
++ 0x0000001E, // ......****
++ 0x000000F8, // ...*****..
++ 0x000003C0, // .****.....
++ 0x00000300, // .**.......
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 63
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000001C, // .......***.
++ 0x0000003C, // ......****.
++ 0x00000078, // .....****..
++ 0x00000070, // .....***...
++ 0x000000E0, // ....***....
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 64
++ 18, 21,
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00001FC0, // ......*******.....
++ 0x00007FF0, // ....***********...
++ 0x0000C038, // ...**........***..
++ 0x0001865C, // ..**....**..*.***.
++ 0x00031FCC, // .**...*******..**.
++ 0x000339CE, // .**..***..***..***
++ 0x0007308E, // ***..**....*...***
++ 0x0007708E, // ***.***....*...***
++ 0x0007718E, // ***.***...**...***
++ 0x0007719C, // ***.***...**..***.
++ 0x00033FFC, // .**..************.
++ 0x00031CF0, // .**...***..****...
++ 0x00018000, // ..**..............
++ 0x0000E040, // ...***......*.....
++ 0x00007FC0, // ....*********.....
++ 0x00001F80, // ......******......
++ 0x00000000, // ..................
++ },
++ { // 65
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x000001C0, // .....***.....
++ 0x000001E0, // .....****....
++ 0x000003E0, // ....*****....
++ 0x00000360, // ....**.**....
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000630, // ...**...**...
++ 0x00000E38, // ..***...***..
++ 0x00000FF8, // ..*********..
++ 0x00000FF8, // ..*********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x0000180C, // .**.......**.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 66
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001FF0, // .*********...
++ 0x00001FF8, // .**********..
++ 0x00001C18, // .***.....**..
++ 0x00001C1C, // .***.....***.
++ 0x00001C18, // .***.....**..
++ 0x00001FF0, // .*********...
++ 0x00001FF8, // .**********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001FF8, // .**********..
++ 0x00001FF0, // .*********...
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 67
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x000003E0, // ....*****....
++ 0x000007F8, // ...********..
++ 0x00000E1C, // ..***....***.
++ 0x00001E1C, // .****....***.
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00001C1C, // .***.....***.
++ 0x00000E1C, // ..***....***.
++ 0x000007F8, // ...********..
++ 0x000003F0, // ....******...
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 68
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001FE0, // .********....
++ 0x00001FF0, // .*********...
++ 0x00001C38, // .***....***..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C18, // .***.....**..
++ 0x00001C38, // .***....***..
++ 0x00001FF0, // .*********...
++ 0x00001FE0, // .********....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 69
++ 12, 21,
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 70
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000007FC, // .*********.
++ 0x000007FC, // .*********.
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x000007F8, // .********..
++ 0x000007F8, // .********..
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 71
++ 14, 21,
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x000007E0, // ....******....
++ 0x00000FF8, // ...*********..
++ 0x00001C38, // ..***....***..
++ 0x00001C1C, // ..***.....***.
++ 0x00003800, // .***..........
++ 0x00003800, // .***..........
++ 0x0000387C, // .***....*****.
++ 0x0000387C, // .***....*****.
++ 0x0000380C, // .***.......**.
++ 0x00001C1C, // ..***.....***.
++ 0x00001E3C, // ..****...****.
++ 0x00000FFC, // ...**********.
++ 0x000007C4, // ....*****...*.
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 72
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001FFC, // .***********.
++ 0x00001FFC, // .***********.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 73
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 74
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x0000001C, // ......***.
++ 0x0000001C, // ......***.
++ 0x0000001C, // ......***.
++ 0x0000001C, // ......***.
++ 0x0000001C, // ......***.
++ 0x0000001C, // ......***.
++ 0x0000001C, // ......***.
++ 0x0000001C, // ......***.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000003F8, // .*******..
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 75
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001C38, // .***....***..
++ 0x00001C70, // .***...***...
++ 0x00001CE0, // .***..***....
++ 0x00001DC0, // .***.***.....
++ 0x00001F80, // .******......
++ 0x00001FC0, // .*******.....
++ 0x00001EE0, // .****.***....
++ 0x00001CE0, // .***..***....
++ 0x00001C70, // .***...***...
++ 0x00001C38, // .***....***..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 76
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x000007FC, // .*********.
++ 0x000007FC, // .*********.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 77
++ 15, 21,
++ 0x00000000, // ...............
++ 0x00000000, // ...............
++ 0x00000000, // ...............
++ 0x00000000, // ...............
++ 0x0000783C, // .****.....****.
++ 0x00007C3C, // .*****....****.
++ 0x00007C7C, // .*****...*****.
++ 0x00007C7C, // .*****...*****.
++ 0x00007C7C, // .*****...*****.
++ 0x0000747C, // .***.*...*****.
++ 0x000076DC, // .***.**.**.***.
++ 0x000076DC, // .***.**.**.***.
++ 0x000076DC, // .***.**.**.***.
++ 0x000076DC, // .***.**.**.***.
++ 0x000073DC, // .***..****.***.
++ 0x0000739C, // .***..***..***.
++ 0x0000739C, // .***..***..***.
++ 0x00000000, // ...............
++ 0x00000000, // ...............
++ 0x00000000, // ...............
++ 0x00000000, // ...............
++ },
++ { // 78
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001E1C, // .****....***.
++ 0x00001E1C, // .****....***.
++ 0x00001F1C, // .*****...***.
++ 0x00001F9C, // .******..***.
++ 0x00001D9C, // .***.**..***.
++ 0x00001DDC, // .***.***.***.
++ 0x00001CDC, // .***..**.***.
++ 0x00001C7C, // .***...*****.
++ 0x00001C7C, // .***...*****.
++ 0x00001C3C, // .***....****.
++ 0x00001C3C, // .***....****.
++ 0x00001C1C, // .***.....***.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 79
++ 14, 21,
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x000003C0, // .....****.....
++ 0x00000FF0, // ...********...
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x00000FF0, // ...********...
++ 0x000003C0, // .....****.....
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 80
++ 12, 21,
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000FF8, // .*********..
++ 0x00000FFC, // .**********.
++ 0x00000E1E, // .***....****
++ 0x00000E0E, // .***.....***
++ 0x00000E0E, // .***.....***
++ 0x00000E1E, // .***....****
++ 0x00000FFC, // .**********.
++ 0x00000FF8, // .*********..
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 81
++ 14, 21,
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x000003E0, // .....*****....
++ 0x00000FF8, // ...*********..
++ 0x00001C3C, // ..***....****.
++ 0x00001C1C, // ..***.....***.
++ 0x0000380E, // .***.......***
++ 0x0000380E, // .***.......***
++ 0x0000380E, // .***.......***
++ 0x0000380E, // .***.......***
++ 0x0000384E, // .***....*..***
++ 0x00001CFC, // ..***..******.
++ 0x00001C7C, // ..***...*****.
++ 0x00000FFC, // ...**********.
++ 0x000003EE, // .....*****.***
++ 0x00000004, // ............*.
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 82
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001FF8, // .**********..
++ 0x00001FFC, // .***********.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C3C, // .***....****.
++ 0x00001FF8, // .**********..
++ 0x00001FF8, // .**********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 83
++ 12, 21,
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x000003F0, // ...******...
++ 0x000007FC, // ..*********.
++ 0x00000E1C, // .***....***.
++ 0x00000E1E, // .***....****
++ 0x00000E00, // .***........
++ 0x00000FE0, // .*******....
++ 0x000007F8, // ..********..
++ 0x0000007C, // ......*****.
++ 0x0000000C, // .........**.
++ 0x00000E0C, // .***.....**.
++ 0x00000E1C, // .***....***.
++ 0x000007F8, // ..********..
++ 0x000003F0, // ...******...
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 84
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000FFC, // **********.
++ 0x00000FFC, // **********.
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 85
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001E3C, // .****...****.
++ 0x00000FF8, // ..*********..
++ 0x000003E0, // ....*****....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 86
++ 12, 21,
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000C0C, // .**......**.
++ 0x00000E1C, // .***....***.
++ 0x00000E1C, // .***....***.
++ 0x0000061C, // ..**....***.
++ 0x00000618, // ..**....**..
++ 0x00000738, // ..***..***..
++ 0x00000330, // ...**..**...
++ 0x00000330, // ...**..**...
++ 0x000003F0, // ...******...
++ 0x000001E0, // ....****....
++ 0x000001E0, // ....****....
++ 0x000001E0, // ....****....
++ 0x000000C0, // .....**.....
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 87
++ 17, 21,
++ 0x00000000, // .................
++ 0x00000000, // .................
++ 0x00000000, // .................
++ 0x00000000, // .................
++ 0x0003870C, // ***....***....**.
++ 0x0001870C, // .**....***....**.
++ 0x0001C71C, // .***...***...***.
++ 0x0001CD9C, // .***..**.**..***.
++ 0x0000CD9C, // ..**..**.**..***.
++ 0x0000CD98, // ..**..**.**..**..
++ 0x0000CD98, // ..**..**.**..**..
++ 0x0000ECB8, // ..***.**..*.***..
++ 0x000078F0, // ...****...****...
++ 0x000078F0, // ...****...****...
++ 0x000078F0, // ...****...****...
++ 0x000038F0, // ....***...****...
++ 0x00003060, // ....**.....**....
++ 0x00000000, // .................
++ 0x00000000, // .................
++ 0x00000000, // .................
++ 0x00000000, // .................
++ },
++ { // 88
++ 12, 21,
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000E1C, // .***....***.
++ 0x00000F1C, // .****...***.
++ 0x00000738, // ..***..***..
++ 0x000003F8, // ...*******..
++ 0x000003F0, // ...******...
++ 0x000001E0, // ....****....
++ 0x000001E0, // ....****....
++ 0x000001E0, // ....****....
++ 0x000003F0, // ...******...
++ 0x00000738, // ..***..***..
++ 0x00000738, // ..***..***..
++ 0x00000E1C, // .***....***.
++ 0x00000E1C, // .***....***.
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 89
++ 12, 21,
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000E1C, // .***....***.
++ 0x00000E1C, // .***....***.
++ 0x0000071C, // ..***...***.
++ 0x00000738, // ..***..***..
++ 0x000003B8, // ...***.***..
++ 0x000001F0, // ....*****...
++ 0x000001F0, // ....*****...
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 90
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000FFC, // **********.
++ 0x00000FFC, // **********.
++ 0x0000003C, // ......****.
++ 0x00000038, // ......***..
++ 0x00000070, // .....***...
++ 0x000000E0, // ....***....
++ 0x000001E0, // ...****....
++ 0x000001C0, // ...***.....
++ 0x00000380, // ..***......
++ 0x00000700, // .***.......
++ 0x00000F00, // ****.......
++ 0x00000FFC, // **********.
++ 0x00000FFC, // **********.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 91
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000003C, // .****.
++ 0x0000003C, // .****.
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x00000030, // .**...
++ 0x0000003C, // .****.
++ 0x0000003C, // .****.
++ },
++ { // 92
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000020, // *....
++ 0x00000020, // *....
++ 0x00000010, // .*...
++ 0x00000010, // .*...
++ 0x00000010, // .*...
++ 0x00000018, // .**..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x0000000C, // ..**.
++ 0x00000004, // ...*.
++ 0x00000004, // ...*.
++ 0x00000006, // ...**
++ 0x00000002, // ....*
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 93
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000007C, // *****.
++ 0x0000007C, // *****.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000007C, // *****.
++ 0x0000007C, // *****.
++ },
++ { // 94
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000070, // ....***...
++ 0x000000F0, // ...****...
++ 0x000000F8, // ...*****..
++ 0x000000D8, // ...**.**..
++ 0x00000198, // ..**..**..
++ 0x0000018C, // ..**...**.
++ 0x0000030C, // .**....**.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 95
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000FFE, // ***********
++ 0x00000FFE, // ***********
++ },
++ { // 96
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000070, // ***...
++ 0x00000030, // .**...
++ 0x00000018, // ..**..
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 97
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000001C, // ......***.
++ 0x000000FC, // ...******.
++ 0x000003FC, // .********.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000003DC, // .****.***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 98
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x000007F0, // .*******...
++ 0x000007FC, // .*********.
++ 0x0000079C, // .****..***.
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000079C, // .****..***.
++ 0x000007FC, // .*********.
++ 0x00000770, // .***.***...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 99
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000003F8, // .*******..
++ 0x0000039C, // .***..***.
++ 0x0000070C, // ***....**.
++ 0x00000700, // ***.......
++ 0x00000700, // ***.......
++ 0x00000700, // ***.......
++ 0x0000078C, // ****...**.
++ 0x000003FC, // .********.
++ 0x000000F0, // ...****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 100
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x0000001C, // .......***.
++ 0x0000001C, // .......***.
++ 0x0000001C, // .......***.
++ 0x000001DC, // ...***.***.
++ 0x000007FC, // .*********.
++ 0x0000073C, // .***..****.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000F3C, // ****..****.
++ 0x000007FC, // .*********.
++ 0x000003DC, // ..****.***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 101
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001E0, // ..****....
++ 0x000003F8, // .*******..
++ 0x00000318, // .**...**..
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x00000700, // ***.......
++ 0x0000071C, // ***...***.
++ 0x000003F8, // .*******..
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 102
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000003C, // .****.
++ 0x00000038, // .***..
++ 0x0000007C, // *****.
++ 0x0000007C, // *****.
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 103
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001DC, // ...***.***.
++ 0x000003FC, // ..********.
++ 0x0000073C, // .***..****.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000F3C, // ****..****.
++ 0x000007FC, // .*********.
++ 0x000003FC, // ..********.
++ 0x0000001C, // .......***.
++ 0x00000F3C, // ****..****.
++ 0x000007F8, // .********..
++ 0x000003F0, // ..******...
++ },
++ { // 104
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000778, // .***.****..
++ 0x000007FC, // .*********.
++ 0x0000079C, // .****..***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 105
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 106
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000003C, // ****.
++ 0x00000038, // ***..
++ },
++ { // 107
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000380, // .***......
++ 0x00000380, // .***......
++ 0x00000380, // .***......
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x000003B8, // .***.***..
++ 0x000003F0, // .******...
++ 0x000003F0, // .******...
++ 0x000003F0, // .******...
++ 0x000003B8, // .***.***..
++ 0x00000398, // .***..**..
++ 0x0000039C, // .***..***.
++ 0x0000038E, // .***...***
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 108
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 109
++ 16, 21,
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x0001DCF0, // ***.***..****...
++ 0x0001FFF8, // **************..
++ 0x0001E71C, // ****..***...***.
++ 0x0001C71C, // ***...***...***.
++ 0x0001C71C, // ***...***...***.
++ 0x0001C71C, // ***...***...***.
++ 0x0001C71C, // ***...***...***.
++ 0x0001C71C, // ***...***...***.
++ 0x0001C71C, // ***...***...***.
++ 0x0001C71C, // ***...***...***.
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ },
++ { // 110
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000770, // .***.***...
++ 0x000007F8, // .********..
++ 0x0000079C, // .****..***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 111
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x00000738, // .***..***..
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x0000071C, // .***...***.
++ 0x000007F8, // .********..
++ 0x000001F0, // ...*****...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 112
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000770, // .***.***...
++ 0x000007FC, // .*********.
++ 0x0000079C, // .****..***.
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000079C, // .****..***.
++ 0x000007FC, // .*********.
++ 0x00000770, // .***.***...
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ },
++ { // 113
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001DC, // ...***.***.
++ 0x000007FC, // .*********.
++ 0x0000073C, // .***..****.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000F3C, // ****..****.
++ 0x000007FC, // .*********.
++ 0x000003DC, // ..****.***.
++ 0x0000001C, // .......***.
++ 0x0000001C, // .......***.
++ 0x0000001C, // .......***.
++ 0x0000001C, // .......***.
++ },
++ { // 114
++ 7, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000076, // .***.**
++ 0x0000007E, // .******
++ 0x0000007A, // .****.*
++ 0x00000070, // .***...
++ 0x00000070, // .***...
++ 0x00000070, // .***...
++ 0x00000070, // .***...
++ 0x00000070, // .***...
++ 0x00000070, // .***...
++ 0x00000070, // .***...
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ },
++ { // 115
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000001F8, // ..******..
++ 0x0000039C, // .***..***.
++ 0x00000380, // .***......
++ 0x000003F0, // .******...
++ 0x000001FC, // ..*******.
++ 0x0000003E, // .....*****
++ 0x0000038E, // .***...***
++ 0x000003FC, // .********.
++ 0x000001F8, // ..******..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 116
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x0000007C, // *****.
++ 0x0000007C, // *****.
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x0000003A, // .***.*
++ 0x0000001C, // ..***.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 117
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x000007FC, // .*********.
++ 0x000003DC, // ..****.***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 118
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x0000070C, // ***....**.
++ 0x0000030C, // .**....**.
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x00000198, // ..**..**..
++ 0x00000198, // ..**..**..
++ 0x000001F8, // ..******..
++ 0x000000F0, // ...****...
++ 0x000000F0, // ...****...
++ 0x000000E0, // ...***....
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 119
++ 14, 21,
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x0000718C, // ***...**...**.
++ 0x000033CE, // .**..****..***
++ 0x000033CC, // .**..****..**.
++ 0x000033DC, // .**..****.***.
++ 0x00003BDC, // .***.****.***.
++ 0x00001AD8, // ..**.*.**.**..
++ 0x00001E78, // ..****..****..
++ 0x00001E78, // ..****..****..
++ 0x00001E70, // ..****..***...
++ 0x00000E70, // ...***..***...
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 120
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x000001F8, // ..******..
++ 0x000000F8, // ...*****..
++ 0x000000F0, // ...****...
++ 0x000000F0, // ...****...
++ 0x000001F0, // ..*****...
++ 0x000001F8, // ..******..
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 121
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x0000070C, // ***....**.
++ 0x0000030C, // .**....**.
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x00000198, // ..**..**..
++ 0x000001D8, // ..***.**..
++ 0x000001F8, // ..******..
++ 0x000000F0, // ...****...
++ 0x000000F0, // ...****...
++ 0x000000E0, // ...***....
++ 0x00000060, // ....**....
++ 0x000000E0, // ...***....
++ 0x000001C0, // ..***.....
++ 0x000001C0, // ..***.....
++ },
++ { // 122
++ 9, 21,
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x000003FC, // ********.
++ 0x000003FC, // ********.
++ 0x0000001C, // .....***.
++ 0x00000038, // ....***..
++ 0x00000070, // ...***...
++ 0x000000E0, // ..***....
++ 0x000001C0, // .***.....
++ 0x000003C0, // ****.....
++ 0x000003FC, // ********.
++ 0x000003FC, // ********.
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ 0x00000000, // .........
++ },
++ { // 123
++ 7, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x0000001C, // ...***.
++ 0x0000003C, // ..****.
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000070, // .***...
++ 0x00000078, // .****..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x0000003C, // ..****.
++ 0x0000001C, // ...***.
++ },
++ { // 124
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ },
++ { // 125
++ 7, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000070, // .***...
++ 0x00000078, // .****..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x0000003C, // ..****.
++ 0x0000001C, // ...***.
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000078, // .****..
++ 0x00000070, // .***...
++ },
++ { // 126
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001C4, // ..***...*.
++ 0x000003EC, // .*****.**.
++ 0x0000037C, // .**.*****.
++ 0x00000118, // ..*...**..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 127
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 128
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 129
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 130
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 131
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 132
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 133
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 134
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 135
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 136
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 137
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 138
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 139
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 140
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 141
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 142
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 143
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 144
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 145
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 146
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 147
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 148
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 149
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 150
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 151
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 152
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 153
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 154
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 155
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 156
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 157
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 158
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 159
++ 0, 21,
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ 0x00000000, //
++ },
++ { // 160
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 161
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000010, // ..*...
++ 0x00000010, // ..*...
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000038, // .***..
++ 0x00000000, // ......
++ },
++ { // 162
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000020, // .....*....
++ 0x00000020, // .....*....
++ 0x000001F8, // ..******..
++ 0x000003FC, // .********.
++ 0x000003AC, // .***.*.**.
++ 0x0000072C, // ***..*.**.
++ 0x00000720, // ***..*....
++ 0x00000720, // ***..*....
++ 0x0000072C, // ***..*.**.
++ 0x000003BC, // .***.****.
++ 0x000001FC, // ..*******.
++ 0x000000F8, // ...*****..
++ 0x00000020, // .....*....
++ 0x00000020, // .....*....
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 163
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003FC, // .********.
++ 0x0000079C, // ****..***.
++ 0x0000070C, // ***....**.
++ 0x00000700, // ***.......
++ 0x00000780, // ****......
++ 0x000003F0, // .******...
++ 0x000003D0, // .****.*...
++ 0x000001C0, // ..***.....
++ 0x000001C0, // ..***.....
++ 0x00000180, // ..**......
++ 0x000002FC, // .*.******.
++ 0x000003FC, // .********.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 164
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000104, // ..*.....*.
++ 0x000003FC, // .********.
++ 0x000003FC, // .********.
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x000001FC, // ..*******.
++ 0x000003FC, // .********.
++ 0x00000208, // .*.....*..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 165
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x0000070E, // ***....***
++ 0x0000030C, // .**....**.
++ 0x0000039C, // .***..***.
++ 0x00000198, // ..**..**..
++ 0x000001F0, // ..*****...
++ 0x000000F0, // ...****...
++ 0x000002FC, // .*.******.
++ 0x000003FC, // .********.
++ 0x000003FC, // .********.
++ 0x000003FC, // .********.
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 166
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ 0x00000008, // ..*..
++ },
++ { // 167
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000001FC, // ..*******.
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x000003E0, // .*****....
++ 0x000001F8, // ..******..
++ 0x0000037C, // .**.*****.
++ 0x0000071E, // ***...****
++ 0x0000078E, // ****...***
++ 0x000003CE, // .****..***
++ 0x000001FC, // ..*******.
++ 0x0000007C, // ....*****.
++ 0x0000039E, // .***..****
++ 0x0000039C, // .***..***.
++ 0x0000019C, // ..**..***.
++ 0x000001F8, // ..******..
++ 0x000000F0, // ...****...
++ },
++ { // 168
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000007E, // ******
++ 0x0000007E, // ******
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 169
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x000003E0, // ....*****....
++ 0x00000FF8, // ..*********..
++ 0x00001DDC, // .***.***.***.
++ 0x000017E4, // .*.******..*.
++ 0x00002632, // *..**...**..*
++ 0x00002E02, // *.***.......*
++ 0x00002E02, // *.***.......*
++ 0x00002E02, // *.***.......*
++ 0x00002632, // *..**...**..*
++ 0x000017E4, // .*.******..*.
++ 0x00001DDC, // .***.***.***.
++ 0x00000FF8, // ..*********..
++ 0x000003E0, // ....*****....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 170
++ 7, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000078, // .****..
++ 0x000000F8, // *****..
++ 0x00000038, // ..***..
++ 0x000000E8, // ***.*..
++ 0x000000F8, // *****..
++ 0x0000006C, // .**.**.
++ 0x00000000, // .......
++ 0x0000007C, // .*****.
++ 0x0000007C, // .*****.
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ },
++ { // 171
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000048, // ....*..*..
++ 0x000000C8, // ...**..*..
++ 0x000001D8, // ..***.**..
++ 0x00000130, // ..*..**...
++ 0x00000130, // ..*..**...
++ 0x00000198, // ..**..**..
++ 0x000000C8, // ...**..*..
++ 0x00000048, // ....*..*..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 172
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000003FE, // .*********
++ 0x000003FE, // .*********
++ 0x00000002, // .........*
++ 0x00000002, // .........*
++ 0x00000002, // .........*
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 173
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000007C, // *****.
++ 0x0000007C, // *****.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 174
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x000003E0, // ....*****....
++ 0x00000FF8, // ..*********..
++ 0x00001FFC, // .***********.
++ 0x000017F4, // .*.*******.*.
++ 0x0000373A, // **.***..***.*
++ 0x0000273A, // *..***..***.*
++ 0x000027E2, // *..******...*
++ 0x000027F2, // *..*******..*
++ 0x00002732, // *..***..**..*
++ 0x00001774, // .*.***.***.*.
++ 0x00001C1C, // .***.....***.
++ 0x00000FF8, // ..*********..
++ 0x000003E0, // ....*****....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 175
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000007C, // *****.
++ 0x0000007C, // *****.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 176
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000000E0, // ....***....
++ 0x000001E0, // ...****....
++ 0x00000110, // ...*...*...
++ 0x00000110, // ...*...*...
++ 0x00000110, // ...*...*...
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 177
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x000003FC, // .********.
++ 0x000003FC, // .********.
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x000003FC, // .********.
++ 0x000003FC, // .********.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 178
++ 6, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000078, // .****..
++ 0x000000FE, // *******
++ 0x000000EE, // ***.***
++ 0x0000000C, // ....**.
++ 0x00000018, // ...**..
++ 0x00000070, // .***...
++ 0x000000FE, // *******
++ 0x0000007E, // .******
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ },
++ { // 179
++ 6, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000078, // .****..
++ 0x0000007C, // .*****.
++ 0x000000DC, // **.***.
++ 0x0000003C, // ..****.
++ 0x0000003E, // ..*****
++ 0x0000000E, // ....***
++ 0x000000FE, // *******
++ 0x00000078, // .****..
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ },
++ { // 180
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000000E, // ...***
++ 0x0000000C, // ...**.
++ 0x00000018, // ..**..
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 181
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x000007FC, // .*********.
++ 0x000007EC, // .******.**.
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ },
++ { // 182
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001FE, // ..********
++ 0x000003FE, // .*********
++ 0x000003FC, // .********.
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x000003FC, // .********.
++ 0x000003FC, // .********.
++ 0x000000FC, // ...******.
++ 0x000000FC, // ...******.
++ 0x000000FC, // ...******.
++ 0x000000FC, // ...******.
++ 0x000000FC, // ...******.
++ 0x000000FC, // ...******.
++ 0x000000FC, // ...******.
++ 0x000000FC, // ...******.
++ 0x00000000, // ..........
++ },
++ { // 183
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 184
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000008, // ...*..
++ 0x0000001C, // ..***.
++ 0x0000000E, // ...***
++ 0x0000003C, // .****.
++ },
++ { // 185
++ 6, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x0000001C, // ..***.
++ 0x0000003C, // .****.
++ 0x0000003C, // .****.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x0000001C, // ..***.
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 186
++ 7, 21,
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000038, // ..***..
++ 0x0000007C, // .*****.
++ 0x000000CC, // **..**.
++ 0x000000CC, // **..**.
++ 0x000000FC, // ******.
++ 0x00000078, // .****..
++ 0x00000000, // .......
++ 0x0000007C, // .*****.
++ 0x0000007C, // .*****.
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ 0x00000000, // .......
++ },
++ { // 187
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000120, // ..*..*....
++ 0x00000130, // ..*..**...
++ 0x000001B8, // ..**.***..
++ 0x000000C8, // ...**..*..
++ 0x000000C8, // ...**..*..
++ 0x000001B8, // ..**.***..
++ 0x00000130, // ..*..**...
++ 0x00000120, // ..*..*....
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 188
++ 16, 21,
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00007060, // ..***.....**....
++ 0x0000F040, // .****.....*.....
++ 0x0000F0C0, // .****....**.....
++ 0x00007080, // ..***....*......
++ 0x00007180, // ..***...**......
++ 0x0000731C, // ..***..**...***.
++ 0x0000733C, // ..***..**..****.
++ 0x0000763C, // ..***.**...****.
++ 0x00000C6C, // .....**...**.**.
++ 0x00000CDC, // .....**..**.***.
++ 0x000018FC, // ....**...******.
++ 0x000018FC, // ....**...******.
++ 0x0000301C, // ...**.......***.
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ },
++ { // 189
++ 16, 21,
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00007020, // ..***......*....
++ 0x0000F040, // .****.....*.....
++ 0x0000F040, // .****.....*.....
++ 0x00007080, // ..***....*......
++ 0x00007180, // ..***...**......
++ 0x00007138, // ..***...*..***..
++ 0x000072FE, // ..***..*.*******
++ 0x000076EE, // ..***.**.***.***
++ 0x0000040E, // ......*......***
++ 0x00000C18, // .....**.....**..
++ 0x00001830, // ....**.....**...
++ 0x0000187E, // ....**....******
++ 0x0000307E, // ...**.....******
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ },
++ { // 190
++ 16, 21,
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x0000F020, // .****......*....
++ 0x0000F860, // .*****....**....
++ 0x0001B860, // **.***....**....
++ 0x000078C0, // ..****...**.....
++ 0x00007CC0, // ..*****..**.....
++ 0x00001D9C, // ....***.**..***.
++ 0x0001FD3C, // *******.*..****.
++ 0x0000F33C, // .****..**..****.
++ 0x0000066C, // ......**..**.**.
++ 0x000006DC, // ......**.**.***.
++ 0x00000CFC, // .....**..******.
++ 0x00000CFC, // .....**..******.
++ 0x0000181C, // ....**......***.
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ },
++ { // 191
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000000E0, // ....***....
++ 0x000000E0, // ....***....
++ 0x000001C0, // ...***.....
++ 0x00000380, // ..***......
++ 0x00000700, // .***.......
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000073C, // .***..****.
++ 0x000003F8, // ..*******..
++ 0x000000F0, // ....****...
++ },
++ { // 192
++ 13, 21,
++ 0x00000300, // ....**.......
++ 0x00000180, // .....**......
++ 0x00000080, // ......*......
++ 0x00000000, // .............
++ 0x000001C0, // .....***.....
++ 0x000001E0, // .....****....
++ 0x000003E0, // ....*****....
++ 0x00000360, // ....**.**....
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000630, // ...**...**...
++ 0x00000E38, // ..***...***..
++ 0x00000FF8, // ..*********..
++ 0x00000FF8, // ..*********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x0000180C, // .**.......**.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 193
++ 13, 21,
++ 0x00000060, // .......**....
++ 0x000000C0, // ......**.....
++ 0x00000080, // ......*......
++ 0x00000000, // .............
++ 0x000001C0, // .....***.....
++ 0x000001E0, // .....****....
++ 0x000003E0, // ....*****....
++ 0x00000360, // ....**.**....
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000630, // ...**...**...
++ 0x00000E38, // ..***...***..
++ 0x00000FF8, // ..*********..
++ 0x00000FF8, // ..*********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x0000180C, // .**.......**.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 194
++ 13, 21,
++ 0x000001C0, // .....***.....
++ 0x00000140, // .....*.*.....
++ 0x00000220, // ....*...*....
++ 0x00000000, // .............
++ 0x000001C0, // .....***.....
++ 0x000001E0, // .....****....
++ 0x000003E0, // ....*****....
++ 0x00000360, // ....**.**....
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000630, // ...**...**...
++ 0x00000E38, // ..***...***..
++ 0x00000FF8, // ..*********..
++ 0x00000FF8, // ..*********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x0000180C, // .**.......**.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 195
++ 13, 21,
++ 0x00000310, // ....**...*...
++ 0x000003F0, // ....******...
++ 0x00000660, // ...**..**....
++ 0x00000000, // .............
++ 0x000001C0, // .....***.....
++ 0x000001E0, // .....****....
++ 0x000003E0, // ....*****....
++ 0x00000360, // ....**.**....
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000630, // ...**...**...
++ 0x00000E38, // ..***...***..
++ 0x00000FF8, // ..*********..
++ 0x00000FF8, // ..*********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x0000180C, // .**.......**.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 196
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000000, // .............
++ 0x000001C0, // .....***.....
++ 0x000001E0, // .....****....
++ 0x000003E0, // ....*****....
++ 0x00000360, // ....**.**....
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000630, // ...**...**...
++ 0x00000E38, // ..***...***..
++ 0x00000FF8, // ..*********..
++ 0x00000FF8, // ..*********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x0000180C, // .**.......**.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 197
++ 13, 21,
++ 0x000001C0, // .....***.....
++ 0x00000140, // .....*.*.....
++ 0x000001C0, // .....***.....
++ 0x00000000, // .............
++ 0x000001C0, // .....***.....
++ 0x000001E0, // .....****....
++ 0x000003E0, // ....*****....
++ 0x00000360, // ....**.**....
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000630, // ...**...**...
++ 0x00000E38, // ..***...***..
++ 0x00000FF8, // ..*********..
++ 0x00000FF8, // ..*********..
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x0000180C, // .**.......**.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 198
++ 18, 21,
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00003FFC, // .....************.
++ 0x00007FFC, // ....*************.
++ 0x00006700, // ....**..***.......
++ 0x0000E700, // ...***..***.......
++ 0x0000E700, // ...***..***.......
++ 0x0000C7FC, // ...**...*********.
++ 0x0001C7FC, // ..***...*********.
++ 0x0001C700, // ..***...***.......
++ 0x0001FF00, // ..*********.......
++ 0x0003FF00, // .**********.......
++ 0x00038700, // .***....***.......
++ 0x000307FE, // .**.....**********
++ 0x000707FE, // ***.....**********
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ 0x00000000, // ..................
++ },
++ { // 199
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x000003E0, // ....*****....
++ 0x000007F8, // ...********..
++ 0x00000E1C, // ..***....***.
++ 0x00001E1C, // .****....***.
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00001C00, // .***.........
++ 0x00000C1C, // ..**.....***.
++ 0x00000E1C, // ..***....***.
++ 0x000007F8, // ...********..
++ 0x000003F0, // ....******...
++ 0x00000080, // ......*......
++ 0x000001C0, // .....***.....
++ 0x000000E0, // ......***....
++ 0x000003C0, // ....****.....
++ },
++ { // 200
++ 12, 21,
++ 0x00000180, // ....**......
++ 0x000000C0, // .....**.....
++ 0x00000040, // ......*.....
++ 0x00000000, // ............
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 201
++ 12, 21,
++ 0x00000060, // ......**....
++ 0x00000060, // ......**....
++ 0x000000C0, // .....**.....
++ 0x00000000, // ............
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 202
++ 12, 21,
++ 0x000000C0, // .....**.....
++ 0x000001A0, // ....**.*....
++ 0x00000130, // ....*..**...
++ 0x00000000, // ............
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 203
++ 12, 21,
++ 0x00000000, // ............
++ 0x000003F0, // ...******...
++ 0x000003F0, // ...******...
++ 0x00000000, // ............
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000F00, // .****.......
++ 0x00000F00, // .****.......
++ 0x00000FFC, // .**********.
++ 0x00000FFC, // .**********.
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 204
++ 5, 21,
++ 0x00000030, // **...
++ 0x00000018, // .**..
++ 0x00000008, // ..*..
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 205
++ 5, 21,
++ 0x00000006, // ...**
++ 0x0000000C, // ..**.
++ 0x00000008, // ..*..
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 206
++ 5, 21,
++ 0x0000001C, // .***.
++ 0x00000014, // .*.*.
++ 0x00000022, // *...*
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 207
++ 5, 21,
++ 0x00000000, // ......
++ 0x000000EE, // ***.***
++ 0x000000EE, // ***.***
++ 0x00000000, // .......
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 208
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00001FE0, // .********....
++ 0x00001FF0, // .*********...
++ 0x00001C38, // .***....***..
++ 0x00001C18, // .***.....**..
++ 0x00001C1C, // .***.....***.
++ 0x00003F9C, // *******..***.
++ 0x00003F9C, // *******..***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C18, // .***.....**..
++ 0x00001C38, // .***....***..
++ 0x00001FF0, // .*********...
++ 0x00001FE0, // .********....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 209
++ 13, 21,
++ 0x00000310, // ....**...*...
++ 0x000003F0, // ....******...
++ 0x00000260, // ....*..**....
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001E1C, // .****....***.
++ 0x00001E1C, // .****....***.
++ 0x00001F1C, // .*****...***.
++ 0x00001F9C, // .******..***.
++ 0x00001D9C, // .***.**..***.
++ 0x00001DDC, // .***.***.***.
++ 0x00001CDC, // .***..**.***.
++ 0x00001C7C, // .***...*****.
++ 0x00001C7C, // .***...*****.
++ 0x00001C3C, // .***....****.
++ 0x00001C3C, // .***....****.
++ 0x00001C1C, // .***.....***.
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 210
++ 14, 21,
++ 0x00000300, // .....**.......
++ 0x00000100, // ......*.......
++ 0x00000080, // .......*......
++ 0x00000000, // ..............
++ 0x000003C0, // .....****.....
++ 0x00000FF0, // ...********...
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x00000FF0, // ...********...
++ 0x000003C0, // .....****.....
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 211
++ 14, 21,
++ 0x000000C0, // .......**.....
++ 0x00000080, // .......*......
++ 0x00000180, // ......**......
++ 0x00000000, // ..............
++ 0x000003C0, // .....****.....
++ 0x00000FF0, // ...********...
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x00000FF0, // ...********...
++ 0x000003C0, // .....****.....
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 212
++ 14, 21,
++ 0x00000180, // ......**......
++ 0x000003C0, // .....****.....
++ 0x00000660, // ....**..**....
++ 0x00000000, // ..............
++ 0x000003C0, // .....****.....
++ 0x00000FF0, // ...********...
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x00000FF0, // ...********...
++ 0x000003C0, // .....****.....
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 213
++ 14, 21,
++ 0x00000220, // .....*...*....
++ 0x000007E0, // ....******....
++ 0x00000460, // ....*...**....
++ 0x00000000, // ..............
++ 0x000003C0, // .....****.....
++ 0x00000FF0, // ...********...
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x00000FF0, // ...********...
++ 0x000003C0, // .....****.....
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 214
++ 14, 21,
++ 0x00000000, // ..............
++ 0x000007E0, // ....******....
++ 0x000007E0, // ....******....
++ 0x00000000, // ..............
++ 0x000003C0, // .....****.....
++ 0x00000FF0, // ...********...
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x0000381C, // .***......***.
++ 0x00001C38, // ..***....***..
++ 0x00001C38, // ..***....***..
++ 0x00000FF0, // ...********...
++ 0x000003C0, // .....****.....
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 215
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000108, // ..*....*..
++ 0x0000039C, // .***..***.
++ 0x000001F8, // ..******..
++ 0x000000F0, // ...****...
++ 0x000000F0, // ...****...
++ 0x000001F8, // ..******..
++ 0x0000019C, // ..**..***.
++ 0x00000088, // ...*...*..
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 216
++ 14, 21,
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x000007CC, // ....*****..**.
++ 0x00001FF8, // ..**********..
++ 0x00003C38, // .****....***..
++ 0x00003838, // .***.....***..
++ 0x0000707C, // ***.....*****.
++ 0x000070DC, // ***....**.***.
++ 0x0000719C, // ***...**..***.
++ 0x0000731C, // ***..**...***.
++ 0x00007A1C, // ****.*....***.
++ 0x00003C38, // .****....***..
++ 0x00003C38, // .****....***..
++ 0x00003FF0, // .**********...
++ 0x000027C0, // .*..*****.....
++ 0x00002000, // .*............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ 0x00000000, // ..............
++ },
++ { // 217
++ 13, 21,
++ 0x00000380, // ....***......
++ 0x00000180, // .....**......
++ 0x00000080, // ......*......
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001E3C, // .****...****.
++ 0x00000FF8, // ..*********..
++ 0x000003E0, // ....*****....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 218
++ 13, 21,
++ 0x00000060, // .......**....
++ 0x000000C0, // ......**.....
++ 0x00000080, // ......*......
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001E3C, // .****...****.
++ 0x00000FF8, // ..*********..
++ 0x000003E0, // ....*****....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 219
++ 13, 21,
++ 0x000001C0, // .....***.....
++ 0x00000140, // .....*.*.....
++ 0x00000220, // ....*...*....
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001E3C, // .****...****.
++ 0x00000FF8, // ..*********..
++ 0x000003E0, // ....*****....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 220
++ 13, 21,
++ 0x00000000, // .............
++ 0x00000770, // ...***.***...
++ 0x00000770, // ...***.***...
++ 0x00000000, // .............
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001C1C, // .***.....***.
++ 0x00001E3C, // .****...****.
++ 0x00000FF8, // ..*********..
++ 0x000003E0, // ....*****....
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ 0x00000000, // .............
++ },
++ { // 221
++ 12, 21,
++ 0x00000060, // ......**....
++ 0x00000040, // ......*.....
++ 0x000000C0, // .....**.....
++ 0x00000000, // ............
++ 0x00000E1C, // .***....***.
++ 0x00000E1C, // .***....***.
++ 0x0000071C, // ..***...***.
++ 0x00000738, // ..***..***..
++ 0x000003B8, // ...***.***..
++ 0x000001F0, // ....*****...
++ 0x000001F0, // ....*****...
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x000000E0, // .....***....
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 222
++ 12, 21,
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000FF8, // .*********..
++ 0x00000FFC, // .**********.
++ 0x00000E1E, // .***....****
++ 0x00000E0E, // .***.....***
++ 0x00000E0E, // .***.....***
++ 0x00000E1E, // .***....****
++ 0x00000FFC, // .**********.
++ 0x00000FF8, // .*********..
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000E00, // .***........
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ 0x00000000, // ............
++ },
++ { // 223
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x00000778, // .***.****..
++ 0x0000077C, // .***.*****.
++ 0x0000071E, // .***...****
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000071E, // .***...****
++ 0x0000077C, // .***.*****.
++ 0x00000778, // .***.****..
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 224
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001C0, // ..***.....
++ 0x000000C0, // ...**.....
++ 0x00000060, // ....**....
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000001C, // ......***.
++ 0x000000FC, // ...******.
++ 0x000003FC, // .********.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000003DC, // .****.***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 225
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000030, // .....**...
++ 0x00000020, // .....*....
++ 0x00000060, // ....**....
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000001C, // ......***.
++ 0x000000FC, // ...******.
++ 0x000003FC, // .********.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000003DC, // .****.***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 226
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000060, // ....**....
++ 0x000000F0, // ...****...
++ 0x00000190, // ..**..*...
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000001C, // ......***.
++ 0x000000FC, // ...******.
++ 0x000003FC, // .********.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000003DC, // .****.***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 227
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001F8, // ..******..
++ 0x000001B0, // ..**.**...
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000001C, // ......***.
++ 0x000000FC, // ...******.
++ 0x000003FC, // .********.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000003DC, // .****.***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 228
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001F8, // ..******..
++ 0x000001F8, // ..******..
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000001C, // ......***.
++ 0x000000FC, // ...******.
++ 0x000003FC, // .********.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000003DC, // .****.***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 229
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000060, // ....**....
++ 0x00000090, // ...*..*...
++ 0x000000E0, // ...***....
++ 0x00000000, // ..........
++ 0x000001F0, // ..*****...
++ 0x000003F8, // .*******..
++ 0x0000079C, // ****..***.
++ 0x0000001C, // ......***.
++ 0x000000FC, // ...******.
++ 0x000003FC, // .********.
++ 0x0000071C, // ***...***.
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000003DC, // .****.***.
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 230
++ 16, 21,
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00007CF0, // ..*****..****...
++ 0x0000FFF8, // .*************..
++ 0x0001E71C, // ****..***...***.
++ 0x0000070C, // ......***....**.
++ 0x00007FFC, // ..*************.
++ 0x0000FFFC, // .**************.
++ 0x0001C700, // ***...***.......
++ 0x0001C70C, // ***...***....**.
++ 0x0001FBFC, // ******.********.
++ 0x0000F1F0, // .****...*****...
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ 0x00000000, // ................
++ },
++ { // 231
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000000F0, // ...****...
++ 0x000003F8, // .*******..
++ 0x0000039C, // .***..***.
++ 0x0000071C, // ***...***.
++ 0x00000700, // ***.......
++ 0x00000700, // ***.......
++ 0x00000700, // ***.......
++ 0x0000078C, // ****...**.
++ 0x000003FC, // .********.
++ 0x000000F0, // ...****...
++ 0x00000040, // ....*.....
++ 0x00000070, // ....***...
++ 0x00000038, // .....***..
++ 0x000001F0, // ..*****...
++ },
++ { // 232
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001C0, // ..***.....
++ 0x000000C0, // ...**.....
++ 0x00000060, // ....**....
++ 0x00000000, // ..........
++ 0x000001E0, // ..****....
++ 0x000003F8, // .*******..
++ 0x00000318, // .**...**..
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x00000700, // ***.......
++ 0x0000071C, // ***...***.
++ 0x000003F8, // .*******..
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 233
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000030, // .....**...
++ 0x00000030, // .....**...
++ 0x00000060, // ....**....
++ 0x00000000, // ..........
++ 0x000001E0, // ..****....
++ 0x000003F8, // .*******..
++ 0x00000318, // .**...**..
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x00000700, // ***.......
++ 0x0000071C, // ***...***.
++ 0x000003F8, // .*******..
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 234
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000060, // ....**....
++ 0x000000F0, // ...****...
++ 0x00000090, // ...*..*...
++ 0x00000000, // ..........
++ 0x000001E0, // ..****....
++ 0x000003F8, // .*******..
++ 0x00000318, // .**...**..
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x00000700, // ***.......
++ 0x0000071C, // ***...***.
++ 0x000003F8, // .*******..
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 235
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001F8, // ..******..
++ 0x000001F8, // ..******..
++ 0x00000000, // ..........
++ 0x000001E0, // ..****....
++ 0x000003F8, // .*******..
++ 0x00000318, // .**...**..
++ 0x0000071C, // ***...***.
++ 0x000007FC, // *********.
++ 0x000007FC, // *********.
++ 0x00000700, // ***.......
++ 0x0000071C, // ***...***.
++ 0x000003F8, // .*******..
++ 0x000001F0, // ..*****...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 236
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000030, // **...
++ 0x00000018, // .**..
++ 0x00000008, // ..*..
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 237
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000006, // ...**
++ 0x0000000C, // ..**.
++ 0x00000008, // ..*..
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 238
++ 5, 21,
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x0000000C, // ..**.
++ 0x00000014, // .*.*.
++ 0x00000036, // **.**
++ 0x00000000, // .....
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x0000001C, // .***.
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ 0x00000000, // .....
++ },
++ { // 239
++ 5, 21,
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x000000EE, // ***.***
++ 0x000000EE, // ***.***
++ 0x00000000, // .......
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000038, // ..***..
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ 0x00000000, // ......
++ },
++ { // 240
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000003E0, // ..*****....
++ 0x000000E0, // ....***....
++ 0x00000130, // ...*..**...
++ 0x000003F8, // ..*******..
++ 0x000007F8, // .********..
++ 0x0000073C, // .***..****.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x0000071C, // .***...***.
++ 0x000007F8, // .********..
++ 0x000001F0, // ...*****...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 241
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x00000330, // ..**..**...
++ 0x00000000, // ...........
++ 0x00000770, // .***.***...
++ 0x000007F8, // .********..
++ 0x0000079C, // .****..***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 242
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000180, // ...**......
++ 0x000000C0, // ....**.....
++ 0x00000040, // .....*.....
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x00000738, // .***..***..
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x0000071C, // .***...***.
++ 0x000007F8, // .********..
++ 0x000001F0, // ...*****...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 243
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000030, // ......**...
++ 0x00000060, // .....**....
++ 0x00000040, // .....*.....
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x00000738, // .***..***..
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x0000071C, // .***...***.
++ 0x000007F8, // .********..
++ 0x000001F0, // ...*****...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 244
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000000E0, // ....***....
++ 0x000000A0, // ....*.*....
++ 0x00000130, // ...*..**...
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x00000738, // .***..***..
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x0000071C, // .***...***.
++ 0x000007F8, // .********..
++ 0x000001F0, // ...*****...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 245
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001F8, // ...******..
++ 0x00000330, // ..**..**...
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x00000738, // .***..***..
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x0000071C, // .***...***.
++ 0x000007F8, // .********..
++ 0x000001F0, // ...*****...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 246
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000003B8, // ..***.***..
++ 0x000003B8, // ..***.***..
++ 0x00000000, // ...........
++ 0x000001F0, // ...*****...
++ 0x000003F8, // ..*******..
++ 0x00000738, // .***..***..
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x00000E1C, // ***....***.
++ 0x0000071C, // .***...***.
++ 0x000007F8, // .********..
++ 0x000001F0, // ...*****...
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 247
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000000, // ..........
++ 0x000003FE, // .*********
++ 0x000003FE, // .*********
++ 0x00000000, // ..........
++ 0x00000070, // ....***...
++ 0x00000070, // ....***...
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ },
++ { // 248
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000001F2, // ...*****..*
++ 0x000003FC, // ..********.
++ 0x0000071C, // .***...***.
++ 0x00000E1E, // ***....****
++ 0x00000E2E, // ***...*.***
++ 0x00000E4E, // ***..*..***
++ 0x00000E8E, // ***.*...***
++ 0x0000071C, // .***...***.
++ 0x000007FC, // .*********.
++ 0x00000DF0, // **.*****...
++ 0x00000800, // *..........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 249
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000180, // ...**......
++ 0x000000C0, // ....**.....
++ 0x00000040, // .....*.....
++ 0x00000000, // ...........
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x000007FC, // .*********.
++ 0x000003DC, // ..****.***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 250
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000030, // ......**...
++ 0x00000060, // .....**....
++ 0x00000040, // .....*.....
++ 0x00000000, // ...........
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x000007FC, // .*********.
++ 0x000003DC, // ..****.***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 251
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000000C0, // ....**.....
++ 0x000000A0, // ....*.*....
++ 0x00000130, // ...*..**...
++ 0x00000000, // ...........
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x000007FC, // .*********.
++ 0x000003DC, // ..****.***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 252
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x000003B8, // ..***.***..
++ 0x000003B8, // ..***.***..
++ 0x00000000, // ...........
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x0000071C, // .***...***.
++ 0x000007FC, // .*********.
++ 0x000003DC, // ..****.***.
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ },
++ { // 253
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000030, // .....**...
++ 0x00000020, // .....*....
++ 0x00000060, // ....**....
++ 0x00000000, // ..........
++ 0x0000070C, // ***....**.
++ 0x0000030C, // .**....**.
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x00000198, // ..**..**..
++ 0x000001D8, // ..***.**..
++ 0x000001F8, // ..******..
++ 0x000000F0, // ...****...
++ 0x000000F0, // ...****...
++ 0x000000E0, // ...***....
++ 0x00000060, // ....**....
++ 0x000000E0, // ...***....
++ 0x000001C0, // ..***.....
++ 0x000001C0, // ..***.....
++ },
++ { // 254
++ 11, 21,
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000000, // ...........
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000770, // .***.***...
++ 0x000007F8, // .********..
++ 0x0000079C, // .****..***.
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000070E, // .***....***
++ 0x0000079C, // .****..***.
++ 0x000007FC, // .*********.
++ 0x00000770, // .***.***...
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ 0x00000700, // .***.......
++ },
++ { // 255
++ 10, 21,
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x00000000, // ..........
++ 0x000001F8, // ..******..
++ 0x000001F8, // ..******..
++ 0x00000000, // ..........
++ 0x0000070C, // ***....**.
++ 0x0000030C, // .**....**.
++ 0x0000039C, // .***..***.
++ 0x0000039C, // .***..***.
++ 0x00000198, // ..**..**..
++ 0x000001D8, // ..***.**..
++ 0x000001F8, // ..******..
++ 0x000000F0, // ...****...
++ 0x000000F0, // ...****...
++ 0x000000E0, // ...***....
++ 0x00000060, // ....**....
++ 0x000000E0, // ...***....
++ 0x000001C0, // ..***.....
++ 0x000001C0, // ..***.....
++ },
++ };
+diff -ruN vdr-1.3.18/osd.c vdr-1.3.18.yaepg/osd.c
+--- vdr-1.3.18/osd.c 2004-12-19 04:27:38.000000000 -0800
++++ vdr-1.3.18.yaepg/osd.c 2005-01-10 10:47:15.000000000 -0800
+@@ -586,6 +586,7 @@
+ top = Top;
+ width = height = 0;
+ isOpen++;
++ vidWin.bpp = 0;
+ }
+
+ cOsd::~cOsd()
+diff -ruN vdr-1.3.18/osd.h vdr-1.3.18.yaepg/osd.h
+--- vdr-1.3.18/osd.h 2004-10-16 03:33:44.000000000 -0700
++++ vdr-1.3.18.yaepg/osd.h 2005-01-10 10:47:15.000000000 -0800
+@@ -314,6 +314,7 @@
+ ///< 7: vertical, falling, upper
+ virtual void Flush(void);
+ ///< Actually commits all data to the OSD hardware.
++ tArea vidWin;
+ };
+
+ class cOsdProvider {
Added: vdr/vdr/trunk/debian/patches/opt-46-x_dmh-dvd-archive-debian.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-46-x_dmh-dvd-archive-debian.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-46-x_dmh-dvd-archive-debian.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,78 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-46_dmh-dvd-archive-debian.dpatch by Tobias Grimm <tg at e-tobi.net>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Modifies some defaults from opt-46_dmh-dvd-archive-debian:
+## DP: - DvdDisplayMode = 0 (no display of archive number in recordings list)
+## DP: - DVD-Device = /dev/dvd, mount path = /media/dvd
+## DP: - mount using fstab (to allow user "vdr" to mount the dvd)
+
+ at DPATCH@
+diff -urNad vdr-1.4.3~/config.c vdr-1.4.3/config.c
+--- vdr-1.4.3~/config.c 2006-09-29 21:36:27.000000000 +0200
++++ vdr-1.4.3/config.c 2006-09-29 21:36:27.000000000 +0200
+@@ -326,7 +326,7 @@
+ ShowRecLength = 0;
+ ShowProgressBar = 0;
+ MenuCmdPosition = 0;
+- DvdDisplayMode = 1;
++ DvdDisplayMode = 0;
+ DvdDisplayZeros = 1;
+ DvdTrayMode = 0;
+ DvdSpeedLimit = 0;
+diff -urNad vdr-1.4.3~/recording.c vdr-1.4.3/recording.c
+--- vdr-1.4.3~/recording.c 2006-09-29 21:36:27.000000000 +0200
++++ vdr-1.4.3/recording.c 2006-09-29 21:39:17.000000000 +0200
+@@ -954,7 +954,7 @@
+ {
+ char cmd[BUFSIZ];
+ if(Setup.DvdSpeedLimit > 0) {
+- sprintf(cmd, "speedcontrol -x %d %s", Setup.DvdSpeedLimit, DVD_DEVICE);
++ sprintf(cmd, "eject -x %d %s", Setup.DvdSpeedLimit, DVD_DEVICE);
+ SystemExec(cmd);
+ }
+
+@@ -981,10 +981,7 @@
+ if(Interface->Confirm(msg, 300)) {
+ Skins.Message(mtStatus, tr("Please wait. Checking DVD..."));
+ Skins.Flush();
+- sprintf(cmd, "eject -t %s; mkdir -p %s; mount -o ro -t %s %s %s",
+- DVD_DEVICE, DVD_MOUNT_PATH,
+- (dvdtrack ? "udf" : "iso9660"),
+- DVD_DEVICE, DVD_MOUNT_PATH);
++ sprintf(cmd, "eject -t %s; mount %s", DVD_DEVICE, DVD_MOUNT_PATH);
+ SystemExec(cmd);
+
+ bool correctDvd = true;
+@@ -1056,7 +1053,7 @@
+ sprintf(msg, tr("No index-file found. Creating may take minutes. Create one?"));
+ if(Interface->Confirm(msg, 300)) {
+ Skins.Message(mtStatus, tr("Please wait. Creating index-file..."));
+- sprintf(cmd, "speedcontrol -x 999 %s; cd %s && genindex &", DVD_DEVICE, FileName());
++ sprintf(cmd, "eject -x 999 %s; cd %s && genindex &", DVD_DEVICE, FileName());
+ SystemExec(cmd);
+ return MOUNT_DVD_ABORT;
+ }
+@@ -1980,7 +1977,7 @@
+ SystemExec(cmd);
+
+ if(Setup.DvdSpeedLimit > 0) {
+- sprintf(cmd, "speedcontrol -x 999 %s", DVD_DEVICE);
++ sprintf(cmd, "eject -x 999 %s", DVD_DEVICE);
+ SystemExec(cmd);
+ }
+ }
+diff -urNad vdr-1.4.3~/recording.h vdr-1.4.3/recording.h
+--- vdr-1.4.3~/recording.h 2006-09-29 21:36:27.000000000 +0200
++++ vdr-1.4.3/recording.h 2006-09-29 21:36:27.000000000 +0200
+@@ -64,8 +64,8 @@
+ #define MOUNT_DVD_ABORT 0
+ #define MOUNT_DVD_REPLAY 1
+ #define MOUNT_DVD_LAUNCH_DVD_PLUGIN 2
+-#define DVD_DEVICE "/dev/cdrom"
+-#define DVD_MOUNT_PATH "/tmp/vdr.dvd"
++#define DVD_DEVICE "/dev/dvd"
++#define DVD_MOUNT_PATH "/media/dvd"
+
+ #define DVD_TYPE_UNKNOWN -1
+ #define DVD_TYPE_NOT_READ 0
Added: vdr/vdr/trunk/debian/patches/opt-46_dmh-dvd-archive.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-46_dmh-dvd-archive.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-46_dmh-dvd-archive.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,1448 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt_46_dmh-dvd-archive.dpatch by Marius "DMH" Heidenstecker <marius at heidenstecker.de>
+## vdr-1.3.44-bp-dmh-dvd-archive-version5.diff downloaded from:
+## http://www.vdr-portal.de/board/thread.php?threadid=46861
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Extends Andreas Kool's dvdarchive patch, to allow normal Video-DVD's
+## DP: (playable on standalone video players) to be handled like archive DVD.
+
+ at DPATCH@
+diff -urNad vdr-1.4.3~/HISTORY-dmh-dvd-archive vdr-1.4.3/HISTORY-dmh-dvd-archive
+--- vdr-1.4.3~/HISTORY-dmh-dvd-archive 1970-01-01 01:00:00.000000000 +0100
++++ vdr-1.4.3/HISTORY-dmh-dvd-archive 2006-09-24 13:12:04.000000000 +0200
+@@ -0,0 +1,35 @@
++DMH DVD-Archive Patch History
++-----------------------------
++
++
++2006-04-24: Version 5 (vdr: 1.3.44, BigPatch: test1)
++
++- fixed problem of nonterminating find (Reported by vdrchuck at vdr-portal)
++
++
++2006-03-07: Version 4 (vdr: 1.3.44, BigPatch: test1)
++
++- if libdvdread is installed one can jump through dvd chapters bei pressing
++ "4" or "6" while watching a recording. The handling is then the same as in
++ dvd-plugin. It works only for Video-Archive-DVDs. In order to use it one has
++ to compile vdr with "DVDCHAPJUMP=1". The header-files should be installed in
++ /usr/include/libdvdread.
++
++
++2006-03-02: Version 3 (vdr: 1.3.44, BigPatch: test1)
++
++- changed the setup options
++
++- added possibility to remove leading zeros of dvd number (Suggested by
++ clausmuus at vdr-portal)
++
++- fixed problem that playing of archived recording does not start if "Show
++ DVD-No." is set to "no" in setup (Reported by Wolfi at vdr-portal)
++
++- added reloading of recordings when "DVD display mode" is turned to "Length /
++ Number" or "Number" in setup (Suggested by pat at vdr-portal)
++
++- added this history ;o)
++
++
++2005-??-??: Initial Version
+diff -urNad vdr-1.4.3~/Makefile vdr-1.4.3/Makefile
+--- vdr-1.4.3~/Makefile 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/Makefile 2006-09-24 13:36:08.000000000 +0200
+@@ -18,6 +18,9 @@
+ MANDIR = /usr/local/man
+ BINDIR = /usr/local/bin
+ LIBS = -ljpeg -lpthread -ldl -lcap
++ifdef DVDCHAPJUMP
++ LIBS += -ldvdread
++endif
+ INCLUDES =
+
+ PLUGINDIR= ./PLUGINS
+@@ -31,6 +34,10 @@
+
+ -include Make.config
+
++ifdef DVDCHAPJUMP
++ INCLUDES += -I/usr/include/libdvdread
++endif
++
+ SILIB = $(LSIDIR)/libsi.a
+
+ OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbosd.o\
+@@ -71,6 +78,9 @@
+ ifdef VDR_USER
+ DEFINES += -DVDR_USER=\"$(VDR_USER)\"
+ endif
++ifdef DVDCHAPJUMP
++ DEFINES += -DDVDCHAPJUMP
++endif
+
+ LIRC_DEVICE ?= /dev/lircd
+ RCU_DEVICE ?= /dev/ttyS1
+diff -urNad vdr-1.4.3~/config.c vdr-1.4.3/config.c
+--- vdr-1.4.3~/config.c 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/config.c 2006-09-24 13:15:42.000000000 +0200
+@@ -305,10 +305,6 @@
+ SplitEditedFiles = 0;
+ MinEventTimeout = 30;
+ MinUserInactivity = 300;
+-#ifdef DVDARCHIVE
+- TrayOpenOnBegin = 0;
+- TrayOpenOnEnd = 0;
+-#endif /* DVDARCHIVE */
+ MultiSpeedMode = 0;
+ ShowReplayMode = 0;
+ DoubleEpgTimeDelta = 15;
+@@ -330,6 +326,10 @@
+ ShowRecLength = 0;
+ ShowProgressBar = 0;
+ MenuCmdPosition = 0;
++ DvdDisplayMode = 1;
++ DvdDisplayZeros = 1;
++ DvdTrayMode = 0;
++ DvdSpeedLimit = 0;
+ }
+
+ cSetup& cSetup::operator= (const cSetup &s)
+@@ -486,10 +486,6 @@
+ else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value);
+ else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value);
+ else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value);
+-#ifdef DVDARCHIVE
+- else if (!strcasecmp(Name, "TrayOpenOnBegin")) TrayOpenOnBegin = atoi(Value);
+- else if (!strcasecmp(Name, "TrayOpenOnEnd")) TrayOpenOnEnd = atoi(Value);
+-#endif /* DVDARCHIVE */
+ else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
+ else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
+ else if (!strcasecmp(Name, "DoubleEpgTimeDelta")) DoubleEpgTimeDelta = atoi(Value);
+@@ -511,6 +507,10 @@
+ else if (!strcasecmp(Name, "ShowRecLength")) ShowRecLength = atoi(Value);
+ else if (!strcasecmp(Name, "ShowProgressBar")) ShowProgressBar = atoi(Value);
+ else if (!strcasecmp(Name, "MenuCmdPosition")) MenuCmdPosition = atoi(Value);
++ else if (!strcasecmp(Name, "DvdDisplayMode")) DvdDisplayMode = atoi(Value);
++ else if (!strcasecmp(Name, "DvdDisplayZeros")) DvdDisplayZeros = atoi(Value);
++ else if (!strcasecmp(Name, "DvdTrayMode")) DvdTrayMode = atoi(Value);
++ else if (!strcasecmp(Name, "DvdSpeedLimit")) DvdSpeedLimit = atoi(Value);
+ else
+ return false;
+ return true;
+@@ -580,10 +580,6 @@
+ Store("DoubleEpgTimeDelta", DoubleEpgTimeDelta);
+ Store("MultiSpeedMode", MultiSpeedMode);
+ Store("ShowReplayMode", ShowReplayMode);
+-#ifdef DVDARCHIVE
+- Store("TrayOpenOnBegin", TrayOpenOnBegin);
+- Store("TrayOpenOnEnd", TrayOpenOnEnd);
+-#endif /* DVDARCHIVE */
+ Store("ResumeID", ResumeID);
+ Store("JumpPlay", JumpPlay);
+ Store("PlayJump", PlayJump);
+@@ -599,11 +595,16 @@
+ Store("ShowRecLength", ShowRecLength);
+ Store("ShowProgressBar", ShowProgressBar);
+ Store("MenuCmdPosition", MenuCmdPosition);
++ Store("DvdDisplayMode", DvdDisplayMode);
++ Store("DvdDisplayZeros", DvdDisplayZeros);
++ Store("DvdTrayMode", DvdTrayMode);
++ Store("DvdSpeedLimit", DvdSpeedLimit);
+
+ Sort();
+
+ if (cConfig<cSetupLine>::Save()) {
+ isyslog("saved setup to %s", FileName());
++ if(DvdDisplayMode >= 1) ::Recordings.Load(); // DVDARCHIVE Patch
+ return true;
+ }
+ return false;
+diff -urNad vdr-1.4.3~/config.h vdr-1.4.3/config.h
+--- vdr-1.4.3~/config.h 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/config.h 2006-09-24 13:16:19.000000000 +0200
+@@ -267,8 +267,6 @@
+ int MaxVideoFileSize;
+ int SplitEditedFiles;
+ int MinEventTimeout, MinUserInactivity;
+- int TrayOpenOnBegin;
+- int TrayOpenOnEnd;
+ int MultiSpeedMode;
+ int ShowReplayMode;
+ int DoubleEpgTimeDelta;
+@@ -283,6 +281,10 @@
+ int CurrentChannel;
+ int CurrentVolume;
+ int CurrentDolby;
++ int DvdDisplayMode;
++ int DvdDisplayZeros;
++ int DvdTrayMode;
++ int DvdSpeedLimit;
+ int InitialChannel;
+ int InitialVolume;
+ int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition;
+diff -urNad vdr-1.4.3~/i18n.c vdr-1.4.3/i18n.c
+--- vdr-1.4.3~/i18n.c 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/i18n.c 2006-09-24 13:19:08.000000000 +0200
+@@ -2577,8 +2577,187 @@
+ "Otevírá se menu CAM...",
+ },
+ #ifdef DVDARCHIVE
+- { "Please mount DVD %s",
+- "Bitte DVD %s einlegen",
++ { "Please mount %s", // English
++ "Bitte %s einlegen", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Mettez %s dans le lecteur", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Please mount DVD %04d", // English
++ "Bitte DVD %04d einlegen", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Mettez le DVD %04d dans le lecteur", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Please mount DVD %d", // English
++ "Bitte DVD %d einlegen", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Mettez le DVD %d dans le lecteur", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Please wait. Checking DVD...", // English
++ "Bitte warten. Überprüfe DVD...", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Un moment SVP. Vérification DVD...", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Wrong DVD!", // English
++ "Falsche DVD!", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Faux DVD!", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "DVD plugin is not installed!", // English
++ "Das DVD-Plugin ist nicht installiert!", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Le DVD-plugin n'est pas installé!", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Please wait. Creating index-file...", // English
++ "Bitte warten. Index-Datei wird erstellt...", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Attendez, merci. Le fichier index est en création...", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "No index-file found. Creating may take minutes. Create one?", // English
++ "Keine Index-Datei gefunden. Erstellung kann Minuten dauern. Erstellen?", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Pas trouvé de fichiers index. Création du ficher prend quelques minutes. Créer?", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Setup.BigPatch$DVD display mode",
++ "DVD Anzeige",
++ "",//TODO
++ "",//TODO
++ "",//TODO
+ "",//TODO
+ "",//TODO
+ "",//TODO
+@@ -2596,8 +2775,8 @@
+ "",//TODO
+ "",//TODO
+ },
+- { "Wrong DVD!",
+- "Falsche DVD!",
++ { "Setup.BigPatch$Length",
++ "Länge",
+ "",//TODO
+ "",//TODO
+ "",//TODO
+@@ -2615,8 +2794,8 @@
+ "",//TODO
+ "",//TODO
+ },
+- { "Setup.Replay$Tray open on begin",
+- "DVD-Schublade zu Beginn öffnen",
++ { "Setup.BigPatch$Length / Number",
++ "Länge / Nummer",
+ "",//TODO
+ "",//TODO
+ "",//TODO
+@@ -2634,8 +2813,27 @@
+ "",//TODO
+ "",//TODO
+ },
+- { "Setup.Replay$Tray open on end",
+- "DVD-Schublade am Ende öffnen",
++ { "Setup.BigPatch$Number",
++ "Nummer",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.BigPatch$DVD display leading zeros",
++ "DVD führende Nullen anzeigen",
+ "",//TODO
+ "",//TODO
+ "",//TODO
+@@ -6771,6 +6969,138 @@
+ "",//TODO
+ "",//TODO
+ },
++ { "Setup.BigPatch$Tray open", // English
++ "DVD-Schublade öffnen", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Ouvrir le tiroir du lecteur DVD", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Setup.BigPatch$never", // English
++ "nie", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Setup.BigPatch$on begin", // English
++ "am Anfang", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Setup.BigPatch$on end", // English
++ "am Ende", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Setup.BigPatch$on begin and end", // English
++ "am Anfang und Ende", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
++ { "Setup.BigPatch$Limit DVD to speed", // English
++ "DVD drosseln auf", // Deutsch / German
++ "", // Slovenski / Slovenian
++ "", // Italiano / Italian
++ "", // Nederlands / Dutch
++ "", // Português / Portuguese
++ "Ralentir la vitesse du DVD sur", // Français / French
++ "", // Norsk / Norwegian
++ "", // suomi / Finnish
++ "", // Polski / Polish
++ "", // Español / Spanish
++ "", // ÅëëçíéêÜ / Greek
++ "", // Svenska / Swedish
++ "", // Românã / Romanian
++ "", // Magyar / Hungarian
++ "", // Català / Catalanian
++ "", // ÀãááÚØÙ / Russian
++ "", // Hrvatski / Croatian
++ "", // Eesti / Estonian
++ "", // Dansk / Danish
++ "", // Èesky / Czech
++ },
+ { NULL }
+ };
+
+diff -urNad vdr-1.4.3~/keys.h vdr-1.4.3/keys.h
+--- vdr-1.4.3~/keys.h 2006-04-15 15:56:03.000000000 +0200
++++ vdr-1.4.3/keys.h 2006-09-24 13:12:04.000000000 +0200
+@@ -70,6 +70,10 @@
+ #define kEditCut k2
+ #define kEditTest k8
+
++// DVDARCHIVE Patch
++#define kDvdChapterJumpForward k6
++#define kDvdChapterJumpBack k4
++
+ #define RAWKEY(k) (eKeys((k) & ~k_Flags))
+ #define ISRAWKEY(k) ((k) != kNone && ((k) & k_Flags) == 0)
+ #define NORMALKEY(k) (eKeys((k) & ~k_Repeat))
+diff -urNad vdr-1.4.3~/menu.c vdr-1.4.3/menu.c
+--- vdr-1.4.3~/menu.c 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/menu.c 2006-09-24 13:23:13.000000000 +0200
+@@ -2347,8 +2347,27 @@
+ else {
+ cRecording *recording = GetRecording(ri);
+ if (recording) {
+- cReplayControl::SetRecording(recording->FileName(), recording->Title());
+- return osReplay;
++ int mountRet = MOUNT_DVD_REPLAY;
++ if (recording->IsOnlyOnDvd()) {
++ mountRet = recording->MountDvd();
++ }
++ if(mountRet == MOUNT_DVD_REPLAY) {
++ cReplayControl::SetRecording(recording->FileName(), recording->Title());
++ return osReplay;
++ } else if (mountRet == MOUNT_DVD_LAUNCH_DVD_PLUGIN) {
++ //launch DVD plugin here
++ cPlugin *p = cPluginManager::GetPlugin("dvd");
++ cOsdObject *osd = NULL;
++ if(p) {
++ osd = p->MainMenuAction();
++ delete osd;
++ osd = NULL;
++ return osEnd;
++ } else {
++ Skins.Message(mtError, tr("DVD plugin is not installed!"));
++ Skins.Flush();
++ }
++ }
+ }
+ }
+ }
+@@ -2996,8 +3015,19 @@
+ SetSection(tr("Replay"));
+ Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode));
+ Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode));
+- Add(new cMenuEditBoolItem(tr("Setup.Replay$Tray open on begin"), &data.TrayOpenOnBegin));
+- Add(new cMenuEditBoolItem(tr("Setup.Replay$Tray open on end"), &data.TrayOpenOnEnd));
++ static const char *dvddisplaymode[3];
++ dvddisplaymode[0]=tr("Setup.BigPatch$Length");
++ dvddisplaymode[1]=tr("Setup.BigPatch$Length / Number");
++ dvddisplaymode[2]=tr("Setup.BigPatch$Number");
++ Add(new cMenuEditStraItem(tr("Setup.BigPatch$DVD display mode"), &data.DvdDisplayMode,3,dvddisplaymode));
++ Add(new cMenuEditBoolItem(tr("Setup.BigPatch$DVD display leading zeros"), &data.DvdDisplayZeros));
++ static const char *dvdtraymode[4];
++ dvdtraymode[0]=tr("Setup.BigPatch$never");
++ dvdtraymode[1]=tr("Setup.BigPatch$on begin");
++ dvdtraymode[2]=tr("Setup.BigPatch$on end");
++ dvdtraymode[3]=tr("Setup.BigPatch$on begin and end");
++ Add(new cMenuEditStraItem(tr("Setup.BigPatch$Tray open"), &data.DvdTrayMode,4,dvdtraymode));
++ Add(new cMenuEditIntItem(tr("Setup.BigPatch$Limit DVD to speed"), &data.DvdSpeedLimit, 0, 50));
+ Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99));
+ Add(new cMenuEditBoolItem(tr("Setup.Replay$Jump&Play"), &data.JumpPlay));
+ Add(new cMenuEditBoolItem(tr("Setup.Replay$Play&Jump"), &data.PlayJump));
+@@ -4387,6 +4417,16 @@
+ timeoutShow = 0;
+ timeSearchActive = false;
+ cRecording Recording(fileName);
++ canJumpChapters = (Recording.GetDvdType() == DVD_VIDEO_ARCHIVE_TYPE);
++ dvdchapters = NULL;
++ if(canJumpChapters) {
++ const char *ret = Recording.GetDvdChapters();
++ if(ret) {
++ dvdchapters = strdup(ret);
++ } else {
++ canJumpChapters=false;
++ }
++ }
+ cStatus::MsgReplaying(this, Recording.Name(), Recording.FileName(), true);
+ SetTrackDescriptions(false);
+ }
+@@ -4394,6 +4434,7 @@
+ cReplayControl::~cReplayControl()
+ {
+ Hide();
++ free(dvdchapters);
+ cStatus::MsgReplaying(this, NULL, fileName, false);
+ Stop();
+ }
+@@ -4659,6 +4700,32 @@
+ }
+ }
+
++void cReplayControl::ChaptersJump(bool Forward)
++{
++ int Current, Total;
++ if (GetIndex(Current, Total)) {
++ int position = -1;
++ char *buf, *pos, *old1, *old2;
++ old1 = "-1";
++ old2 = "-1";
++ buf = strdup(dvdchapters);
++ pos = strtok(buf, ",");
++ while(pos != NULL && position == -1) {
++ if(pos && atoi(pos) > Current)
++ position = Forward ? atoi(pos) : ((Current - atoi(old1)) <= (3*FRAMESPERSEC)) ? atoi(old2) : atoi(old1);
++ old2 = old1;
++ old1 = strdup(pos);
++ if(position == -1) pos = strtok(NULL, ",");
++ }
++ if(!pos && !Forward)
++ position = ((Current - atoi(old1)) <= (3*FRAMESPERSEC)) ? atoi(old2) : atoi(old1);
++ if(position >= 0) {
++ Goto(position);
++ Play();
++ }
++ }
++}
++
+ void cReplayControl::EditCut(void)
+ {
+ if (fileName) {
+@@ -4725,6 +4792,13 @@
+ TimeSearchProcess(Key);
+ return osContinue;
+ }
++ bool isOnMark = false;
++ if(canJumpChapters) {
++ int Current, Total;
++ GetIndex(Current, Total);
++ cMark *m = marks.Get(Current);
++ if(m && (m->position == Current)) isOnMark = true;
++ }
+ bool DoShowMode = true;
+ switch (Key) {
+ // Positioning:
+@@ -4755,6 +4829,22 @@
+ case kBlue: Hide();
+ Stop();
+ return osEnd;
++ case kDvdChapterJumpForward|k_Repeat: // DVDARCHIVE Patch
++ case kDvdChapterJumpForward: if(canJumpChapters && !isOnMark) {
++ ChaptersJump(true);
++ } else {
++ DoShowMode = false;
++ MarkMove(true);
++ }
++ break;
++ case kDvdChapterJumpBack|k_Repeat:
++ case kDvdChapterJumpBack: if(canJumpChapters && !isOnMark) {
++ ChaptersJump(false);
++ } else {
++ DoShowMode = false;
++ MarkMove(false);
++ }
++ break;
+ default: {
+ DoShowMode = false;
+ switch (Key) {
+diff -urNad vdr-1.4.3~/menu.h vdr-1.4.3/menu.h
+--- vdr-1.4.3~/menu.h 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/menu.h 2006-09-24 13:28:12.000000000 +0200
+@@ -247,6 +247,9 @@
+ void MarkMove(bool Forward);
+ void EditCut(void);
+ void EditTest(void);
++ void ChaptersJump(bool Forward);
++ bool canJumpChapters;
++ char *dvdchapters;
+ public:
+ cReplayControl(void);
+ virtual ~cReplayControl();
+diff -urNad vdr-1.4.3~/recording.c vdr-1.4.3/recording.c
+--- vdr-1.4.3~/recording.c 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/recording.c 2006-09-24 13:33:24.000000000 +0200
+@@ -24,6 +24,15 @@
+ #include "tools.h"
+ #include "videodir.h"
+
++// DVD-ARCHIVE Patch
++#if defined(DVDCHAPJUMP)
++#include <assert.h>
++/* libdvdread stuff */
++#include <dvdread/dvd_reader.h>
++#include <dvdread/ifo_types.h>
++#include <dvdread/ifo_read.h>
++#endif
++
+ #define SUMMARYFALLBACK
+
+ #define RECEXT ".rec"
+@@ -47,6 +56,7 @@
+ #define INFOFILESUFFIX "/info.vdr"
+ #define MARKSFILESUFFIX "/marks.vdr"
+ #define INDEXFILESUFFIX "/index.vdr"
++#define DVDARCHIVEFILENAME "/dvd.vdr"
+
+ #define MINDISKSPACE 1024 // MB
+
+@@ -491,6 +501,12 @@
+ sortBuffer = NULL;
+ fileName = NULL;
+ name = NULL;
++ dvdname = NULL;
++ dvdtrack = NULL;
++ dvdchapters = NULL;
++ isArchived = false;
++ isOnlyOnDvd = false;
++ dvdtype = DVD_TYPE_UNKNOWN;
+ fileSizeMB = -1; // unknown
+ deleted = 0;
+ // set up the actual name:
+@@ -551,6 +567,12 @@
+ char *p = strrchr(FileName, '/');
+
+ name = NULL;
++ dvdname = NULL;
++ dvdtrack = NULL;
++ dvdchapters = NULL;
++ isArchived = false;
++ isOnlyOnDvd = false;
++ dvdtype = DVD_TYPE_NOT_READ;
+ info = new cRecordingInfo;
+ if (p) {
+ time_t now = time(NULL);
+@@ -634,6 +656,13 @@
+ free(SummaryFileName);
+ }
+ #endif
++ if(CheckFileExistence("dvd.vdr")) {
++ GetDvdName(fileName);
++ isArchived = true;
++ if(!CheckFileExistence("001.vdr")) {
++ isOnlyOnDvd = true;
++ }
++ }
+ }
+ }
+
+@@ -643,6 +672,9 @@
+ free(sortBuffer);
+ free(fileName);
+ free(name);
++ free(dvdname);
++ free(dvdtrack);
++ free(dvdchapters);
+ delete info;
+ }
+
+@@ -708,6 +740,352 @@
+ return fileName;
+ }
+
++bool cRecording::CheckFileExistence(const char* FileNameToTest, const bool useVideoDir) const
++{
++ if (!useVideoDir || (useVideoDir && FileName())) {
++ char filename[BUFSIZ];
++
++ sprintf(filename, "%s%s%s", useVideoDir ? FileName() : "",
++ useVideoDir ? "/" : "",
++ FileNameToTest);
++ struct stat statBuf;
++ if(lstat(filename, &statBuf) == -1) return false;
++ return S_ISREG(statBuf.st_mode) || S_ISLNK(statBuf.st_mode);
++ }
++ return false;
++}
++
++bool cRecording::GetDvdName(const char* Directory) const
++{
++ char* filename = (char*)alloca(strlen(Directory) + strlen(DVDARCHIVEFILENAME) + 1);
++ if (filename) {
++ strcpy(filename, Directory);
++ char *end = filename + strlen(filename);
++ strcpy(end, DVDARCHIVEFILENAME);
++ FILE* file;
++ if((file = fopen(filename, "r"))) {
++ cReadLine ReadLine;
++ char* buffer = (char*)alloca(BUFSIZ);
++ if(buffer) {
++ buffer = ReadLine.Read(file);
++ if(buffer) {
++ ((cRecording*)this)->dvdname = strdup(buffer);
++ } else {
++ ((cRecording*)this)->dvdname = NULL;
++ }
++
++ buffer = ReadLine.Read(file);
++ if(buffer) {
++ ((cRecording*)this)->dvdtrack = strdup(buffer);
++ if(atoi(buffer) == 0) {
++ ((cRecording*)this)->dvdtype = DVD_VIDEO_TYPE;
++ } else {
++ ((cRecording*)this)->dvdtype = DVD_VIDEO_ARCHIVE_TYPE;
++ }
++ } else {
++ ((cRecording*)this)->dvdtrack = NULL;
++ ((cRecording*)this)->dvdtype = DVD_ARCHIVE_TYPE;
++ }
++
++ fclose(file);
++ return true;
++ }
++ }
++ }
++ return false;
++}
++
++bool cRecording::GetDvdChaptersFromDvd(int title) const
++{
++#if defined(DVDCHAPJUMP)
++ char* buf = (char*)alloca(BUFSIZ);
++ if(!buf) return false;
++
++ dvd_reader_t *dvd;
++ ifo_handle_t *ifo_file;
++ tt_srpt_t *tt_srpt;
++ ifo_handle_t *vts_file;
++ pgc_t *cur_pgc;
++
++ dvd = DVDOpen(DVD_DEVICE);
++ if(!dvd) {
++ esyslog("DVD-ARCHIVE: Couldn't open DVD device %s!", DVD_DEVICE);
++ return false;
++ }
++
++ /* open title manager */
++ ifo_file = ifoOpen(dvd,0);
++ if(!ifo_file) {
++ esyslog("DVD-ARCHIVE: Can't open VMG info.");
++ DVDClose(dvd);
++ return false;
++ }
++
++ /* read total_title */
++ tt_srpt = ifo_file->tt_srpt;
++
++ /* get total chapters */
++ int title_set_nr = tt_srpt->title[title-1].title_set_nr;
++ int total_chap = tt_srpt->title[title-1].nr_of_ptts;
++ int local_title_id = tt_srpt->title[title-1].vts_ttn - 1;
++
++ /* access title set file */
++ vts_file = ifoOpen(dvd,title_set_nr);
++ if(!vts_file) {
++ esyslog("DVD-ARCHIVE: Can't open info file for title set %d!",title_set_nr);
++ DVDClose(dvd);
++ return false;
++ }
++
++ /* find program chain and check programs
++ all chapters should be in the same prog chain and
++ should be numbered from 1 to <total_chap>
++ */
++ {
++ vts_ptt_srpt_t *vts_ptt_srpt = vts_file->vts_ptt_srpt;
++ int pgc_nr = vts_ptt_srpt->title[local_title_id].ptt[0].pgcn;
++ int pg = vts_ptt_srpt->title[local_title_id].ptt[0].pgn;
++ int p;
++
++ assert(pg==1);
++ for(p=1;p<total_chap;p++) {
++ int next_pg;
++ int this_pgc;
++ this_pgc = vts_ptt_srpt->title[local_title_id].ptt[p].pgcn;
++ assert(pgc_nr==this_pgc);
++ next_pg = vts_ptt_srpt->title[local_title_id].ptt[p].pgn;
++ assert(pg+1==next_pg);
++ pg = next_pg;
++ }
++
++ /* fetch program chain */
++ cur_pgc = vts_file->vts_pgcit->pgci_srp[pgc_nr-1].pgc;
++ assert(cur_pgc->nr_of_programs==total_chap);
++ }
++
++ /* --- main cell loop --- */
++ {
++ pgc_program_map_t *chap_cell;
++ cell_playback_t *cell_pb;
++ int c;
++ int chap;
++
++ /* total cells in chain */
++ int total_cell = cur_pgc->nr_of_cells;
++
++ /* get info */
++ chap_cell = cur_pgc->program_map;
++ cell_pb = cur_pgc->cell_playback;
++
++ /* loop through all cells */
++ chap = -1;
++ int position = 0;
++ for(c=0;c<total_cell;c++) {
++ int cell_mode;
++ char *mode;
++
++ dvd_time_t *time = (dvd_time_t *)&cell_pb->playback_time;
++
++ int framerate = time->frame_u>>6;
++ assert(framerate == 1 || framerate == 3);
++ int frames_per_sec = (framerate == 1) ? 25 : 30;
++
++ /* upper 4 bits are first digit, down 4 bits are second digit */
++ int hour = (time->hour>>4) * 10 + (time->hour&15);
++ int minute = (time->minute>>4) * 10 + (time->minute&15);
++ int second = (time->second>>4) * 10 + (time->second&15);
++ /* upper 4 bits are first digit, down 4 bits are second digit */
++ int frame = (time->frame_u>>4&3) * 10 + (time->frame_u&15);
++
++ int frames = ((hour * 3600) + (minute * 60) + second) * frames_per_sec + frame;
++
++ /* this cell is the begin of a new chapter! */
++ if(chap_cell[chap+1]==c+1) {
++ char oldbuf[BUFSIZ];
++ sprintf(oldbuf, "%s", buf);
++ sprintf(buf, "%s%d%s", oldbuf, position,
++ ((chap+2) < total_chap) ? "," : "");
++ chap++;
++ }
++
++ /* cell_mode: 0=normal, 1=first of angle, 2=in angle, 3=last of angle */
++ cell_mode = cell_pb->block_mode;
++ if((cell_mode==0)||(cell_mode==1)) {
++ /* only account for normal or begin of angle cells */
++ position += frames;
++ mode = "counted";
++ } else {
++ mode = "skipped";
++ }
++
++ cell_pb++;
++ }
++ }
++
++ ifoClose(ifo_file);
++ ifoClose(vts_file);
++ DVDClose(dvd);
++
++ ((cRecording*)this)->dvdchapters = strdup(buf);
++
++ return true;
++#else
++ return false;
++#endif
++}
++
++const char *cRecording::GetDvdChapters(void) const
++{
++ // Read chapters from dvd
++ if(dvdtype == DVD_VIDEO_ARCHIVE_TYPE) {
++ if(dvdtrack) {
++ if(!GetDvdChaptersFromDvd(atoi(dvdtrack))) {
++ ((cRecording*)this)->dvdchapters = NULL;
++ } else {
++ isyslog("DVD-ARCHIVE: Using following positions for chapter jumping: %s", dvdchapters);
++ }
++ return dvdchapters;
++ }
++ }
++ return NULL;
++}
++
++int cRecording::MountDvd(void) const
++{
++ char cmd[BUFSIZ];
++ if(Setup.DvdSpeedLimit > 0) {
++ sprintf(cmd, "speedcontrol -x %d %s", Setup.DvdSpeedLimit, DVD_DEVICE);
++ SystemExec(cmd);
++ }
++
++ char msg[BUFSIZ];
++ if(atoi(dvdname) == 0) {
++ sprintf(msg, tr("Please mount %s"), dvdname);
++ } else {
++ if(Setup.DvdDisplayZeros) {
++ sprintf(msg, tr("Please mount DVD %04d"), atoi(dvdname));
++ } else {
++ sprintf(msg, tr("Please mount DVD %d"), atoi(dvdname));
++ }
++ }
++
++ bool rep = true;
++ while(rep) {
++ if(Setup.DvdTrayMode==1 || Setup.DvdTrayMode==3) {
++ sprintf(cmd, "umount %s; eject %s", DVD_DEVICE, DVD_DEVICE);
++ } else {
++ sprintf(cmd, "umount %s", DVD_DEVICE);
++ }
++ SystemExec(cmd);
++
++ if(Interface->Confirm(msg, 300)) {
++ Skins.Message(mtStatus, tr("Please wait. Checking DVD..."));
++ Skins.Flush();
++ sprintf(cmd, "eject -t %s; mkdir -p %s; mount -o ro -t %s %s %s",
++ DVD_DEVICE, DVD_MOUNT_PATH,
++ (dvdtrack ? "udf" : "iso9660"),
++ DVD_DEVICE, DVD_MOUNT_PATH);
++ SystemExec(cmd);
++
++ bool correctDvd = true;
++
++ char *olddvdname, *olddvdtrack;
++ int olddvdtype;
++ olddvdname = dvdname;
++ olddvdtrack = dvdtrack;
++ olddvdtype = dvdtype;
++ if(GetDvdName(DVD_MOUNT_PATH)) {
++ if(atoi(dvdname) != atoi(olddvdname)) correctDvd = false;
++ }
++ ((cRecording*)this)->dvdname = olddvdname;
++ ((cRecording*)this)->dvdtrack = olddvdtrack;
++ ((cRecording*)this)->dvdtype = olddvdtype;
++
++ if(correctDvd) {
++ if(dvdtrack == NULL) {
++ // Archived DVD in VDR format
++ char fn[BUFSIZ];
++ strcpy(fn, FileName());
++ char *p = strrchr(fn, '/');
++ sprintf(cmd, "find '%s' -name '%s'", DVD_MOUNT_PATH, p+1);
++ } else {
++ // Either archived DVD in DVD-Video format or DVD-Video which
++ // should be played with the DVD plugin
++ sprintf(cmd, "find '%s' -iname 'VIDEO_TS'", DVD_MOUNT_PATH);
++ }
++
++ cReadLine pipe;
++ FILE* file;
++ char *dirname = NULL;
++ if((file = popen(cmd, "r")) != (FILE *)NULL) {
++ if((dirname = pipe.Read(file)) != NULL) {
++ pclose(file);
++ if(dvdtrack != NULL && atoi(dvdtrack) == 0) {
++ // It is a valid Video-DVD and DVD plugin can be started
++ return MOUNT_DVD_LAUNCH_DVD_PLUGIN;
++ } else {
++ // It is a valid Archive-DVD or an archived Video-DVD
++ // and the links can now be established
++ char srcFn[BUFSIZ];
++ int n = 1;
++
++ do {
++ if(dvdtrack == NULL) {
++ sprintf(srcFn, "%s/%03d.vdr", dirname, n);
++ } else {
++ sprintf(srcFn, "%s/VTS_%02d_%d.VOB", dirname, atoi(dvdtrack), n);
++ }
++
++ if(!access(srcFn, R_OK)) {
++ sprintf(cmd, "ln -sf '%s' '%s/%03d.vdr'", srcFn, FileName(), n);
++ SystemExec(cmd);
++ isyslog("DVD-ARCHIVE: Linking %s/%03d.vdr -> %s", FileName(), n, srcFn);
++ } else {
++ break;
++ }
++ } while( ++n < 999);
++
++ if(!CheckFileExistence("index.vdr")) {
++ if(dvdtrack == NULL) {
++ sprintf(srcFn, "%s/index.vdr", dirname);
++ } else {
++ sprintf(srcFn, "%s/index_%02d.vdr", dirname, atoi(dvdtrack));
++ }
++
++ if(!CheckFileExistence(srcFn, false)) {
++ sprintf(msg, tr("No index-file found. Creating may take minutes. Create one?"));
++ if(Interface->Confirm(msg, 300)) {
++ Skins.Message(mtStatus, tr("Please wait. Creating index-file..."));
++ sprintf(cmd, "speedcontrol -x 999 %s; cd %s && genindex &", DVD_DEVICE, FileName());
++ SystemExec(cmd);
++ return MOUNT_DVD_ABORT;
++ }
++ } else {
++ sprintf(cmd, "ln -sf '%s' '%s/index.vdr'", srcFn, FileName());
++ SystemExec(cmd);
++ isyslog("DVD-ARCHIVE: Linking %s/index.vdr -> %s", FileName(), srcFn);
++ }
++ }
++ return MOUNT_DVD_REPLAY;
++ }
++ } else {
++ Skins.Message(mtError, tr("Wrong DVD!"), 3);
++ Skins.Flush();
++ }
++ }
++ pclose(file);
++
++ } else {
++ Skins.Message(mtError, tr("Wrong DVD!"), 3);
++ Skins.Flush();
++ }
++ } else {
++ rep = false;
++ }
++ }
++ return MOUNT_DVD_ABORT;
++}
++
+ const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level, bool Original) const
+ {
+ char New = NewIndicator && IsNew() ? Setup.WarEagleIcons ? ICON_NEU : '*' : ' ';
+@@ -755,6 +1133,42 @@
+ free(filename);
+ }
+ }
++
++ if(isArchived && !isOnlyOnDvd) New = '~';
++
++ if (isOnlyOnDvd && Setup.DvdDisplayMode >= 1) {
++ char oldLength[21];
++
++ if(strrchr(RecLength, '\'')) {
++ snprintf(oldLength, sizeof(oldLength), "%s", RecLength);
++ } else {
++ oldLength[0] = 0;
++ }
++
++ if(dvdname) {
++ char tmp[BUFSIZ];
++ if(atoi(dvdname) != 0) {
++ if(Setup.DvdDisplayZeros) {
++ snprintf(tmp, sizeof(tmp), "%04d", atoi(dvdname));
++ } else {
++ int num = atoi(dvdname);
++ bool displaySpace = !(Setup.DvdDisplayMode == 1 && oldLength[0] != 0);
++ // ugly hack to have 2 spaces instead of one 0 for each place
++ snprintf(tmp, sizeof(tmp), "%s%s%s%d", displaySpace && (num < 1000) ? " " : "",
++ displaySpace && (num < 100) ? " " : "",
++ displaySpace && (num < 10) ? " " : "",
++ num);
++ }
++ ((cRecording*)this)->dvdname = strdup(tmp);
++ }
++ }
++
++ snprintf(RecLength, sizeof(RecLength), "%s%s%s%s", (Setup.ShowRecLength && (Setup.DvdDisplayMode == 1) && (oldLength[0] != 0)) ? oldLength : "",
++ (dvdname && isArchived && isOnlyOnDvd && Setup.ShowRecLength && (Setup.DvdDisplayMode == 1) && (oldLength[0] != 0)) ? " / " : "",
++ (dvdname && isArchived && isOnlyOnDvd) ? dvdname : "",
++ (dvdname && isArchived && isOnlyOnDvd) ? " " : ""
++ );
++ }
+ snprintf(RecDate, sizeof(RecDate), "%02d.%02d.%02d", t->tm_mday, t->tm_mon + 1, t->tm_year % 100);
+ snprintf(RecTime, sizeof(RecTime), "%02d:%02d", t->tm_hour, t->tm_min);
+ snprintf(RecDelimiter, sizeof(RecDelimiter), "%c", Delimiter);
+@@ -764,8 +1178,8 @@
+ (Setup.ShowRecTime ? RecTime : ""),
+ New,
+ (Setup.ShowRecTime || Setup.ShowRecDate ? RecDelimiter : ""),
+- (Setup.ShowRecLength ? RecLength : ""),
+- (Setup.ShowRecLength ? RecDelimiter : ""),
++ (((Setup.ShowRecLength + Setup.DvdDisplayMode) > 0) ? RecLength : ""),
++ (((Setup.ShowRecLength + Setup.DvdDisplayMode) > 0) ? RecDelimiter : ""),
+ s);
+ }
+ // let's not display a trailing '~':
+@@ -1529,6 +1943,50 @@
+ cFileName::~cFileName()
+ {
+ Close();
++
++ // DVD Archive Begin
++
++ char fn[BUFSIZ];
++ strcpy(fn, fileName);
++
++ char *p;
++ if((p = strrchr(fn, '/'))) {
++ p[0] = 0;
++ }
++
++ char cmd[BUFSIZ];
++ sprintf(cmd, "find '%s' -type l -lname '%s/*'", fn, DVD_MOUNT_PATH);
++
++ bool isOnDvd = false;
++
++ cReadLine pipe;
++ FILE* file;
++ char* filename;
++ if((file = popen(cmd, "r")) != (FILE *)NULL) {
++ while((filename = pipe.Read(file)) != NULL) {
++ isOnDvd = true;
++ unlink(filename);
++ isyslog("DVD-ARCHIVE: Deleting %s", filename);
++ }
++ pclose(file);
++ }
++
++ if(isOnDvd) {
++ if(Setup.DvdTrayMode==2 || Setup.DvdTrayMode==3) {
++ sprintf(cmd, "umount %s; eject %s", DVD_DEVICE, DVD_DEVICE);
++ } else {
++ sprintf(cmd, "umount %s", DVD_DEVICE);
++ }
++ SystemExec(cmd);
++
++ if(Setup.DvdSpeedLimit > 0) {
++ sprintf(cmd, "speedcontrol -x 999 %s", DVD_DEVICE);
++ SystemExec(cmd);
++ }
++ }
++
++ // DVD Archive End
++
+ free(fileName);
+ }
+
+@@ -1543,97 +2001,6 @@
+ LOG_ERROR_STR(fileName);
+ }
+ else {
+-#ifdef DVDARCHIVE
+- isOnDVD = false;
+-
+- if (access(fileName, R_OK)) { // fileName="/video0/Blumen_des_Schreckens/2004-05-10.12:25.50.99.rec/001.vdr"
+- if (errno == ENOENT) {
+- register char *p, *p1;
+- register int n = 1;
+- auto bool ok = false;
+- auto char fn[BUFSIZ], fn2[BUFSIZ], msg[BUFSIZ], cmd[BUFSIZ], s[BUFSIZ];
+- auto FILE *f, *f1;
+- cReadLine ReadLine;
+-
+- strcpy(fn, fileName);
+-
+- if ((p = strrchr(fn, '.'))) {
+- memcpy(p - 3, "dvd", 3); // fn="/video0/Blumen_des_Schreckens/2004-05-10.12:25.50.99.rec/dvd.vdr"
+-
+- if ((f = fopen(fn, "r")) != (FILE *)NULL) {
+- if (fgets(s, sizeof s, f)) {
+- if ((p1 = strchr(s, '\n')))
+- *p1 = 0;
+- sprintf(msg, tr("Please mount DVD %s"), s);
+-
+- do {
+- if (Setup.TrayOpenOnBegin)
+- SystemExec("umount /dev/cdrom; eject /dev/cdrom");
+- else
+- SystemExec("umount /dev/cdrom");
+-
+- if (Interface->Confirm(msg)) {
+-
+- SystemExec("eject -t /dev/cdrom; mkdir -p /tmp/vdr.dvd; mount -o ro /dev/cdrom /tmp/vdr.dvd");
+- isOnDVD = true;
+-
+- *(p - 4) = 0;
+- sprintf(cmd, "find /tmp/vdr.dvd -name '%s'", p - 30); // fn="2004-05-10.12:25.50.99.rec"
+-
+- if ((f1 = popen(cmd, "r")) != (FILE *)NULL) {
+-
+- if ((p1 = ReadLine.Read(f1)) != NULL) {
+-
+- if ((p = strrchr(fileName, '/')))
+- *p = 0;
+-
+- do {
+- sprintf(fn2, "%s/%03d.vdr", p1, n);
+-
+- if (!access(fn2, R_OK)) {
+- sprintf(s, "ln -sf '%s' '%s/%03d.vdr'", fn2, fileName, n);
+- SystemExec(s);
+- dsyslog(s);
+- }
+- else
+- break;
+- }
+- while (++n < MAXFILESPERRECORDING);
+-
+- sprintf(fn2, "%s/index.vdr", p1);
+-
+- if (!access(fn2, R_OK)) {
+- sprintf(s, "ln -sf '%s' '%s/index.vdr'", fn2, fileName);
+- SystemExec(s);
+- dsyslog(s);
+- }
+-
+- *p = '/';
+-
+- ok = true;
+- }
+- pclose(f1);
+- }
+-
+- if (!ok) {
+-#if VDRVERSNUM >= 10307
+- Skins.Message(mtError, tr("Wrong DVD!"));
+-#else
+- Interface->Error(tr("Wrong DVD!"));
+-#endif
+- isOnDVD = false;
+- }
+- }
+- else
+- break;
+- } while (!ok);
+- }
+- fclose(f);
+- }
+- }
+- }
+- }
+-#endif /* DVDARCHIVE */
+ if (access(fileName, R_OK) == 0) {
+ dsyslog("playing '%s'", fileName);
+ file = cUnbufferedFile::Create(fileName, O_RDONLY | BlockingFlag);
+@@ -1653,15 +2020,6 @@
+ if (CloseVideoFile(file) < 0)
+ LOG_ERROR_STR(fileName);
+ file = NULL;
+-#ifdef DVDARCHIVE
+- if (isOnDVD) {
+- if (Setup.TrayOpenOnEnd)
+- SystemExec("umount /dev/cdrom; eject /dev/cdrom");
+- else
+- SystemExec("umount /dev/cdrom");
+- isOnDVD = false;
+- }
+-#endif /* DVDARCHIVE */
+ }
+ }
+
+diff -urNad vdr-1.4.3~/recording.h vdr-1.4.3/recording.h
+--- vdr-1.4.3~/recording.h 2006-09-24 13:12:04.000000000 +0200
++++ vdr-1.4.3/recording.h 2006-09-24 13:34:31.000000000 +0200
+@@ -61,6 +61,18 @@
+ bool Write(FILE *f, const char *Prefix = "") const;
+ };
+
++#define MOUNT_DVD_ABORT 0
++#define MOUNT_DVD_REPLAY 1
++#define MOUNT_DVD_LAUNCH_DVD_PLUGIN 2
++#define DVD_DEVICE "/dev/cdrom"
++#define DVD_MOUNT_PATH "/tmp/vdr.dvd"
++
++#define DVD_TYPE_UNKNOWN -1
++#define DVD_TYPE_NOT_READ 0
++#define DVD_VIDEO_TYPE 1
++#define DVD_ARCHIVE_TYPE 2
++#define DVD_VIDEO_ARCHIVE_TYPE 3
++
+ class cRecording : public cListObject {
+ friend class cRecordings;
+ private:
+@@ -71,6 +83,13 @@
+ mutable char *name;
+ mutable int fileSizeMB;
+ cRecordingInfo *info;
++ char *dvdname;
++ char *dvdtrack;
++ char *dvdchapters;
++ bool isArchived;
++ bool isOnlyOnDvd;
++ int dvdtype;
++ bool GetDvdChaptersFromDvd(int title) const;
+ static char *StripEpisodeName(char *s);
+ char *SortName(void) const;
+ int GetResume(void) const;
+@@ -85,6 +104,12 @@
+ virtual int Compare(const cListObject &ListObject) const;
+ const char *Name(void) const { return name; }
+ const char *FileName(void) const;
++ bool CheckFileExistence(const char* FileNameToTest, const bool useVideoDir = true) const;
++ bool GetDvdName(const char* Directory) const;
++ bool IsOnlyOnDvd(void) const { return isOnlyOnDvd; }
++ int MountDvd(void) const;
++ int GetDvdType(void) const { return dvdtype; }
++ const char *GetDvdChapters(void) const ;
+ const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1, bool Original = true) const;
+ const cRecordingInfo *Info(void) const { return info; }
+ const char *PrefixFileName(char Prefix);
+@@ -215,6 +240,7 @@
+ cResumeFile resumeFile;
+ cMutex mutex;
+ bool CatchUp(int Index = -1);
++ bool isOnDVD;
+ public:
+ cIndexFile(const char *FileName, bool Record);
+ ~cIndexFile();
Added: vdr/vdr/trunk/debian/patches/opt-46_dvdarchive.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-46_dvdarchive.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-46_dvdarchive.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,306 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-46_dvdarchive.dpatch by Andreas Kool <akool at gmx.de>
+## http://www.ko0l.de/download/vdr/DVDarchive/download/vdr-dvdarchive-0.0.4.tar.bz2
+##
+## Thomas Günther <tom at toms-cafe.de>:
+## - adapted to VDR-1.3.42
+## - solved conflicts with other patches
+## - activated DVDARCHIVE define by default
+## - set default of TrayOpenOnBegin and TrayOpenOnEnd to 0
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Play on DVD archived VDR recordings.
+
+ at DPATCH@
+diff -drubNB -x PLUGINS -x mk -x 'ORIG*' vdr-1.3.21.orig/Makefile vdr-1.3.21/Makefile
+--- vdr-1.3.21.orig/Makefile 2005-02-13 11:13:45.000000000 +0100
++++ vdr-1.3.21/Makefile 2005-02-20 10:13:44.000000000 +0100
+@@ -80,6 +80,10 @@
+ DEFINES += -DVFAT
+ endif
+
++ifndef NO_DVDARCHIVE
++DEFINES += -DDVDARCHIVE
++endif
++
+ all: vdr
+ font: genfontfile\
+ fontfix-iso8859-1.c fontosd-iso8859-1.c fontsml-iso8859-1.c\
+diff -drubNB -x PLUGINS -x mk -x 'ORIG*' vdr-1.3.21.orig/config.c vdr-1.3.21/config.c
+--- vdr-1.3.21.orig/config.c 2005-02-05 11:43:04.000000000 +0100
++++ vdr-1.3.21/config.c 2005-02-20 10:17:51.000000000 +0100
+@@ -294,6 +294,10 @@
+ SplitEditedFiles = 0;
+ MinEventTimeout = 30;
+ MinUserInactivity = 300;
++#ifdef DVDARCHIVE
++ TrayOpenOnBegin = 0;
++ TrayOpenOnEnd = 0;
++#endif /* DVDARCHIVE */
+ MultiSpeedMode = 0;
+ ShowReplayMode = 0;
+ ResumeID = 0;
+@@ -450,6 +454,10 @@
+ else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value);
+ else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value);
+ else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value);
++#ifdef DVDARCHIVE
++ else if (!strcasecmp(Name, "TrayOpenOnBegin")) TrayOpenOnBegin = atoi(Value);
++ else if (!strcasecmp(Name, "TrayOpenOnEnd")) TrayOpenOnEnd = atoi(Value);
++#endif /* DVDARCHIVE */
+ else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
+ else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
+ else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value);
+@@ -515,6 +523,10 @@
+ Store("MinUserInactivity", MinUserInactivity);
+ Store("MultiSpeedMode", MultiSpeedMode);
+ Store("ShowReplayMode", ShowReplayMode);
++#ifdef DVDARCHIVE
++ Store("TrayOpenOnBegin", TrayOpenOnBegin);
++ Store("TrayOpenOnEnd", TrayOpenOnEnd);
++#endif /* DVDARCHIVE */
+ Store("ResumeID", ResumeID);
+ Store("CurrentChannel", CurrentChannel);
+ Store("CurrentVolume", CurrentVolume);
+diff -drubNB -x PLUGINS -x mk -x 'ORIG*' vdr-1.3.21.orig/config.h vdr-1.3.21/config.h
+--- vdr-1.3.21.orig/config.h 2005-02-08 12:22:14.000000000 +0100
++++ vdr-1.3.21/config.h 2005-02-20 10:21:51.000000000 +0100
+@@ -248,6 +248,8 @@
+ int MaxVideoFileSize;
+ int SplitEditedFiles;
+ int MinEventTimeout, MinUserInactivity;
++ int TrayOpenOnBegin;
++ int TrayOpenOnEnd;
+ int MultiSpeedMode;
+ int ShowReplayMode;
+ int ResumeID;
+diff -drubNB -x PLUGINS -x mk -x 'ORIG*' vdr-1.3.21.orig/i18n.c vdr-1.3.21/i18n.c
+--- vdr-1.3.21.orig/i18n.c 2005-02-12 11:26:51.000000000 +0100
++++ vdr-1.3.21/i18n.c 2005-02-20 10:13:44.000000000 +0100
+@@ -2231,6 +2231,84 @@
+ "Kõvaketas peaaegu täis!",
+ "Kun lidt diskplads tilbage!",
+ },
++#ifdef DVDARCHIVE
++ { "Please mount DVD %s",
++ "Bitte DVD %s einlegen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Wrong DVD!",
++ "Falsche DVD!",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.Replay$Tray open on begin",
++ "DVD-Schublade zu Beginn öffnen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++ { "Setup.Replay$Tray open on end",
++ "DVD-Schublade am Ende öffnen",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
++#endif /* DVDARCHIVE */
+ { "Can't open CAM menu!",
+ "CAM-Menü kann nicht geöffnet werden!",
+ "Ne morem odpreti CAM menija!",
+diff -drubNB -x PLUGINS -x mk -x 'ORIG*' vdr-1.3.21.orig/menu.c vdr-1.3.21/menu.c
+--- vdr-1.3.21.orig/menu.c 2005-02-06 12:33:13.000000000 +0100
++++ vdr-1.3.21/menu.c 2005-02-20 10:13:44.000000000 +0100
+@@ -2171,6 +2171,8 @@
+ SetSection(tr("Replay"));
+ Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode));
+ Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode));
++ Add(new cMenuEditBoolItem(tr("Setup.Replay$Tray open on begin"), &data.TrayOpenOnBegin));
++ Add(new cMenuEditBoolItem(tr("Setup.Replay$Tray open on end"), &data.TrayOpenOnEnd));
+ Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99));
+ }
+
+diff -drubNB -x PLUGINS -x mk -x 'ORIG*' vdr-1.3.21.orig/recording.c vdr-1.3.21/recording.c
+--- vdr-1.3.21.orig/recording.c 2005-02-12 11:17:47.000000000 +0100
++++ vdr-1.3.21/recording.c 2005-02-20 10:28:31.000000000 +0100
+@@ -1094,6 +1094,97 @@
+ LOG_ERROR_STR(fileName);
+ }
+ else {
++#ifdef DVDARCHIVE
++ isOnDVD = false;
++
++ if (access(fileName, R_OK)) { // fileName="/video0/Blumen_des_Schreckens/2004-05-10.12:25.50.99.rec/001.vdr"
++ if (errno == ENOENT) {
++ register char *p, *p1;
++ register int n = 1;
++ auto bool ok = false;
++ auto char fn[BUFSIZ], fn2[BUFSIZ], msg[BUFSIZ], cmd[BUFSIZ], s[BUFSIZ];
++ auto FILE *f, *f1;
++ cReadLine ReadLine;
++
++ strcpy(fn, fileName);
++
++ if ((p = strrchr(fn, '.'))) {
++ memcpy(p - 3, "dvd", 3); // fn="/video0/Blumen_des_Schreckens/2004-05-10.12:25.50.99.rec/dvd.vdr"
++
++ if ((f = fopen(fn, "r")) != (FILE *)NULL) {
++ if (fgets(s, sizeof s, f)) {
++ if ((p1 = strchr(s, '\n')))
++ *p1 = 0;
++ sprintf(msg, tr("Please mount DVD %s"), s);
++
++ do {
++ if (Setup.TrayOpenOnBegin)
++ SystemExec("umount /dev/cdrom; eject /dev/cdrom");
++ else
++ SystemExec("umount /dev/cdrom");
++
++ if (Interface->Confirm(msg)) {
++
++ SystemExec("eject -t /dev/cdrom; mkdir -p /tmp/vdr.dvd; mount -o ro /dev/cdrom /tmp/vdr.dvd");
++ isOnDVD = true;
++
++ *(p - 4) = 0;
++ sprintf(cmd, "find /tmp/vdr.dvd -name '%s'", p - 30); // fn="2004-05-10.12:25.50.99.rec"
++
++ if ((f1 = popen(cmd, "r")) != (FILE *)NULL) {
++
++ if ((p1 = ReadLine.Read(f1)) != NULL) {
++
++ if ((p = strrchr(fileName, '/')))
++ *p = 0;
++
++ do {
++ sprintf(fn2, "%s/%03d.vdr", p1, n);
++
++ if (!access(fn2, R_OK)) {
++ sprintf(s, "ln -sf '%s' '%s/%03d.vdr'", fn2, fileName, n);
++ SystemExec(s);
++ dsyslog(s);
++ }
++ else
++ break;
++ }
++ while (++n < MAXFILESPERRECORDING);
++
++ sprintf(fn2, "%s/index.vdr", p1);
++
++ if (!access(fn2, R_OK)) {
++ sprintf(s, "ln -sf '%s' '%s/index.vdr'", fn2, fileName);
++ SystemExec(s);
++ dsyslog(s);
++ }
++
++ *p = '/';
++
++ ok = true;
++ }
++ pclose(f1);
++ }
++
++ if (!ok) {
++#if VDRVERSNUM >= 10307
++ Skins.Message(mtError, tr("Wrong DVD!"));
++#else
++ Interface->Error(tr("Wrong DVD!"));
++#endif
++ isOnDVD = false;
++ }
++ }
++ else
++ break;
++ } while (!ok);
++ }
++ fclose(f);
++ }
++ }
++ }
++ }
++#endif /* DVDARCHIVE */
+ if (access(fileName, R_OK) == 0) {
+ dsyslog("playing '%s'", fileName);
+ file = open(fileName, O_RDONLY | BlockingFlag);
+@@ -1113,6 +1204,15 @@
+ if ((record && CloseVideoFile(file) < 0) || (!record && file->Close() < 0))
+ LOG_ERROR_STR(fileName);
+ file = NULL;
++#ifdef DVDARCHIVE
++ if (isOnDVD) {
++ if (Setup.TrayOpenOnEnd)
++ SystemExec("umount /dev/cdrom; eject /dev/cdrom");
++ else
++ SystemExec("umount /dev/cdrom");
++ isOnDVD = false;
++ }
++#endif /* DVDARCHIVE */
+ }
+ }
+
+diff -drubNB -x PLUGINS -x mk -x 'ORIG*' vdr-1.3.21.orig/recording.h vdr-1.3.21/recording.h
+--- vdr-1.3.21.orig/recording.h 2005-01-16 16:11:31.000000000 +0100
++++ vdr-1.3.21/recording.h 2005-02-20 10:13:44.000000000 +0100
+@@ -163,6 +163,9 @@
+ char *fileName, *pFileNumber;
+ bool record;
+ bool blocking;
++#ifdef DVDARCHIVE
++ bool isOnDVD;
++#endif /* DVDARCHIVE */
+ public:
+ cFileName(const char *FileName, bool Record, bool Blocking = false);
+ ~cFileName();
Added: vdr/vdr/trunk/debian/patches/opt-47_sourcecaps.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-47_sourcecaps.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-47_sourcecaps.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,224 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-21_sourcecaps.dpatch by Christian Schuld <chris at sonnengesicht.de>
+## http://linvdr.org/mailinglists/vdr/2004/08/msg00521.html
+## http://article.gmane.org/gmane.linux.vdr/27260/
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch for assigning special satellites to one dvb card.
+
+ at DPATCH@
+diff -rNu vdr-1.3.39/config.c vdr-1.3.39+SourceCaps/config.c
+--- vdr-1.3.39/config.c 2006-01-13 16:19:37.000000000 +0100
++++ vdr-1.3.39+SourceCaps/config.c 2006-01-21 13:50:24.433469136 +0100
+@@ -15,6 +15,7 @@
+ #include "interface.h"
+ #include "plugin.h"
+ #include "recording.h"
++#include "sources.h"
+
+ // IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
+ // format characters in order to allow any number of blanks after a numeric
+@@ -228,6 +229,8 @@
+ LnbFrequLo = 9750;
+ LnbFrequHi = 10600;
+ DiSEqC = 0;
++ memset(SourceCaps, 0, sizeof SourceCaps);
++ SourceCapsSet = false;
+ SetSystemTime = 0;
+ TimeSource = 0;
+ TimeTransponder = 0;
+@@ -370,6 +373,49 @@
+ return true;
+ }
+
++void cSetup::StoreSourceCaps(const char *Name)
++{
++ cSetupLine *l;
++ while ((l = Get(Name)) != NULL)
++ Del(l);
++
++ for (int i = 0; i < MAXDEVICES; i++) {
++ char buffer[MAXSOURCECAPS*8]={0,}, *q = buffer;
++ int j = 0;
++ while (SourceCaps[i][j] && j < MAXSOURCECAPS) {
++ if (j==0)
++ q += snprintf(buffer, sizeof(buffer), "%i ", i+1);
++ q += snprintf(q, sizeof(buffer) - (q-buffer), "%s ", *cSource::ToString(SourceCaps[i][j++]));
++ }
++ if (*buffer)
++ Store(Name, buffer, NULL, true);
++ }
++}
++
++bool cSetup::ParseSourceCaps(const char *Value)
++{
++ char *p;
++ int d = strtol(Value, &p, 10)-1, i = 0;
++ while (p < Value+strlen(Value)) {
++ if (*p==0) return true;
++ if (isblank(*p)) ++p;
++ if (isalpha(*p)) {
++ int source = cSource::FromString(p);
++ if (source != cSource::stNone) {
++ SourceCaps[d][i++] = source;
++ SourceCapsSet = true;
++ }
++ else
++ return false;
++ while (!isblank(*p) && *p)
++ ++p;
++ if (i>MAXSOURCECAPS)
++ return false;
++ }
++ }
++ return true;
++}
++
+ bool cSetup::Parse(const char *Name, const char *Value)
+ {
+ if (!strcasecmp(Name, "OSDLanguage")) OSDLanguage = atoi(Value);
+@@ -388,6 +434,7 @@
+ else if (!strcasecmp(Name, "LnbFrequLo")) LnbFrequLo = atoi(Value);
+ else if (!strcasecmp(Name, "LnbFrequHi")) LnbFrequHi = atoi(Value);
+ else if (!strcasecmp(Name, "DiSEqC")) DiSEqC = atoi(Value);
++ else if (!strcasecmp(Name, "SourceCaps")) return ParseSourceCaps(Value);
+ else if (!strcasecmp(Name, "SetSystemTime")) SetSystemTime = atoi(Value);
+ else if (!strcasecmp(Name, "TimeSource")) TimeSource = cSource::FromString(Value);
+ else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value);
+@@ -455,6 +502,7 @@
+ Store("LnbFrequLo", LnbFrequLo);
+ Store("LnbFrequHi", LnbFrequHi);
+ Store("DiSEqC", DiSEqC);
++ if (SourceCapsSet) StoreSourceCaps("SourceCaps");
+ Store("SetSystemTime", SetSystemTime);
+ Store("TimeSource", cSource::ToString(TimeSource));
+ Store("TimeTransponder", TimeTransponder);
+diff -rNu vdr-1.3.39/config.h vdr-1.3.39+SourceCaps/config.h
+--- vdr-1.3.39/config.h 2006-01-13 16:17:19.000000000 +0100
++++ vdr-1.3.39+SourceCaps/config.h 2006-01-21 13:50:24.440468072 +0100
+@@ -30,6 +30,9 @@
+ #define MINOSDHEIGHT 324
+ #define MAXOSDHEIGHT 567
+
++#define MAXDEVICES 16 // the maximum number of devices in the system
++#define MAXSOURCECAPS 128 // the maximum number of different sources per device
++
+ #define MaxFileName 256
+ #define MaxSkinName 16
+ #define MaxThemeName 16
+@@ -179,6 +182,8 @@
+ void StoreLanguages(const char *Name, int *Values);
+ bool ParseLanguages(const char *Value, int *Values);
+ bool Parse(const char *Name, const char *Value);
++ void StoreSourceCaps(const char *Name);
++ bool ParseSourceCaps(const char *Value);
+ cSetupLine *Get(const char *Name, const char *Plugin = NULL);
+ void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false);
+ void Store(const char *Name, int Value, const char *Plugin = NULL);
+@@ -201,6 +206,8 @@
+ int LnbFrequLo;
+ int LnbFrequHi;
+ int DiSEqC;
++ int SourceCaps[MAXDEVICES][MAXSOURCECAPS];
++ bool SourceCapsSet;
+ int SetSystemTime;
+ int TimeSource;
+ int TimeTransponder;
+diff -rNu vdr-1.3.39/device.c vdr-1.3.39+SourceCaps/device.c
+--- vdr-1.3.39/device.c 2006-01-08 12:39:37.000000000 +0100
++++ vdr-1.3.39+SourceCaps/device.c 2006-01-21 13:50:24.441467920 +0100
+@@ -174,8 +174,10 @@
+ for (int i = 0; i < MAXRECEIVERS; i++)
+ receiver[i] = NULL;
+
+- if (numDevices < MAXDEVICES)
++ if (numDevices < MAXDEVICES) {
+ device[numDevices++] = this;
++ SetSourceCaps(cardIndex);
++ }
+ else
+ esyslog("ERROR: too many devices!");
+ }
+@@ -313,6 +315,17 @@
+ return d;
+ }
+
++void cDevice::SetSourceCaps(int Index)
++{
++ for (int d = 0; d < numDevices; d++) {
++ if (Index < 0 || Index == device[d]->CardIndex()) {
++ for (int i = 0; i < MAXSOURCECAPS; i++)
++ device[d]->sourceCaps[i] = Setup.SourceCaps[device[d]->CardIndex()][i];
++ }
++ }
++}
++
++
+ void cDevice::Shutdown(void)
+ {
+ primaryDevice = NULL;
+diff -rNu vdr-1.3.39/device.h vdr-1.3.39+SourceCaps/device.h
+--- vdr-1.3.39/device.h 2006-01-08 11:10:26.000000000 +0100
++++ vdr-1.3.39+SourceCaps/device.h 2006-01-21 13:50:24.443467616 +0100
+@@ -23,7 +23,6 @@
+ #include "thread.h"
+ #include "tools.h"
+
+-#define MAXDEVICES 16 // the maximum number of devices in the system
+ #define MAXPIDHANDLES 64 // the maximum number of different PIDs per device
+ #define MAXRECEIVERS 16 // the maximum number of receivers per device
+ #define MAXVOLUME 255
+@@ -133,6 +132,8 @@
+ ///< given Priority.
+ ///< See ProvidesChannel() for more information on how
+ ///< priorities are handled, and the meaning of NeedsDetachReceivers.
++ static void SetSourceCaps(int Index = -1);
++ ///< Sets the SourceCaps of the given device according to the Setup data.
+ static void Shutdown(void);
+ ///< Closes down all devices.
+ ///< Must be called at the end of the program.
+@@ -140,6 +141,7 @@
+ static int nextCardIndex;
+ int cardIndex;
+ protected:
++ int sourceCaps[MAXSOURCECAPS];
+ cDevice(void);
+ virtual ~cDevice();
+ virtual bool Ready(void);
+diff -rNu vdr-1.3.39/dvbdevice.c vdr-1.3.39+SourceCaps/dvbdevice.c
+--- vdr-1.3.39/dvbdevice.c 2006-01-14 16:57:36.000000000 +0100
++++ vdr-1.3.39+SourceCaps/dvbdevice.c 2006-01-21 13:50:24.444467464 +0100
+@@ -751,10 +751,17 @@
+ bool cDvbDevice::ProvidesSource(int Source) const
+ {
+ int type = Source & cSource::st_Mask;
+- return type == cSource::stNone
+- || type == cSource::stCable && frontendType == FE_QAM
+- || type == cSource::stSat && frontendType == FE_QPSK
+- || type == cSource::stTerr && frontendType == FE_OFDM;
++ if (Setup.SourceCapsSet && type == cSource::stSat && frontendType == FE_QPSK) {
++ for (int i = 0; i < MAXSOURCECAPS; i++)
++ if (sourceCaps[i] == Source)
++ return true;
++ return false;
++ }
++ else
++ return type == cSource::stNone
++ || type == cSource::stCable && frontendType == FE_QAM
++ || type == cSource::stSat && frontendType == FE_QPSK
++ || type == cSource::stTerr && frontendType == FE_OFDM;
+ }
+
+ bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
+diff -rNu vdr-1.3.39/sources.c vdr-1.3.39+SourceCaps/sources.c
+--- vdr-1.3.39/sources.c 2004-12-26 12:58:52.000000000 +0100
++++ vdr-1.3.39+SourceCaps/sources.c 2006-01-21 13:50:24.445467312 +0100
+@@ -68,7 +68,7 @@
+ int pos = 0;
+ bool dot = false;
+ bool neg = false;
+- while (*++s) {
++ while (*++s && !isblank(*s)) {
+ switch (toupper(*s)) {
+ case '0' ... '9': pos *= 10;
+ pos += *s - '0';
Added: vdr/vdr/trunk/debian/patches/opt-48_pin.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-48_pin.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-48_pin.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,399 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-48_pin.dpatch by Jörg Wendel (Horchi)
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch for the PIN plugin from version 0.1.5a of the Plugin
+## (vdr-1.4.3.diff-01)
+
+ at DPATCH@
+diff -urNad vdr-1.4.5~/device.c vdr-1.4.5/device.c
+--- vdr-1.4.5~/device.c 2007-01-07 18:17:18.000000000 +0100
++++ vdr-1.4.5/device.c 2007-01-07 18:17:22.000000000 +0100
+@@ -594,8 +594,10 @@
+ int n = CurrentChannel() + Direction;
+ int first = n;
+ cChannel *channel;
+- while ((channel = Channels.GetByNumber(n, Direction)) != NULL) {
++ while ((channel = Channels.GetByNumber(n, Direction)) != NULL)
++ {
+ // try only channels which are currently available
++ if (cStatus::MsgChannelProtected(0, channel) == false) // PIN PATCH
+ if (PrimaryDevice()->ProvidesChannel(channel, Setup.PrimaryLimit) || PrimaryDevice()->CanReplay() && GetDevice(channel, 0))
+ break;
+ n = channel->Number() + Direction;
+@@ -617,6 +619,11 @@
+
+ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
+ {
++ // I hope 'LiveView = false' indicates a channel switch for recording, // PIN PATCH
++ // I really don't know, but it works ... // PIN PATCH
++ if (LiveView && cStatus::MsgChannelProtected(this, Channel) == true) // PIN PATCH
++ return scrNotAvailable; // PIN PATCH
++
+ if (LiveView)
+ StopReplay();
+
+diff -urNad vdr-1.4.5~/i18n.c vdr-1.4.5/i18n.c
+--- vdr-1.4.5~/i18n.c 2007-01-07 18:17:18.000000000 +0100
++++ vdr-1.4.5/i18n.c 2007-01-07 18:17:22.000000000 +0100
+@@ -7101,6 +7101,27 @@
+ "", // Dansk / Danish
+ "", // Èesky / Czech
+ },
++ { "Childlock", // PIN PATCH
++ "Kindersicherung",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "Adulte",
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ "",//TODO
++ },
+ { NULL }
+ };
+
+diff -urNad vdr-1.4.5~/menu.c vdr-1.4.5/menu.c
+--- vdr-1.4.5~/menu.c 2007-01-07 18:17:18.000000000 +0100
++++ vdr-1.4.5/menu.c 2007-01-07 18:19:12.000000000 +0100
+@@ -722,6 +722,16 @@
+ Add(new cMenuEditBitItem( tr("VPS"), &data.flags, tfVps));
+ Add(new cMenuEditIntItem( tr("Priority"), &data.priority, 0, MAXPRIORITY));
+ Add(new cMenuEditIntItem( tr("Lifetime"), &data.lifetime, 0, MAXLIFETIME));
++
++ // PIN PATCH
++ if (cOsd::pinValid || !data.fskProtection) Add(new cMenuEditBoolItem(tr("Child protection"),&data.fskProtection));
++ else {
++ char* buf = 0;
++ asprintf(&buf, "%s\t%s", tr("Child protection"), data.fskProtection ? tr("yes") : tr("no"));
++ Add(new cOsdItem(buf));
++ free(buf);
++ }
++
+ char* p = strrchr(data.file, '~');
+ if (p) {
+ p++;
+@@ -2342,6 +2352,9 @@
+ {
+ cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
+ if (ri) {
++ if (cStatus::MsgReplayProtected(GetRecording(ri), ri->Name(), base,
++ ri->IsDirectory()) == true) // PIN PATCH
++ return osContinue; // PIN PATCH
+ if (ri->IsDirectory())
+ Open();
+ else {
+@@ -3546,6 +3559,7 @@
+ if (item) {
+ cPlugin *p = cPluginManager::GetPlugin(item->PluginIndex());
+ if (p) {
++ if (!cStatus::MsgPluginProtected(p)) { // PIN PATCH
+ cOsdObject *menu = p->MainMenuAction();
+ if (menu) {
+ if (menu->IsMenu())
+@@ -3557,6 +3571,7 @@
+ }
+ }
+ }
++ }
+ state = osEnd;
+ }
+ break;
+@@ -3720,6 +3735,7 @@
+ if (Direction) {
+ while (Channel) {
+ Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel);
++ if (cStatus::MsgChannelProtected(0, Channel) == false) // PIN PATCH
+ if (Channel && !Channel->GroupSep() && (cDevice::PrimaryDevice()->ProvidesChannel(Channel, Setup.PrimaryLimit) || cDevice::GetDevice(Channel, 0)))
+ return Channel;
+ }
+@@ -4260,6 +4276,7 @@
+ for (int i = 0; i < MAXRECORDCONTROLS; i++) {
+ if (!RecordControls[i]) {
+ RecordControls[i] = new cRecordControl(device, Timer, Pause);
++ cStatus::MsgRecordingFile(RecordControls[i]->FileName()); // PIN PATCH
+ return RecordControls[i]->Process(time(NULL));
+ }
+ }
+diff -urNad vdr-1.4.5~/osd.c vdr-1.4.5/osd.c
+--- vdr-1.4.5~/osd.c 2007-01-07 18:17:18.000000000 +0100
++++ vdr-1.4.5/osd.c 2007-01-07 18:18:11.000000000 +0100
+@@ -597,6 +597,7 @@
+
+ int cOsd::isOpen = 0;
+ bool cOsd::niosd = false;
++bool cOsd::pinValid = false; // PIN PATCH
+
+ cOsd::cOsd(int Left, int Top)
+ {
+diff -urNad vdr-1.4.5~/osd.h vdr-1.4.5/osd.h
+--- vdr-1.4.5~/osd.h 2007-01-07 18:17:18.000000000 +0100
++++ vdr-1.4.5/osd.h 2007-01-07 18:17:49.000000000 +0100
+@@ -327,6 +327,7 @@
+ virtual void Flush(void);
+ ///< Actually commits all data to the OSD hardware.
+ tArea vidWin;
++ static bool pinValid; // PIN PATCH
+ };
+
+ class cOsdProvider {
+diff -urNad vdr-1.4.5~/status.c vdr-1.4.5/status.c
+--- vdr-1.4.5~/status.c 2005-12-31 16:10:10.000000000 +0100
++++ vdr-1.4.5/status.c 2007-01-07 18:17:22.000000000 +0100
+@@ -112,3 +112,49 @@
+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
+ sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, FollowingTime, FollowingTitle, FollowingSubtitle);
+ }
++
++bool cStatus::MsgChannelProtected(const cDevice* Device, const cChannel* Channel) // PIN PATCH
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ if (sm->ChannelProtected(Device, Channel) == true)
++ return true;
++
++ return false;
++}
++
++bool cStatus::MsgReplayProtected(const cRecording* Recording, const char* Name,
++ const char* Base, bool isDirectory) // PIN PATCH
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ if (sm->ReplayProtected(Recording, Name, Base, isDirectory) == true)
++ return true;
++
++ return false;
++}
++
++void cStatus::MsgRecordingFile(const char* FileName)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) // PIN PATCH
++ sm->RecordingFile(FileName);
++}
++
++void cStatus::MsgTimerCreation(cTimer* Timer, const cEvent *Event)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) // PIN PATCH
++ sm->TimerCreation(Timer, Event);
++}
++
++bool cStatus::MsgPluginProtected(cPlugin* Plugin) // PIN PATCH
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ if (sm->PluginProtected(Plugin) == true)
++ return true;
++
++ return false;
++}
++
++void cStatus::MsgUserAction(const eKeys key, const cOsdObject* Interact) // PIN PATCH
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->UserAction(key, Interact);
++}
+diff -urNad vdr-1.4.5~/status.h vdr-1.4.5/status.h
+--- vdr-1.4.5~/status.h 2005-12-31 16:15:25.000000000 +0100
++++ vdr-1.4.5/status.h 2007-01-07 18:17:22.000000000 +0100
+@@ -14,6 +14,7 @@
+ #include "device.h"
+ #include "player.h"
+ #include "tools.h"
++#include "plugin.h"
+
+ class cStatus : public cListObject {
+ private:
+@@ -67,6 +68,22 @@
+ // The OSD displays the single line Text with the current channel information.
+ virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) {}
+ // The OSD displays the given programme information.
++ virtual bool ChannelProtected(const cDevice *Device, const cChannel* Channel) { return false; } // PIN PATCH
++ // Checks if a channel is protected.
++ virtual bool ReplayProtected(const cRecording* Recording, const char* Name,
++ const char* Base, bool isDirectory) { return false; } // PIN PATCH
++ // Checks if a recording is protected.
++ virtual void RecordingFile(const char* FileName) {} // PIN PATCH
++ // The given DVB device has started recording to FileName. FileName is the name of the
++ // recording directory
++ virtual void TimerCreation(cTimer* Timer, const cEvent *Event) {} // PIN PATCH
++ // The given timer is created
++ virtual bool PluginProtected(cPlugin* Plugin) { return false; } // PIN PATCH
++ // Checks if a plugin is protected.
++ virtual void UserAction(const eKeys key, const cOsdObject* Interact) {} // PIN PATCH
++ // report user action
++
++
+ public:
+ cStatus(void);
+ virtual ~cStatus();
+@@ -86,6 +103,13 @@
+ static void MsgOsdTextItem(const char *Text, bool Scroll = false);
+ static void MsgOsdChannel(const char *Text);
+ static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
++ static bool MsgChannelProtected(const cDevice* Device, const cChannel* Channel); // PIN PATCH
++ static bool MsgReplayProtected(const cRecording* Recording, const char* Name,
++ const char* Base, bool isDirectory); // PIN PATCH
++ static void MsgRecordingFile(const char* FileName); // PIN PATCH
++ static void MsgTimerCreation(cTimer* Timer, const cEvent *Event); // PIN PATCH
++ static bool MsgPluginProtected(cPlugin* Plugin); // PIN PATCH
++ static void MsgUserAction(const eKeys key, const cOsdObject* Interact); // PIN PATCH
+ };
+
+ #endif //__STATUS_H
+diff -urNad vdr-1.4.5~/timers.c vdr-1.4.5/timers.c
+--- vdr-1.4.5~/timers.c 2006-09-15 16:15:53.000000000 +0200
++++ vdr-1.4.5/timers.c 2007-01-07 18:17:22.000000000 +0100
+@@ -14,6 +14,7 @@
+ #include "i18n.h"
+ #include "libsi/si.h"
+ #include "remote.h"
++#include "status.h" // PIN PATCH
+
+ // IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
+ // format characters in order to allow any number of blanks after a numeric
+@@ -42,6 +43,7 @@
+ stop -= 2400;
+ priority = Pause ? Setup.PausePriority : Setup.DefaultPriority;
+ lifetime = Pause ? Setup.PauseLifetime : Setup.DefaultLifetime;
++ fskProtection = 0; // PIN PATCH
+ *file = 0;
+ aux = NULL;
+ event = NULL;
+@@ -75,12 +77,14 @@
+ stop -= 2400;
+ priority = Setup.DefaultPriority;
+ lifetime = Setup.DefaultLifetime;
++ fskProtection = 0; // PIN PATCH
+ *file = 0;
+ const char *Title = Event->Title();
+ if (!isempty(Title))
+ strn0cpy(file, Event->Title(), sizeof(file));
+ aux = NULL;
+ event = NULL; // let SetEvent() be called to get a log message
++ cStatus::MsgTimerCreation(this, Event); // PIN PATCH
+ }
+
+ cTimer::cTimer(const cTimer &Timer)
+@@ -113,6 +117,7 @@
+ stop = Timer.stop;
+ priority = Timer.priority;
+ lifetime = Timer.lifetime;
++ fskProtection = Timer.fskProtection; // PIN PATCH
+ strncpy(file, Timer.file, sizeof(file));
+ free(aux);
+ aux = Timer.aux ? strdup(Timer.aux) : NULL;
+@@ -288,6 +293,7 @@
+ result = false;
+ }
+ }
++ fskProtection = aux && strstr(aux, "<pin-plugin><protected>yes</protected></pin-plugin>"); // PIN PATCH
+ free(channelbuffer);
+ free(daybuffer);
+ free(filebuffer);
+@@ -597,6 +603,33 @@
+ Matches(); // refresh start and end time
+ }
+
++void cTimer::SetFskProtection(int aFlag) // PIN PATCH
++{
++ char* p;
++ char* tmp = 0;
++
++ fskProtection = aFlag;
++
++ if (fskProtection && (!aux || !strstr(aux, "<pin-plugin><protected>yes</protected></pin-plugin>")))
++ {
++ // add protection info to aux
++
++ if (aux) { tmp = strdup(aux); free(aux); }
++ asprintf(&aux,"%s<pin-plugin><protected>yes</protected></pin-plugin>", tmp ? tmp : "");
++ }
++ else if (!fskProtection && aux && (p = strstr(aux, "<pin-plugin><protected>yes</protected></pin-plugin>")))
++ {
++ // remove protection info to aux
++
++ asprintf(&tmp, "%.*s%s", p-aux, aux, p+strlen("<pin-plugin><protected>yes</protected></pin-plugin>"));
++ free(aux);
++ aux = strdup(tmp);
++ }
++
++ if (tmp)
++ free(tmp);
++}
++
+ // -- cTimers ----------------------------------------------------------------
+
+ cTimers Timers;
+diff -urNad vdr-1.4.5~/timers.h vdr-1.4.5/timers.h
+--- vdr-1.4.5~/timers.h 2006-09-04 19:07:39.000000000 +0200
++++ vdr-1.4.5/timers.h 2007-01-07 18:17:22.000000000 +0100
+@@ -37,6 +37,7 @@
+ int start;
+ int stop;
+ int priority;
++ int fskProtection; // PIN PATCH
+ int lifetime;
+ char file[MaxFileName];
+ char *aux;
+@@ -58,6 +59,7 @@
+ int Start(void) const { return start; }
+ int Stop(void) const { return stop; }
+ int Priority(void) const { return priority; }
++ int FskProtection(void) const { return fskProtection; } // PIN PATCH
+ int Lifetime(void) const { return lifetime; }
+ const char *File(void) const { return file; }
+ time_t FirstDay(void) const { return weekdays ? day : 0; }
+@@ -86,6 +88,7 @@
+ void SetInVpsMargin(bool InVpsMargin);
+ void SetPriority(int Priority);
+ void SetFlags(uint Flags);
++ void SetFskProtection(int aFlag); // PIN PATCH
+ void ClrFlags(uint Flags);
+ void InvFlags(uint Flags);
+ bool HasFlags(uint Flags) const;
+diff -urNad vdr-1.4.5~/vdr.c vdr-1.4.5/vdr.c
+--- vdr-1.4.5~/vdr.c 2007-01-07 18:17:18.000000000 +0100
++++ vdr-1.4.5/vdr.c 2007-01-07 18:19:59.000000000 +0100
+@@ -875,6 +875,7 @@
+ cOsdObject *Interact = Menu ? Menu : cControl::Control();
+ eKeys key = Interface->GetKey((!Interact || !Interact->NeedsFastResponse()) && time(NULL) - LastCamMenu > LASTCAMMENUTIMEOUT);
+ if (NORMALKEY(key) != kNone) {
++ cStatus::MsgUserAction(key, Interact); // PIN PATCH
+ EITScanner.Activity();
+ LastActivity = time(NULL);
+ }
+@@ -940,10 +941,12 @@
+ cControl::Control()->Hide();
+ cPlugin *plugin = cPluginManager::GetPlugin(PluginName);
+ if (plugin) {
++ if (!cStatus::MsgPluginProtected(plugin)) { // PIN PATCH
+ Menu = plugin->MainMenuAction();
+ if (Menu)
+ Menu->Show();
+ }
++ }
+ else
+ esyslog("ERROR: unknown plugin '%s'", PluginName);
+ }
+@@ -1147,9 +1150,12 @@
+ // Instant resume of the last viewed recording:
+ case kPlay:
+ if (cReplayControl::LastReplayed()) {
++ // PIN BUGFIX
++ if (cStatus::MsgReplayProtected(0, cReplayControl::LastReplayed(), 0, false) == false) {
+ cControl::Shutdown();
+ cControl::Launch(new cReplayControl);
+ }
++ }
+ break;
+ default: break;
+ }
Property changes on: vdr/vdr/trunk/debian/patches/opt-48_pin.dpatch
___________________________________________________________________
Name: svn:executable
+ *
Added: vdr/vdr/trunk/debian/patches/opt-49_sharelnb.dpatch
===================================================================
--- vdr/vdr/trunk/debian/patches/opt-49_sharelnb.dpatch 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/opt-49_sharelnb.dpatch 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,605 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## opt-31_sharelnb.dpatch by Matthias Lötzke <Matthias at Loetzke.de>
+## http://www.xn--ltzke-jua.de/dvb/VDR_LNB_sharing_patch/configurableLNBshare-VDR_1.4.3.patch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch to share one sat connection for several cards.
+
+ at DPATCH@
+diff -urNad vdr-1.4.4~/config.c vdr-1.4.4/config.c
+--- vdr-1.4.4~/config.c 2006-11-04 19:42:37.000000000 +0100
++++ vdr-1.4.4/config.c 2006-11-04 19:42:37.000000000 +0100
+@@ -324,6 +324,12 @@
+ CurrentDolby = 0;
+ InitialChannel = 0;
+ InitialVolume = -1;
++
++//ML
++ VerboseLNBlog = 0;
++ for (int i = 0; i < MAXDEVICES; i++) CardUsesLNBnr[i] = i + 1;
++//ML-Ende
++
+ ShowRecDate = 1;
+ ShowRecTime = 1;
+ ShowRecLength = 0;
+@@ -559,7 +565,23 @@
+ else if (!strcasecmp(Name, "DvdTrayMode")) DvdTrayMode = atoi(Value);
+ else if (!strcasecmp(Name, "DvdSpeedLimit")) DvdSpeedLimit = atoi(Value);
+ else
+- return false;
++
++//ML
++ if (!strcasecmp(Name, "VerboseLNBlog")) VerboseLNBlog = atoi(Value);
++ else {
++ char tmp[20];
++ bool result = false;
++ for (int i = 1; i <= MAXDEVICES; i++) {
++ sprintf(tmp, "Card%dusesLNBnr", i);
++ if (!strcasecmp(Name, tmp)) {
++ CardUsesLNBnr[i - 1] = atoi(Value);
++ result = true;
++ }
++ }
++ return result;
++ }
++//ML-Ende
++
+ return true;
+ }
+
+@@ -648,6 +670,17 @@
+ Store("DvdTrayMode", DvdTrayMode);
+ Store("DvdSpeedLimit", DvdSpeedLimit);
+
++//ML
++ Store("VerboseLNBlog", VerboseLNBlog);
++ char tmp[20];
++ if (cDevice::NumDevices() > 1) {
++ for (int i = 1; i <= cDevice::NumDevices(); i++) {
++ sprintf(tmp, "Card%dusesLNBnr", i);
++ Store(tmp, CardUsesLNBnr[i - 1]);
++ }
++ }
++//ML-Ende
++
+ Sort();
+
+ if (cConfig<cSetupLine>::Save()) {
+diff -urNad vdr-1.4.4~/config.h vdr-1.4.4/config.h
+--- vdr-1.4.4~/config.h 2006-11-04 19:42:37.000000000 +0100
++++ vdr-1.4.4/config.h 2006-11-04 19:42:37.000000000 +0100
+@@ -294,6 +294,15 @@
+ int DvdSpeedLimit;
+ int InitialChannel;
+ int InitialVolume;
++
++//ML
++ int VerboseLNBlog;
++ #define MAXDEVICES 16 // Since VDR 1.3.32 we can not #include "device.h" for MAXDEVICES anymore.
++ // With this workaround a warning will be shown during compilation if
++ // MAXDEVICES changes in device.h.
++ int CardUsesLNBnr[MAXDEVICES];
++//ML-Ende
++
+ int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition;
+ int __EndData__;
+ cSetup(void);
+diff -urNad vdr-1.4.4~/device.c vdr-1.4.4/device.c
+--- vdr-1.4.4~/device.c 2006-11-04 19:42:37.000000000 +0100
++++ vdr-1.4.4/device.c 2006-11-04 19:42:37.000000000 +0100
+@@ -19,6 +19,10 @@
+ #include "status.h"
+ #include "transfer.h"
+
++//ML
++#include "diseqc.h"
++//ML-Ende
++
+ // --- cPesAssembler ---------------------------------------------------------
+
+ class cPesAssembler {
+@@ -155,6 +159,12 @@
+
+ SetVideoFormat(Setup.VideoFormat);
+
++//ML
++ LNBstate = -1;
++ LNBnr = Setup.CardUsesLNBnr[cardIndex];
++ LNBsource = NULL;
++//ML-Ende
++
+ mute = false;
+ volume = Setup.CurrentVolume;
+
+@@ -216,6 +226,16 @@
+ useDevice |= (1 << n);
+ }
+
++//ML
++void cDevice::SetLNBnr(void)
++{
++ for (int i = 0; i < numDevices; i++) {
++ device[i]->LNBnr = Setup.CardUsesLNBnr[i];
++ isyslog("LNB-sharing: setting device %d to use LNB %d", i, device[i]->LNBnr);
++ }
++}
++//ML-Ende
++
+ int cDevice::NextCardIndex(int n)
+ {
+ if (n > 0) {
+@@ -275,6 +295,98 @@
+ return d;
+ }
+
++//ML
++cDevice *cDevice::GetBadDevice(const cChannel *Channel)
++{
++ if(!cSource::IsSat(Channel->Source())) return NULL;
++ if (Setup.DiSEqC) {
++ cDiseqc *diseqc;
++ diseqc = Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization());
++
++ for (int i = 0; i < numDevices; i++) {
++ if (this != device[i] && device[i]->GetLNBnr() == LNBnr && device[i]->GetLNBsource() != (int*) diseqc) {
++ if (Setup.VerboseLNBlog) {
++ isyslog("LNB %d: Device check for channel %d on device %d. LNB or DiSEq conflict with device %d", LNBnr, Channel->Number(), this->DeviceNumber(), i);
++ }
++ return device[i];
++ }
++ }
++ if (Setup.VerboseLNBlog) {
++ isyslog("LNB %d: Device check for for channel %d on device %d. OK", LNBnr, Channel->Number(), this->DeviceNumber());
++ }
++ } else {
++ char requiredState;
++ if (Channel->Frequency() >= Setup.LnbSLOF) {
++ requiredState = 1 ;
++ } else {
++ requiredState = 0;
++ }
++ if (Channel->Polarization() == 'v' || Channel->Polarization() == 'V') requiredState += 2;
++
++ for (int i = 0; i < numDevices; i++) {
++ if (this != device[i] && device[i]->GetLNBnr() == LNBnr && device[i]->GetLNBconf() != requiredState) {
++ if (Setup.VerboseLNBlog) {
++ isyslog("LNB %d: Device check for channel %d, LNBstate %d on device %d, current LNBstate %d. Conflict with device %d, LNBstate %d", LNBnr, Channel->Number(), requiredState, this->DeviceNumber(), LNBstate, i, device[i]->GetLNBconf());
++ }
++ return device[i];
++ }
++ }
++ if (Setup.VerboseLNBlog) {
++ isyslog("LNB %d: Device check for channel %d, LNBstate %d on device %d, current LNBstate %d. No other devices affected", LNBnr, Channel->Number(), requiredState, this->DeviceNumber(), LNBstate);
++ }
++ }
++ return NULL;
++}
++
++int cDevice::GetMaxBadPriority(const cChannel *Channel)
++{
++ if(!cSource::IsSat(Channel->Source())) return -2;
++ bool PrimaryIsBad = false;
++ int maxBadPriority = -2;
++ if (Setup.DiSEqC) {
++ cDiseqc *diseqc;
++ diseqc = Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization());
++
++ for (int i = 0; i < numDevices; i++) {
++ if (this != device[i] && device[i]->GetLNBnr() == LNBnr && device[i]->GetLNBsource() != (int*) diseqc) {
++ if (device[i]->Receiving() && device[i]->Priority() > maxBadPriority) {
++ maxBadPriority = device[i]->Priority();
++ }
++ if (device[i]->IsPrimaryDevice()) {
++ PrimaryIsBad = true;
++ }
++ }
++ }
++ } else {
++ char requiredState;
++ if (Channel->Frequency() >= Setup.LnbSLOF) {
++ requiredState = 1 ;
++ } else {
++ requiredState = 0;
++ }
++ if (Channel->Polarization() == 'v' || Channel->Polarization() == 'V') requiredState += 2;
++
++ for (int i = 0; i < numDevices; i++) {
++ if (this != device[i] && device[i]->GetLNBnr() == LNBnr && device[i]->GetLNBconf() != requiredState) {
++ if (device[i]->Receiving() && device[i]->Priority() > maxBadPriority) {
++ maxBadPriority = device[i]->Priority();
++ }
++ if (device[i]->IsPrimaryDevice()) {
++ PrimaryIsBad = true;
++ }
++ }
++ }
++ }
++ if (PrimaryIsBad && maxBadPriority == -2) {
++ maxBadPriority = -1;
++ }
++ if (Setup.VerboseLNBlog) {
++ isyslog("LNB %d: Request for channel %d on device %d. MaxBadPriority is %d", LNBnr, Channel->Number(), this->DeviceNumber(), maxBadPriority);
++ }
++ return maxBadPriority;
++}
++//ML-Ende
++
+ cDevice *cDevice::GetDevice(int Index)
+ {
+ return (0 <= Index && Index < numDevices) ? device[Index] : NULL;
+@@ -284,6 +396,12 @@
+ {
+ cDevice *d = NULL;
+ uint Impact = 0xFFFFFFFF; // we're looking for a device with the least impact
++
++//ML
++ int badPriority;
++ uint imp2;
++//ML-Ende
++
+ for (int i = 0; i < numDevices; i++) {
+ bool ndr;
+ if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job
+@@ -301,7 +419,30 @@
+ imp <<= 8; imp |= min(max(device[i]->ProvidesCa(Channel), 0), 0xFF); // use the device that provides the lowest number of conditional access methods
+ imp <<= 1; imp |= device[i]->IsPrimaryDevice(); // avoid the primary device
+ imp <<= 1; imp |= device[i]->HasDecoder(); // avoid full featured cards
+- if (imp < Impact) {
++
++//ML
++ badPriority = device[i]->GetMaxBadPriority(Channel);
++ if (badPriority >= Priority || (badPriority == -1 && Priority < Setup.PrimaryLimit)) {
++ // channel is not available for the requested prioity
++ imp = 0xFFFFFFFF;
++ } else {
++ switch (badPriority) {
++ case -2: // not affected by LNB-sharing
++ imp2 = 0;
++ break;
++ case -1: // the primary device would need a channel switch
++ imp += 1 << 17;
++ imp2 = 0xFFFFFFFF | 1 << 17;
++ break;
++ default: // a device receiving with lower priority would need to be stopped
++ imp += badPriority << 8;
++ imp2 = 0xFFFFFFFF | badPriority << 8;
++ break;
++ }
++ }
++ if (imp < Impact && imp2 < Impact) {
++//ML-Ende
++
+ // This device has less impact than any previous one, so we take it.
+ Impact = imp;
+ d = device[i];
+@@ -547,7 +688,11 @@
+ bool cDevice::ProvidesTransponderExclusively(const cChannel *Channel) const
+ {
+ for (int i = 0; i < numDevices; i++) {
+- if (device[i] && device[i] != this && device[i]->ProvidesTransponder(Channel))
++
++//ML
++ if (device[i] && device[i] != this && device[i]->ProvidesTransponder(Channel) && device[i]->GetLNBnr() != LNBnr)
++//ML-Ende
++
+ return false;
+ }
+ return true;
+@@ -570,6 +715,26 @@
+
+ bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
+ {
++
++//ML
++ cDevice *tmpDevice;
++ if (this->GetMaxBadPriority(Channel) >= 0) {
++ Skins.Message(mtInfo, tr("Channel locked by LNB!"));
++ return false;
++ }
++ while ((tmpDevice = GetBadDevice(Channel)) != NULL) {
++ if (tmpDevice->IsPrimaryDevice() && LiveView)
++ tmpDevice->SwitchChannelForced(Channel, true);
++ else
++ tmpDevice->SwitchChannelForced(Channel, false);
++ }
++ return SwitchChannelForced(Channel, LiveView);
++}
++
++bool cDevice::SwitchChannelForced(const cChannel *Channel, bool LiveView)
++//ML-Ende
++
++{
+ if (LiveView)
+ isyslog("switching to channel %d", Channel->Number());
+ for (int i = 3; i--;) {
+@@ -598,10 +763,13 @@
+ {
+ // try only channels which are currently available
+ if (cStatus::MsgChannelProtected(0, channel) == false) // PIN PATCH
+- if (PrimaryDevice()->ProvidesChannel(channel, Setup.PrimaryLimit) || PrimaryDevice()->CanReplay() && GetDevice(channel, 0))
+- break;
+- n = channel->Number() + Direction;
+- }
++
++//ML
++ if (PrimaryDevice()->GetMaxBadPriority(channel) < 0 && (PrimaryDevice()->ProvidesChannel(channel, Setup.PrimaryLimit) || PrimaryDevice()->CanReplay() && GetDevice(channel, 0)))
++//ML-Ende
++
++ n = channel->Number() + Direction;
++ }
+ if (channel) {
+ int d = n - first;
+ if (abs(d) == 1)
+@@ -638,12 +806,40 @@
+
+ eSetChannelResult Result = scrOk;
+
++//ML
++ char requiredState;
++ if (Channel->Frequency() >= Setup.LnbSLOF) {
++ requiredState = 1;
++ } else {
++ requiredState = 0;
++ }
++ if (Channel->Polarization() == 'v' || Channel->Polarization() == 'V') requiredState += 2;
++ if (Setup.VerboseLNBlog) {
++ isyslog("LNB %d: Switching device %d to channel %d", LNBnr, this->DeviceNumber(), Channel->Number());
++ }
++//ML-Ende
++
+ // If this DVB card can't receive this channel, let's see if we can
+ // use the card that actually can receive it and transfer data from there:
+
+ if (NeedsTransferMode) {
+ cDevice *CaDevice = GetDevice(Channel, 0, &NeedsDetachReceivers);
+ if (CaDevice && CanReplay()) {
++
++//ML
++ if (CaDevice->GetLNBnr() == LNBnr) {
++ if (LNBstate != requiredState || (Setup.DiSEqC && LNBsource != (int*) Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization())) ) {
++ if (IsPrimaryDevice()) {
++ SetChannelDevice(Channel, true);
++ } else {
++ SetChannelDevice(Channel, false);
++ }
++ LNBstate = requiredState;
++ LNBsource = (int*) Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization());
++ }
++ }
++//ML-Ende
++
+ cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
+ if (CaDevice->SetChannel(Channel, false) == scrOk) { // calling SetChannel() directly, not SwitchChannel()!
+ if (NeedsDetachReceivers)
+@@ -664,6 +860,12 @@
+ sectionHandler->SetStatus(false);
+ sectionHandler->SetChannel(NULL);
+ }
++
++//ML
++ LNBstate = requiredState;
++ LNBsource = (int*) Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization());
++//ML-Ende
++
+ // Tell the ciHandler about the channel switch and add all PIDs of this
+ // channel to it, for possible later decryption:
+ if (ciHandler) {
+diff -urNad vdr-1.4.4~/device.h vdr-1.4.4/device.h
+--- vdr-1.4.4~/device.h 2006-11-04 19:42:37.000000000 +0100
++++ vdr-1.4.4/device.h 2006-11-04 19:44:36.000000000 +0100
+@@ -230,6 +230,13 @@
+ bool SwitchChannel(const cChannel *Channel, bool LiveView);
+ ///< Switches the device to the given Channel, initiating transfer mode
+ ///< if necessary.
++
++//ML
++ bool SwitchChannelForced(const cChannel *Channel, bool LiveView);
++ ///< Switches the device to the given channel, initiating transfer mode
++ ///< if necessary. Forces the switch without taking care of the LNB configuration.
++//ML-Ende
++
+ static bool SwitchChannel(int Direction);
+ ///< Switches the primary device to the next available channel in the given
+ ///< Direction (only the sign of Direction is evaluated, positive values
+@@ -546,6 +553,32 @@
+ ///< Detaches all receivers from this device for this pid.
+ void DetachAllReceivers(void);
+ ///< Detaches all receivers from this device.
++
++//ML
++private:
++ char LNBstate; // Current frequency band and polarization of the DVB-tuner
++// cDiseqc *LNBsource; // can not #include "diseqc.h". A workaround follows:
++ int *LNBsource; // [DiSEqC] DiSEqC-Source
++ int LNBnr; // Number of LNB used
++public:
++ char GetLNBconf(void) { return LNBstate; }
++ int *GetLNBsource(void) { return LNBsource; }
++ int GetLNBnr(void) { return LNBnr; }
++ static void SetLNBnr(void);
++ cDevice *GetBadDevice(const cChannel *Channel);
++ ///< Returns NULL if there is no device which uses the same LNB or if
++ ///< all of those devices are tuned to the same frequency band and
++ ///< polarization as of the requested channel.
++ ///< Otherwise returns the first device found.
++ int GetMaxBadPriority(const cChannel *Channel);
++ ///< Returns the highest priority of all receiving devices which use
++ ///< the same LNB and are tuned to a different frequency band or
++ ///< polarization as of the requested channel.
++ ///< Returns -1 if there are no such devices, but the primary device
++ ///< would be affected by switching to the requested channel.
++ ///< Returns -2 if there are no such devices and the primary device
++ ///< would not be affected by switching to the requested channel.
++//ML-Ende
+ };
+
+ /// Derived cDevice classes that can receive channels will have to provide
+diff -urNad vdr-1.4.4~/eitscan.c vdr-1.4.4/eitscan.c
+--- vdr-1.4.4~/eitscan.c 2006-01-07 15:10:17.000000000 +0100
++++ vdr-1.4.4/eitscan.c 2006-11-04 19:42:37.000000000 +0100
+@@ -151,9 +151,11 @@
+ if (Device->ProvidesTransponder(Channel)) {
+ if (!Device->Receiving()) {
+ bool MaySwitchTransponder = Device->MaySwitchTransponder();
+- if (MaySwitchTransponder || Device->ProvidesTransponderExclusively(Channel) && now - lastActivity > Setup.EPGScanTimeout * 3600) {
++//ML
++ if (MaySwitchTransponder && Device->GetMaxBadPriority(Channel) == -2 || Device->ProvidesTransponderExclusively(Channel) && Device->GetMaxBadPriority(Channel) <= -1 && now - lastActivity > Setup.EPGScanTimeout * 3600) {
+ if (!MaySwitchTransponder) {
+- if (Device == cDevice::ActualDevice() && !currentChannel) {
++ if ((Device == cDevice::ActualDevice() || Device->GetMaxBadPriority(Channel) == -1) && !currentChannel) {
++//ML-Ende
+ cDevice::PrimaryDevice()->StopReplay(); // stop transfer mode
+ currentChannel = Device->CurrentChannel();
+ Skins.Message(mtInfo, tr("Starting EPG scan"));
+diff -urNad vdr-1.4.4~/i18n.c vdr-1.4.4/i18n.c
+--- vdr-1.4.4~/i18n.c 2006-11-04 19:42:37.000000000 +0100
++++ vdr-1.4.4/i18n.c 2006-11-04 19:42:37.000000000 +0100
+@@ -7122,6 +7122,76 @@
+ "",//TODO
+ "",//TODO
+ },
++
++//ML
++ { "Channel locked by LNB!",
++ "Kanal durch LNB gesperrt!",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "Chaîne interdite par la LNB",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ },
++ { "Setup.LNB$DVB device %d uses LNB No.",
++ "DVB-Empfänger %d nutzt LNB Nr.",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "La carte DVB %d utilise la LNB No.",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ },
++ { "Setup.LNB$Log LNB usage",
++ "LNB-Nutzung protokollieren",
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ "",// TODO
++ },
++//ML
++
+ { NULL }
+ };
+
+diff -urNad vdr-1.4.4~/menu.c vdr-1.4.4/menu.c
+--- vdr-1.4.4~/menu.c 2006-11-04 19:42:37.000000000 +0100
++++ vdr-1.4.4/menu.c 2006-11-04 19:42:37.000000000 +0100
+@@ -2861,6 +2861,23 @@
+
+ Clear();
+
++//ML
++ int numSatDevices = 0;
++ for (int i = 0; i < cDevice::NumDevices(); i++) {
++ if (cDevice::GetDevice(i)->ProvidesSource(cSource::stSat)) numSatDevices++;
++ }
++ if (numSatDevices > 1) {
++ char tmp[30];
++ for (int i = 1; i <= cDevice::NumDevices(); i++) {
++ if (cDevice::GetDevice(i - 1)->ProvidesSource(cSource::stSat)) {
++ sprintf( tmp, tr("Setup.LNB$DVB device %d uses LNB No."), i);
++ Add(new cMenuEditIntItem( tmp, &data.CardUsesLNBnr[i - 1], 1, numSatDevices ));
++ }
++ }
++ }
++ Add(new cMenuEditBoolItem(tr("Setup.LNB$Log LNB usage"), &data.VerboseLNBlog));
++//ML-Ende
++
+ Add(new cMenuEditBoolItem(tr("Setup.LNB$Use DiSEqC"), &data.DiSEqC));
+ if (!data.DiSEqC) {
+ Add(new cMenuEditIntItem( tr("Setup.LNB$SLOF (MHz)"), &data.LnbSLOF));
+@@ -2877,6 +2894,10 @@
+ int oldDiSEqC = data.DiSEqC;
+ eOSState state = cMenuSetupBase::ProcessKey(Key);
+
++//ML
++ if (Key == kOk) cDevice::SetLNBnr();
++//ML-Ende
++
+ if (Key != kNone && data.DiSEqC != oldDiSEqC)
+ Setup();
+ return state;
+@@ -3727,7 +3748,10 @@
+ while (Channel) {
+ Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel);
+ if (cStatus::MsgChannelProtected(0, Channel) == false) // PIN PATCH
+- if (Channel && !Channel->GroupSep() && (cDevice::PrimaryDevice()->ProvidesChannel(Channel, Setup.PrimaryLimit) || cDevice::GetDevice(Channel, 0)))
++
++//ML
++ if (Channel && !Channel->GroupSep() && ((cDevice::PrimaryDevice()->ProvidesChannel(Channel, Setup.PrimaryLimit) && cDevice::PrimaryDevice()->GetMaxBadPriority(Channel) < 0) || cDevice::GetDevice(Channel, 0) ) )
++//ML-Ende
+ return Channel;
+ }
+ }
+@@ -4253,6 +4277,21 @@
+ int Priority = Timer ? Timer->Priority() : Pause ? Setup.PausePriority : Setup.DefaultPriority;
+ cDevice *device = cDevice::GetDevice(channel, Priority, &NeedsDetachReceivers);
+ if (device) {
++
++//ML
++ cDevice *tmpDevice;
++ while ((tmpDevice = device->GetBadDevice(channel))) {
++ if (tmpDevice->Replaying() == false) {
++ Stop(tmpDevice);
++ if (tmpDevice->IsPrimaryDevice() )
++ tmpDevice->SwitchChannelForced(channel, true);
++ else
++ tmpDevice->SwitchChannelForced(channel, false);
++ } else
++ tmpDevice->SwitchChannelForced(channel, false);
++ }
++//ML-Ende
++
+ if (NeedsDetachReceivers) {
+ Stop(device);
+ if (device == cTransferControl::ReceiverDevice())
Added: vdr/vdr/trunk/debian/patches/patchtest
===================================================================
--- vdr/vdr/trunk/debian/patches/patchtest 2007-01-12 22:19:46 UTC (rev 3850)
+++ vdr/vdr/trunk/debian/patches/patchtest 2007-01-12 22:28:45 UTC (rev 3851)
@@ -0,0 +1,191 @@
+#!/bin/sh
+
+# Define some patch levels here: foo="patch1 patch2 ..."
+#
+standard="\
+ 02_Makefile-CFGDIR \
+ 03_cmdsubmenu \
+ 04_newplugin \
+ 06_default_svdrp_port_0 \
+ 09_sort_options \
+ 10_dd-record-option \
+ 11_sortrecordings \
+ 12_osdbase-maxitems \
+ 14_cap-memsize \
+ 15_dvbplayer \
+ 16_channels.conf.terr-fix \
+ 81_Make_config "
+multipatch="$standard \
+ opt-20_liemikuutio \
+ opt-24_jumpplay \
+ opt-27_subtitles-ttxtsubs \
+ opt-27-x_subtitles-ttxtsubs-volumebar-fix \
+ opt-30-x_analogtv \
+ opt-37_submenu \
+ opt-38_disableDoubleEpgEntrys \
+ opt-39_noepg \
+ opt-40_wareagle-icons \
+ opt-41-x_timer-info \
+ opt-42-x_extrecmenu \
+ opt-43-x_epgsearch \
+ opt-44_rotor \
+ opt-45_yaepg \
+ opt-46_dvdarchive \
+ opt-46_dmh-dvd-archive \
+ opt-46-x_dmh-dvd-archive-debian \
+ opt-47_sourcecaps \
+ opt-48_pin"
+testpatch="$standard \
+ opt-20_liemikuutio \
+ opt-24_jumpplay \
+ opt-27_subtitles-ttxtsubs \
+ opt-27-x_subtitles-ttxtsubs-volumebar-fix \
+ opt-30-x_analogtv \
+ opt-36_CutterQueue-AutoDelete \
+ opt-37_submenu \
+ opt-38_disableDoubleEpgEntrys \
+ opt-39_noepg \
+ opt-41-x_timer-info \
+ opt-42-x_extrecmenu \
+ opt-43-x_epgsearch \
+ opt-44_rotor \
+ opt-45_yaepg \
+ opt-46_dvdarchive \
+ opt-46_dmh-dvd-archive \
+ opt-46-x_dmh-dvd-archive-debian \
+ opt-48_pin \
+ opt-49_sharelnb"
+mustfail_patch="XX_patchtest-patch-error"
+mustfail_compile="XX_patchtest-compile-error"
+
+# List the patch levels to be tested:
+#
+patchLevels=(\
+ "standard $standard"\
+ "multipatch $multipatch"\
+ "testpatch $testpatch"\
+ "mustfail_patch $mustfail_patch"\
+ "mustfail_compile $mustfail_compile")
+
+currentDir=`pwd`
+
+testPatchLevel ()
+{
+ patchLevelName=$1
+ tempDir=/tmp/vdr.$$.tmp
+ mkdir -p $tempDir
+ cp -r . $tempDir/vdr
+ cd $tempDir/vdr
+ # don't use dpatch:
+ touch patch-stamp
+ Failed="false"
+ shift
+ while [ "$1" ]
+ do
+ if [ $SOLVE = "true" ] ; then
+ rm -rf ../vdr.orig
+ cp -r . ../vdr.orig
+ fi
+ chmod a+x debian/patches/$1.dpatch
+ debian/patches/$1.dpatch -patch >/tmp/patchtest_patch.log 2>&1
+ if [ $? -ne 0 ] ; then
+ echo "FAILED $patchLevelName at $1"
+ Failed="true"
+ break
+ fi
+ shift
+ done
+
+ if [ $Failed = "false" ] ; then
+ if [ $QUICK = "true" ] ; then
+ echo " OK $patchLevelName"
+ else
+ fakeroot debian/rules binary >/tmp/patchtest_build.log 2>&1
+ if [ $? -ne 0 ] ; then
+ Failed="true"
+ echo "FAILED $patchLevelName - Build Error"
+ else
+ echo " OK $patchLevelName"
+ fi
+ fi
+ fi
+ if [ $Failed = "true" -a $SOLVE = "true" ] ; then
+ cd ..
+ exit 1
+ fi
+ cd $currentDir
+ rm -rf $tempDir
+}
+
+listPatchLevels ()
+{
+ len=${#patchLevels[*]}
+ i=0
+ while [ $i -lt $len ]
+ do
+ patchset=${patchLevels[$i]}
+ isPatchLevelName="true"
+ for patch in $patchset
+ do
+ if [ "$isPatchLevelName" = "true" ] ; then
+ echo "[$patch] contains these patches:"
+ else
+ echo -n "$patch, "
+ fi
+ isPatchLevelName="false"
+ done
+ let i++
+ echo
+ echo
+ done
+}
+
+
+testPatchLevels ()
+{
+ len=${#patchLevels[*]}
+ i=0
+ while [ $i -lt $len ]
+ do
+ patchset=${patchLevels[$i]}
+ testPatchLevel $patchset
+ let i++
+ done
+}
+
+echo
+echo "Patch-Level-Test"
+echo "----------------"
+echo
+
+QUICK='false'
+SOLVE='false'
+
+case $1 in
+ --help)
+ echo "Usage: debian/patches/patchtest [ --help | --quick | --solve ]"
+ echo
+ echo "With the --quick option no compilation will be performed."
+ echo "Using the --solve option will stop the test on failure and open"
+ echo "a new shell where you can solve any problems."
+ echo
+ exit 0
+ ;;
+ --quick)
+ QUICK="true"
+ ;;
+ --solve)
+ QUICK="true"
+ SOLVE="true"
+ ;;
+esac
+
+if [ -d debian/patches ] ; then
+ listPatchLevels
+ echo
+ testPatchLevels
+else
+ echo "Could not find debian/patches"
+fi
+
+echo
More information about the pkg-vdr-dvb-changes
mailing list