SOURCES: mplayerplug-in-divx.patch (NEW) - divx web player support
arekm
arekm at pld-linux.org
Sun May 14 16:38:44 CEST 2006
Author: arekm Date: Sun May 14 14:38:44 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- divx web player support
---- Files affected:
SOURCES:
mplayerplug-in-divx.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/mplayerplug-in-divx.patch
diff -u /dev/null SOURCES/mplayerplug-in-divx.patch:1.1
--- /dev/null Sun May 14 16:38:44 2006
+++ SOURCES/mplayerplug-in-divx.patch Sun May 14 16:38:39 2006
@@ -0,0 +1,1687 @@
+diff -urN mplayerplug-in.org/Makefile.in mplayerplug-in/Makefile.in
+--- mplayerplug-in.org/Makefile.in 2006-04-27 23:40:06.000000000 +0000
++++ mplayerplug-in/Makefile.in 2006-05-14 14:09:42.285414750 +0000
+@@ -27,6 +27,9 @@
+ OBJ_RM= plugin.o nsScriptablePeer.o npp_gate.o np_entry.o npn_gate.o \
+ plugin-support.o plugin-setup-rm.o plugin-list.o plugin-ui.o \
+ plugin-threads.o strlcpy.o strlcat.o $(LIBOBJS)
++OBJ_DIVX= plugin.o nsScriptablePeer.o npp_gate.o np_entry.o npn_gate.o \
++ plugin-support.o plugin-setup-divx.o plugin-list.o plugin-ui.o \
++ plugin-threads.o strlcpy.o strlcat.o $(LIBOBJS)
+ OBJ_GMP= plugin.o nsScriptablePeer.o npp_gate.o np_entry.o npn_gate.o \
+ plugin-support.o plugin-setup-gmp.o plugin-list.o plugin-ui.o \
+ plugin-threads.o strlcpy.o strlcat.o $(LIBOBJS)
+@@ -67,6 +70,10 @@
+ $(CXX) -shared -o $(SHAREDTARGET)-rm.so $(OBJ_RM) $(CFLAGS) $(LDFLAGS)
+ cp Source/nsIScriptableMplayerPlugin.xpt mplayerplug-in-rm.xpt
+
++$(SHAREDTARGET)-divx: $(OBJ_DIVX)
++ $(CXX) -shared -o $(SHAREDTARGET)-divx.so $(OBJ_DIVX) $(CFLAGS) $(LDFLAGS)
++ cp Source/nsIScriptableMplayerPlugin.xpt mplayerplug-in-divx.xpt
++
+ $(SHAREDTARGET)-gmp: $(OBJ_GMP)
+ $(CXX) -shared -o $(SHAREDTARGET)-gmp.so $(OBJ_GMP) $(CFLAGS) $(LDFLAGS)
+ cp Source/nsIScriptableMplayerPlugin.xpt mplayerplug-in-gmp.xpt
+@@ -95,6 +102,9 @@
+ plugin-setup-rm.o: Source/plugin-setup.cpp $(SCRIPTABLEHEADERS)
+ $(CXX) -c -o $@ $(CFLAGS) $(LIBS) -DRM Source/plugin-setup.cpp
+
++plugin-setup-divx.o: Source/plugin-setup.cpp $(SCRIPTABLEHEADERS)
++ $(CXX) -c -o $@ $(CFLAGS) $(LIBS) -DDIVX Source/plugin-setup.cpp
++
+ plugin-setup-gmp.o: Source/plugin-setup.cpp $(SCRIPTABLEHEADERS)
+ $(CXX) -c -o $@ $(CFLAGS) $(LIBS) -DGMP Source/plugin-setup.cpp
+
+Files mplayerplug-in.org/Source/.plugin-setup.cpp.swp and mplayerplug-in/Source/.plugin-setup.cpp.swp differ
+diff -urN mplayerplug-in.org/Source/plugin-setup.cpp mplayerplug-in/Source/plugin-setup.cpp
+--- mplayerplug-in.org/Source/plugin-setup.cpp 2006-05-04 15:22:23.000000000 +0000
++++ mplayerplug-in/Source/plugin-setup.cpp 2006-05-14 14:07:58.634937000 +0000
+@@ -365,11 +365,6 @@
+ strlcat(MimeTypes,
+ "application/x-nsv-vp3-mp3:nsv:Nullsoft Streaming Video;",
+ sizeof(MimeTypes));
+- // DIVX
+- strlcat(MimeTypes,
+- "video/divx:divx:DivX Media Format;"
+- "video/vnd.divx:divx:DivX Media Format;",
+- sizeof(MimeTypes));
+ // Basic
+ strlcat(MimeTypes,
+ "audio/basic:au,snd:Basic Audio File;"
+@@ -389,6 +384,15 @@
+ sizeof(MimeTypes));
+ }
+ #endif
++
++#ifdef DIVX
++ // DIVX
++ strlcat(MimeTypes,
++ "video/divx:divx:DivX Media Format;"
++ "video/vnd.divx:divx:DivX Media Format;",
++ sizeof(MimeTypes));
++#endif
++
+ // Google Video
+ #ifdef GMP
+ if (enable_gmp) {
+@@ -432,6 +436,10 @@
+ *((const char **) value) = "RealPlayer 9";
+ #endif
+
++#ifdef DIVX
++ *((const char **) value) = "DivX\256 Web Player";
++#endif
++
+ #ifdef GMP
+ *((const char **) value) = "Google VLC multimedia plugin 1.0";
+ #endif
+diff -urN mplayerplug-in.org/Source/plugin-setup.cpp~ mplayerplug-in/Source/plugin-setup.cpp~
+--- mplayerplug-in.org/Source/plugin-setup.cpp~ 1970-01-01 00:00:00.000000000 +0000
++++ mplayerplug-in/Source/plugin-setup.cpp~ 2006-05-14 14:05:48.000000000 +0000
+@@ -0,0 +1,1583 @@
++#include "plugin.h"
++#include <sys/stat.h>
++
++#ifndef STATICDECLS
++#define STATICDECLS
++int DEBUG = 0;
++int instance_counter = 0;
++
++#define MAX_BUF_LEN 255
++#define STATE_RESET 0
++#define STATE_NEW 1
++#define STATE_HAVEURL 3
++#define STATE_WINDOWSET 4
++#define STATE_READY 5
++#define STATE_QUEUED 6
++#define STATE_DOWNLOADING 7
++#define STATE_DOWNLOADED_ENOUGH 8
++
++#define STATE_CANCELLED 11
++
++#define STATE_NEWINSTANCE 100
++#define STATE_GETTING_PLAYLIST 110
++#define STATE_STARTED_PLAYER 115
++#define STATE_PLAYLIST_COMPLETE 120
++#define STATE_PLAYLIST_NEXT 125
++#define STATE_PLAYING 130
++#define STATE_PLAY_COMPLETE 140
++#define STATE_PLAY_CANCELLED 150
++
++// speed options
++#define SPEED_LOW 1
++#define SPEED_MED 2
++#define SPEED_HIGH 3
++
++#endif
++
++
++char *GetMIMEDescription()
++{
++
++ char *ret;
++ char MimeTypes[4000], parse[1000], buffer[1000];
++ FILE *config;
++ int i, use_custom_mime_types;
++ int standard;
++ int enable_mpeg;
++ int enable_ogg;
++ int enable_smil;
++ int enable_helix;
++ int enable_wmp;
++ int enable_qt;
++ int enable_rm;
++ int enable_gmp;
++ int enable_mp3;
++ int enable_midi;
++ int enable_pls;
++
++#ifdef STD
++ FILE *customtypes;
++ char customline[255];
++#endif
++ char config_name[3][1000];
++
++ // load config file
++
++ snprintf(config_name[0], 1000, "/etc/mplayerplug-in.conf");
++
++ snprintf(config_name[1], 1000, "%s", getenv("HOME"));
++ strlcat(config_name[1], "/.mozilla/mplayerplug-in.conf", 1000);
++
++ snprintf(config_name[2], 1000, "%s", getenv("HOME"));
++ strlcat(config_name[2], "/.mplayer/mplayerplug-in.conf", 1000);
++
++ config = NULL;
++
++
++ enable_mpeg = 1;
++ enable_ogg = 1;
++ enable_smil = 1;
++ enable_helix = 1;
++ enable_wmp = 1;
++ enable_qt = 1;
++ enable_rm = 1;
++ enable_gmp = 1;
++ enable_midi = 0;
++ enable_pls = 0;
++ use_custom_mime_types = 0;
++
++ DEBUG = 0; //set to 1 when debugging this function
++ if (DEBUG)
++ printf("Reading config file for codecs\n");
++ // clear the buffer
++ for (i = 0; i < 4000; i++) {
++ MimeTypes[i] = '\0';
++ }
++
++ config = NULL;
++
++ for (i = 0; i < 3; i++) {
++ config = fopen(config_name[i], "r");
++
++ if (config == NULL) {
++ // no config file
++ } else {
++ while (fgets(buffer, 1000, config) != NULL) {
++
++ if (DEBUG)
++ printf("Buffer: %s\n", buffer);
++
++ // SMIL
++ if (strncasecmp(buffer, "enable-smil", 11) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_smil);
++ if (DEBUG)
++ printf("real:%i\n", enable_smil);
++ continue;
++ }
++ // Helix RPM MimeType
++ if (strncasecmp(buffer, "enable-helix", 12) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_helix);
++ if (DEBUG)
++ printf("helix:%i\n", enable_helix);
++ continue;
++ }
++ // MPEG
++ if (strncasecmp(buffer, "enable-mpeg", 11) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_mpeg);
++ if (DEBUG)
++ printf("mpeg:%i\n", enable_mpeg);
++ continue;
++ }
++ // Ogg Vorbis
++ if (strncasecmp(buffer, "enable-ogg", 10) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_ogg);
++ if (DEBUG)
++ printf("ogg:%i\n", enable_ogg);
++ continue;
++ }
++
++ if (strncasecmp(buffer, "use-mimetypes", 13) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &use_custom_mime_types);
++ if (DEBUG)
++ printf("custom mimetypes:%i\n",
++ use_custom_mime_types);
++ continue;
++ }
++ // Windows Media Player
++ if (strncasecmp(buffer, "enable-wmp", 10) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_wmp);
++ if (DEBUG)
++ printf("wmp:%i\n", enable_wmp);
++ continue;
++ }
++ // QuickTime
++ if (strncasecmp(buffer, "enable-qt", 9) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_qt);
++ if (DEBUG)
++ printf("qt:%i\n", enable_qt);
++ continue;
++ }
++ // RealMedia
++ if (strncasecmp(buffer, "enable-rm", 9) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_rm);
++ if (DEBUG)
++ printf("rm:%i\n", enable_rm);
++ continue;
++ }
++ // Google Media Player
++ if (strncasecmp(buffer, "enable-gmp", 10) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_gmp);
++ if (DEBUG)
++ printf("gmp:%i\n", enable_gmp);
++ continue;
++ }
++ // MP3
++ if (strncasecmp(buffer, "enable-mp3", 10) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_mp3);
++ if (DEBUG)
++ printf("mp3:%i\n", enable_mp3);
++ continue;
++ }
++ // MIDI
++ if (strncasecmp(buffer, "enable-midi", 11) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_midi);
++ if (DEBUG)
++ printf("midi:%i\n", enable_midi);
++ continue;
++ }
++ // PLS
++ if (strncasecmp(buffer, "enable-pls", 10) == 0) {
++ snprintf(parse, 1000, "%s", strtok(buffer, "="));
++ snprintf(parse, 1000, "%s", strtok(NULL, "="));
++ sscanf(parse, "%i", &enable_pls);
++ if (DEBUG)
++ printf("pls:%i\n", enable_pls);
++ continue;
++ }
++
++ }
++ fclose(config);
++ }
++ }
++
++#ifdef STD
++ standard = 1;
++#endif
++#ifndef STD
++ standard = 0;
++#endif
++
++ if (use_custom_mime_types == 1 && standard == 1) {
++
++#ifdef STD
++ customtypes = NULL;
++
++ if (customtypes == NULL) {
++ snprintf(buffer, 1000, "%s", getenv("HOME"));
++ strlcat(buffer, "/.mplayer/mplayerplug-in.types", 1000);
++ customtypes = fopen(buffer, "r");
++ }
++
++ if (customtypes == NULL) {
++ snprintf(buffer, 1000, "%s", getenv("HOME"));
++ strlcat(buffer, "/.mozilla/mplayerplug-in.types", 1000);
++ config = fopen(buffer, "r");
++ }
++
++ if (customtypes == NULL) {
++ customtypes = fopen("/etc/mplayerplug-in.types", "r");
++ }
++
++ if (customtypes != NULL) {
++ while (fgets(customline, sizeof(customline), customtypes)) {
++ if (customline[0] != '\0' && customline[0] != '#'
++ && customline[0] != '\n')
++ strlcat(MimeTypes, customline, sizeof(MimeTypes));
++ }
++ fclose(customtypes);
++ }
++#endif
++
++ } else {
++
++#ifdef QT
++ if (enable_qt) {
++ strlcat(MimeTypes,
++ "video/quicktime:mov:Quicktime;"
++ "video/x-quicktime:mov:Quicktime;"
++ "image/x-quicktime:mov:Quicktime;"
++ "video/quicktime:mp4:Quicktime;"
++ "video/quicktime:sdp:Quicktime - Session Description Protocol;"
++ "application/x-quicktimeplayer:mov:Quicktime;",
++ sizeof(MimeTypes));
++
++ if (enable_smil)
++ strlcat(MimeTypes,
++ "application/smil:smil:SMIL;", sizeof(MimeTypes));
++ }
++#endif
++
++#ifdef WMP
++ if (enable_wmp) {
++ strlcat(MimeTypes,
++ "application/asx:*:Media Files;"
++ "video/x-ms-asf-plugin:*:Media Files;"
++ "video/x-msvideo:avi,*:AVI;"
++ "video/msvideo:avi,*:AVI;"
++ "application/x-mplayer2:*:Media Files;"
++ "application/x-ms-wmv:wmv,*:Microsoft WMV video;"
++ "video/x-ms-asf:asf,asx,*:Media Files;"
++ "video/x-ms-wm:wm,*:Media Files;"
++ "video/x-ms-wmv:wmv,*:Microsoft WMV video;"
++ "audio/x-ms-wmv:wmv,*:Windows Media;"
++ "video/x-ms-wmp:wmp,*:Windows Media;"
++ "video/x-ms-wvx:wvx,*:Windows Media;"
++ "audio/x-ms-wax:wax,*:Windows Media;"
++ "audio/x-ms-wma:wma,*:Windows Media;"
++ "application/x-drm-v2:asx,*:Windows Media;"
++ "audio/wav:wav,*:Microsoft wave file;"
++ "audio/x-wav:wav,*:Microsoft wave file;",
++ sizeof(MimeTypes));
++ }
++#endif
++
++#ifdef RM
++ if (enable_rm) {
++ strlcat(MimeTypes,
++ "audio/x-pn-realaudio:ram,rm:RealAudio;"
++ "application/vnd.rn-realmedia:rm:RealMedia;"
++ "application/vnd.rn-realaudio:ra,ram:RealAudio;"
++ "video/vnd.rn-realvideo:rv:RealVideo;"
++ "audio/x-realaudio:ra:RealAudio;", sizeof(MimeTypes));
++
++ if (enable_helix)
++ strlcat(MimeTypes,
++ "audio/x-pn-realaudio-plugin:rpm:RealAudio;",
++ sizeof(MimeTypes));
++
++ if (enable_smil)
++ strlcat(MimeTypes,
++ "application/smil:smil:SMIL;", sizeof(MimeTypes));
++ }
++#endif
++
++#ifdef STD
++ if (enable_mpeg) {
++ strlcat(MimeTypes,
++ "video/mpeg:mpg,mpeg:MPEG;"
++ "audio/mpeg:mpg,mpeg:MPEG;"
++ "video/x-mpeg:mpg,mpeg:MPEG;"
++ "video/x-mpeg2:mpv2,mp2ve:MPEG2;"
++ "audio/mpeg:mpg,mpeg:MPEG;"
++ "audio/x-mpeg:mpg,mpeg:MPEG;"
++ "audio/mpeg2:mp2:MPEG audio;"
++ "audio/x-mpeg2:mp2:MPEG audio;"
++ "video/mp4:mp4:MPEG 4 Video;", sizeof(MimeTypes));
++
++ if (enable_mp3)
++ strlcat(MimeTypes,
++ "audio/mpeg3:mp3:MPEG audio;"
++ "audio/x-mpeg3:mp3:MPEG audio;"
++ "audio/x-mpegurl:m3u:MPEG url;"
++ "audio/mp3:mp3:MPEG audio;", sizeof(MimeTypes));
++
++ }
++
++ if (enable_ogg) {
++ strlcat(MimeTypes,
++ "application/x-ogg:ogg:Ogg Vorbis Media;"
++ "audio/ogg:ogg:Ogg Vorbis Audio;"
++ "application/ogg:ogg:Ogg Vorbis / Ogg Theora;",
++ sizeof(MimeTypes));
++ }
++ // FLI
++ strlcat(MimeTypes,
++ "video/fli:fli,flc:FLI animation;"
++ "video/x-fli:fli,flc:FLI animation;", sizeof(MimeTypes));
++
++ // Vivo
++ strlcat(MimeTypes, "video/vnd.vivo:viv,vivo:VivoActive;",
++ sizeof(MimeTypes));
++
++ // NSV
++ strlcat(MimeTypes,
++ "application/x-nsv-vp3-mp3:nsv:Nullsoft Streaming Video;",
++ sizeof(MimeTypes));
++ // Basic
++ strlcat(MimeTypes,
++ "audio/basic:au,snd:Basic Audio File;"
++ "audio/x-basic:au,snd:Basic Audio File;",
++ sizeof(MimeTypes));
++
++ // MIDI
++ if (enable_midi) {
++ strlcat(MimeTypes,
++ "audio/midi:mid,midi,kar:MIDI Audio;",
++ sizeof(MimeTypes));
++ }
++ // PLS
++ if (enable_pls) {
++ strlcat(MimeTypes,
++ "audio/x-scpls:pls:Shoutcast Playlist;",
++ sizeof(MimeTypes));
++ }
++#endif
++
++#ifdef DIVX
++ // DIVX
++ strlcat(MimeTypes,
++ "video/divx:divx:DivX Media Format;"
++ "video/vnd.divx:divx:DivX Media Format;",
++ sizeof(MimeTypes));
++#endif
++
++ // Google Video
++#ifdef GMP
++ if (enable_gmp) {
++ strlcat(MimeTypes,
++ "application/x-google-vlc-plugin::Google Video;",
++ sizeof(MimeTypes));
++ }
++#endif
++
++ }
++ ret = strdup(MimeTypes);
++ if (DEBUG)
++ printf("%s\n", ret);
++ DEBUG = 0;
++ return ret;
++}
++
++NPError GetValue(NPPVariable variable, void *value)
++{
++
++ NPError err = NPERR_NO_ERROR;
++
++ DEBUG = 0; // set to 1 when debugging this function
++
++ // some sites use this description to figure out what formats can be played. So we have to make sure the
++ // description matches the features
++
++ if (variable == NPPVpluginNameString) {
++#ifdef STD
++ *((const char **) value) = "mplayerplug-in " PACKAGE_VERSION;
++#endif
++#ifdef WMP
++ *((const char **) value) = "Windows Media Player Plugin";
++#endif
++
++#ifdef QT
++ *((const char **) value) = "QuickTime Plug-in 6.0";
++#endif
++
++#ifdef RM
++ *((const char **) value) = "RealPlayer 9";
++#endif
++
++#ifdef DIVX
++ *((const char **) value) = "DivX Web Player";
++#endif
++
++#ifdef GMP
++ *((const char **) value) = "Google VLC multimedia plugin 1.0";
++#endif
++
++ }
++ if (variable == NPPVpluginDescriptionString) {
++#ifdef GTK2_ENABLED
++ *((const char **) value) =
++ "<a href=\"http://mplayerplug-in.sourceforge.net/\">mplayerplug-in</a> "
++ PACKAGE_VERSION
++ "<br><br>Video Player Plug-in for QuickTime, RealPlayer and Windows Media Player streams using <a href=\"http://mplayerhq.hu\">MPlayer</a> <br>JavaScript Enabled and Using GTK2 Widgets<br>";
++#endif
++#ifdef GTK1_ENABLED
++ *((const char **) value) =
++ "<a href=\"http://mplayerplug-in.sourceforge.net/\">mplayerplug-in</a> "
++ PACKAGE_VERSION
++ "<br><br>Video Player Plug-in for QuickTime, RealPlayer and Windows Media Player streams using <a href=\"http://mplayerhq.hu\">MPlayer</a> <br>JavaScript Enabled and Using GTK1 Widgets<br>";
++#endif
++#ifdef X_ENABLED
++ *((const char **) value) =
++ "<a href=\"http://mplayerplug-in.sourceforge.net/\">mplayerplug-in</a> "
++ PACKAGE_VERSION
++ "<br><br>Video Player Plug-in for QuickTime, RealPlayer and Windows Media Player streams using <a href=\"http://mplayerhq.hu\">MPlayer</a> <br>JavaScript Enabled and Using X Widgets<br>";
++#endif
++
++ }
++
++ if (variable == NPPVpluginNeedsXEmbed) {
++#ifdef GTK2_ENABLED
++ *((PRBool *) value) = PR_FALSE;
++#endif
++#ifdef GTK1_ENABLED
++ *((PRBool *) value) = PR_TRUE;
++#endif
++ }
++
++ if ((variable != NPPVpluginNameString)
++ && (variable != NPPVpluginDescriptionString)
++ && (variable != NPPVpluginNeedsXEmbed)) {
++ err = NPERR_GENERIC_ERROR;
++ }
++
++ DEBUG = 0;
++ return err;
++
++}
++
++void New(nsPluginInstance * instance, nsPluginCreateData * parameters)
++{
++ int i;
++ int real_master_console = 0;
++ char parse[1000];
++ char *cp;
++
++ if (DEBUG)
++ printf("mimetype: %s\n", parameters->type);
++
++ instance->mode = parameters->mode;
++ instance->mInstance = parameters->instance;
++ instance->mimetype = strdup(parameters->type);
++
++/*
++ if ((strstr(instance->mimetype, "mpeg") != NULL)
++ || (strstr(instance->mimetype, "mp3") != NULL)) {
++ instance->cache_percent = 100;
++ }
++*/
++ if (parameters->mode == NP_EMBED) {
<<Diff was trimmed, longer than 597 lines>>
More information about the pld-cvs-commit
mailing list