[CalendarServer-changes] [7694] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Jun 30 09:29:37 PDT 2011


Revision: 7694
          http://trac.macosforge.org/projects/calendarserver/changeset/7694
Author:   cdaboo at apple.com
Date:     2011-06-30 09:29:37 -0700 (Thu, 30 Jun 2011)
Log Message:
-----------
Support new validation mode in pycalendar. This includes re-factoring the validation apis to be clearer as well as doing
validation/fix/log for data read from the database.

Modified Paths:
--------------
    CalendarServer/trunk/support/build.sh
    CalendarServer/trunk/twistedcaldav/caldavxml.py
    CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py
    CalendarServer/trunk/twistedcaldav/ical.py
    CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
    CalendarServer/trunk/twistedcaldav/method/put_common.py
    CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics
    CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
    CalendarServer/trunk/twistedcaldav/test/test_multiget.py
    CalendarServer/trunk/twistedcaldav/test/test_validation.py
    CalendarServer/trunk/twistedcaldav/test/test_xml.py
    CalendarServer/trunk/twistedcaldav/vcard.py
    CalendarServer/trunk/txdav/caldav/datastore/file.py
    CalendarServer/trunk/txdav/caldav/datastore/index_file.py
    CalendarServer/trunk/txdav/caldav/datastore/sql.py
    CalendarServer/trunk/txdav/caldav/datastore/test/common.py
    CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py
    CalendarServer/trunk/txdav/caldav/datastore/util.py
    CalendarServer/trunk/txdav/carddav/datastore/file.py
    CalendarServer/trunk/txdav/carddav/datastore/index_file.py
    CalendarServer/trunk/txdav/carddav/datastore/sql.py
    CalendarServer/trunk/txdav/carddav/datastore/util.py
    CalendarServer/trunk/txdav/common/datastore/file.py
    CalendarServer/trunk/txdav/common/datastore/sql.py

Modified: CalendarServer/trunk/support/build.sh
===================================================================
--- CalendarServer/trunk/support/build.sh	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/support/build.sh	2011-06-30 16:29:37 UTC (rev 7694)
@@ -732,9 +732,9 @@
     "http://svn.osafoundation.org/vobject/trunk";
 
   # XXX actually PyCalendar should be imported in-place.
-  py_dependency -fe -i "src" -r 161 \
+  py_dependency -fe -i "src" -r 169 \
     "pycalendar" "pycalendar" "pycalendar" \
-    "http://svn.mulberrymail.com/repos/PyCalendar/branches/server-stable";
+    "http://svn.mulberrymail.com/repos/PyCalendar/branches/server";
 
   #
   # Tool dependencies.  The code itself doesn't depend on these, but

Modified: CalendarServer/trunk/twistedcaldav/caldavxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/caldavxml.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/caldavxml.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -390,16 +390,6 @@
                 # optimize them originals away
                 self.children = (data,)
 
-                # Verify that we have valid calendar data, but don't call
-                # validateForCalDAV() on the result, since some responses may
-                # require a calendar-data element with iCalendar data not meant
-                # for use as a CalDAV resource.
-                #try:
-                #    self.calendar()
-                #except ValueError, e:
-                #    log.err("Invalid iCalendar data (%s): %r" % (e, data))
-                #    raise
-
         if "content-type" in attributes:
             self.content_type = attributes["content-type"]
         else:

Modified: CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -27,6 +27,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -66,6 +67,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -87,6 +89,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -108,6 +111,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -128,6 +132,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -149,6 +154,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -174,6 +180,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -193,6 +200,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -240,6 +248,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -250,6 +259,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -271,6 +281,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -281,6 +292,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -306,6 +318,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -322,6 +335,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -341,6 +355,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -351,6 +366,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -374,6 +390,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -384,6 +401,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -418,6 +436,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -434,6 +453,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -453,6 +473,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -463,6 +484,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -486,6 +508,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -496,6 +519,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -522,6 +546,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -532,6 +557,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -551,6 +577,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -561,6 +588,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -584,6 +612,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -619,6 +648,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -635,6 +665,7 @@
 DTEND:20080602T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -654,6 +685,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -678,6 +710,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -734,6 +767,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -750,6 +784,7 @@
 DTEND:20080602T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -769,6 +804,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -785,6 +821,7 @@
 DTEND:20080603T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -804,6 +841,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -829,6 +867,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -856,6 +895,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -876,6 +916,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -901,6 +942,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -914,6 +956,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -941,6 +984,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -960,6 +1004,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -985,6 +1030,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1006,6 +1052,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1037,6 +1084,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1047,6 +1095,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1060,6 +1109,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1070,6 +1120,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1097,6 +1148,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -1113,6 +1165,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -1132,6 +1185,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1142,6 +1196,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1167,6 +1222,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1177,6 +1233,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1198,6 +1255,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -1214,6 +1272,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -1233,6 +1292,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1243,6 +1303,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1277,6 +1338,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1287,6 +1349,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1308,6 +1371,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1318,6 +1382,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -1337,6 +1402,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1347,6 +1413,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1375,6 +1442,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1385,6 +1453,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1406,6 +1475,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -1422,6 +1492,7 @@
 DTEND:20080602T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -1441,6 +1512,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1476,6 +1548,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1486,6 +1559,7 @@
 DTEND:20080602T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1507,6 +1581,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -1523,6 +1598,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:TRANSPARENT
 BEGIN:VALARM
@@ -1542,6 +1618,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1552,6 +1629,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1586,6 +1664,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1596,6 +1675,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1619,6 +1699,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1632,6 +1713,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1651,6 +1733,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1671,6 +1754,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -1690,6 +1774,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1715,6 +1800,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1747,6 +1833,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -1766,6 +1853,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1803,6 +1891,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1847,6 +1936,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1860,6 +1950,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1897,6 +1988,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -1937,6 +2029,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1951,6 +2044,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -1971,6 +2065,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1991,6 +2086,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2001,6 +2097,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -2014,6 +2111,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2024,6 +2122,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2043,6 +2142,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -2064,6 +2164,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -2078,6 +2179,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2098,6 +2200,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -2118,6 +2221,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -2138,6 +2242,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2163,6 +2268,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2196,6 +2302,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -2212,6 +2319,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -2231,6 +2339,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2256,6 +2365,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2266,6 +2376,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2308,6 +2419,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -2328,6 +2440,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2354,6 +2467,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2388,6 +2502,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -2408,6 +2523,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2445,6 +2561,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2490,6 +2607,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -2506,6 +2624,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -2525,6 +2644,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2562,6 +2682,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2572,6 +2693,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2626,6 +2748,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -2645,6 +2768,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2683,6 +2807,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2716,6 +2841,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2730,6 +2856,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2767,6 +2894,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2806,6 +2934,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2816,6 +2945,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -2829,6 +2959,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2866,6 +2997,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -2876,6 +3008,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2916,6 +3049,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -2929,6 +3063,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2967,6 +3102,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -2996,6 +3132,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3010,6 +3147,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3030,6 +3168,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3051,6 +3190,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3065,6 +3205,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3085,6 +3226,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3095,6 +3237,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -3115,6 +3258,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -3128,6 +3272,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3148,6 +3293,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -3168,6 +3314,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -3187,6 +3334,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3213,6 +3361,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3245,6 +3394,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -3264,6 +3414,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3274,6 +3425,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3299,6 +3451,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3331,6 +3484,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -3351,6 +3505,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3377,6 +3532,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3409,6 +3565,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -3428,6 +3585,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3466,6 +3624,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3510,6 +3669,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -3529,6 +3689,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3539,6 +3700,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3594,6 +3756,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3638,6 +3801,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -3658,6 +3822,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3697,6 +3862,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3729,6 +3895,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3743,6 +3910,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3780,6 +3948,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3819,6 +3988,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3829,6 +3999,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -3842,6 +4013,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3879,6 +4051,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -3889,6 +4062,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3928,6 +4102,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -3942,6 +4117,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -3981,6 +4157,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4009,6 +4186,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4023,6 +4201,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4043,6 +4222,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4064,6 +4244,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -4084,6 +4265,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4110,6 +4292,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4143,6 +4326,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -4163,6 +4347,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4201,6 +4386,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4246,6 +4432,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4260,6 +4447,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4298,6 +4486,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4337,6 +4526,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4351,6 +4541,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4398,6 +4589,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4439,6 +4631,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4449,6 +4642,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -4462,6 +4656,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4472,6 +4667,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4491,6 +4687,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4501,6 +4698,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -4521,6 +4719,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -4537,6 +4736,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -4556,6 +4756,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4566,6 +4767,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4600,6 +4802,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4610,6 +4813,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4651,6 +4855,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 TRANSP:OPAQUE
@@ -4667,6 +4872,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -4686,6 +4892,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4696,6 +4903,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4751,6 +4959,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4761,6 +4970,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4814,6 +5024,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4824,6 +5035,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -4837,6 +5049,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4847,6 +5060,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4902,6 +5116,7 @@
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -4912,6 +5127,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4953,6 +5169,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -4967,6 +5184,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -4988,6 +5206,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -5009,6 +5228,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -5029,6 +5249,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -5056,6 +5277,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -5090,6 +5312,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 TRANSP:OPAQUE
 BEGIN:VALARM
@@ -5110,6 +5333,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -5150,6 +5374,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -5184,6 +5409,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -5198,6 +5424,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -5238,6 +5465,7 @@
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 END:VEVENT
 BEGIN:X-CALENDARSERVER-PERUSER
@@ -5267,6 +5495,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=5
 TRANSP:OPAQUE
@@ -5287,6 +5516,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 END:VEVENT
@@ -5343,6 +5573,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=5
 END:VEVENT
@@ -5397,6 +5628,7 @@
 DTEND:20080602T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 TRANSP:OPAQUE
@@ -5417,6 +5649,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 END:VEVENT
@@ -5464,6 +5697,7 @@
 DTEND:20080602T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 END:VEVENT
@@ -5518,6 +5752,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 TRANSP:OPAQUE
@@ -5538,6 +5773,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RDATE:20080602T150000Z
 RRULE:FREQ=DAILY;COUNT=10
@@ -5586,6 +5822,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 END:VEVENT
@@ -5632,6 +5869,7 @@
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 EXDATE:20080602T110000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 TRANSP:OPAQUE
@@ -5652,6 +5890,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10
 END:VEVENT
@@ -5699,6 +5938,7 @@
 DTEND:20080601T120000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 EXDATE:20080602T110000Z
 ORGANIZER;CN=User 01:mailto:user1 at example.com
 RRULE:FREQ=DAILY;COUNT=10

Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/ical.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -48,7 +48,7 @@
 from pycalendar.componentbase import PyCalendarComponentBase
 from pycalendar.datetime import PyCalendarDateTime
 from pycalendar.duration import PyCalendarDuration
-from pycalendar.exceptions import PyCalendarInvalidData
+from pycalendar.exceptions import PyCalendarError
 from pycalendar.period import PyCalendarPeriod
 from pycalendar.property import PyCalendarProperty
 from pycalendar.timezone import PyCalendarTimezone
@@ -343,7 +343,7 @@
         cal = PyCalendar()
         try:
             result = cal.parse(stream)
-        except PyCalendarInvalidData:
+        except PyCalendarError:
             result = None
         if not result:
             stream.seek(0)
@@ -421,6 +421,9 @@
             self._parent = None
 
     def __str__ (self):
+        """
+        NB This does not automatically include timezones in VCALENDAR objects.
+        """
         return str(self._pycalendar)
 
     def __repr__(self):
@@ -437,6 +440,17 @@
             return False
         return self._pycalendar == other._pycalendar
 
+    def getText(self):
+        """
+        Serialize the calendar object. For a VCALENDAR always ensure the proper set of
+        timezones are included.
+        """
+        
+        if self.name() == "VCALENDAR":
+            return self._pycalendar.getText(includeTimezones=True)
+        else:
+            return self._pycalendar.getText()
+
     # FIXME: Should this not be in __eq__?
     def same(self, other):
         return self._pycalendar == other._pycalendar
@@ -1239,9 +1253,11 @@
 
         return self._resource_type
 
-    def validCalendarForCalDAV(self):
+    def validCalendarData(self, doFix=True, doRaise=True):
         """
-        @raise InvalidICalendarDataError: if the given calendar data is not valid.
+        @return: tuple of fixed, unfixed issues
+        @raise InvalidICalendarDataError: if the given calendar data is not valid and
+            cannot be fixed.
         """
         if self.name() != "VCALENDAR":
             log.debug("Not a calendar: %s" % (self,))
@@ -1250,34 +1266,30 @@
             log.debug("Unknown resource type: %s" % (self,))
             raise InvalidICalendarDataError("Unknown resource type")
 
-        version = self.propertyValue("VERSION")
-        if version != "2.0":
-            msg = "Not a version 2.0 iCalendar (version=%s)" % (version,)
-            log.debug(msg)
-            raise InvalidICalendarDataError(msg)
+        # Do underlying iCalendar library validation with data fix
+        fixed, unfixed = self._pycalendar.validate(doFix=doFix)
+        if unfixed:
+            log.debug("Calendar data had unfixable problems:\n  %s" % ("\n  ".join(unfixed),))
+            if doRaise:
+                raise InvalidICalendarDataError("Calendar data had unfixable problems:\n  %s" % ("\n  ".join(unfixed),))
+        if fixed:
+            log.debug("Calendar data had fixable problems:\n  %s" % ("\n  ".join(fixed),))
+        
+        return fixed, unfixed
 
-    def validateForCalDAV(self):
+    def validCalendarForCalDAV(self, methodAllowed):
         """
+        @param methodAllowed:     True if METHOD property is allowed, False otherwise.
         @raise InvalidICalendarDataError: if the given calendar component is not valid for
             use as a X{CalDAV} resource.
         """
-        self.validCalendarForCalDAV()
 
         # Disallowed in CalDAV-Access-08, section 4.1
-        if self.hasProperty("METHOD"):
+        if not methodAllowed and self.hasProperty("METHOD"):
             msg = "METHOD property is not allowed in CalDAV iCalendar data"
             log.debug(msg)
             raise InvalidICalendarDataError(msg)
 
-        self.validateComponentsForCalDAV(False)
-
-    def validateComponentsForCalDAV(self, method, fix=False):
-        """
-        @param method:     True if METHOD property is allowed, False otherwise.
-        @param fix:        True to try and fix bogus data
-        @raise InvalidICalendarDataError: if the given calendar component is not valid for
-            use as a X{CalDAV} resource.
-        """
         #
         # Must not contain more than one type of iCalendar component, except for
         # the required timezone components, and component UIDs must match
@@ -1292,12 +1304,6 @@
         #master_recurring = False
         
         for subcomponent in self.subcomponents():
-            # Disallowed in CalDAV-Access-08, section 4.1
-            if not method and subcomponent.hasProperty("METHOD"):
-                msg = "METHOD property is not allowed in CalDAV iCalendar data"
-                log.debug(msg)
-                raise InvalidICalendarDataError(msg)
-        
             if subcomponent.name() == "VTIMEZONE":
                 timezones.add(subcomponent.propertyValue("TZID"))
             elif subcomponent.name() in ignoredComponents:
@@ -1363,42 +1369,6 @@
                 else:
                     component_rids.add(rid)
 
-                # Check for mismatch in DTSTART and UNTIL value type
-                # If they're not both date or both date-time, raise error
-                if (subcomponent.hasProperty("DTSTART") and
-                    subcomponent.hasProperty("RRULE")):
-                    dtValue = subcomponent.propertyValue("DTSTART")
-                    dtutc = dtValue.duplicateAsUTC()
-                    # Using properties("RRULE") rather than getRRuleSet() here
-                    # because the dateutil rrule's _until values are datetime
-                    # even if the UNTIL is a date (and therefore we can't
-                    # check validity without doing the following):
-                    rrules = subcomponent._pycalendar.getRecurrenceSet()
-                    for rrule in rrules.getRules():
-                        if rrule.getUseUntil():
-                            if rrule.getUntil().isDateOnly() ^ dtValue.isDateOnly():
-                                msg = "Calendar resources must have matching type for DTSTART and UNTIL"
-                                log.debug(msg)
-                                if fix:
-                                    log.debug("Fixing mismatch")
-                                    rrule.getUntil().setDateOnly(dtValue.isDateOnly())
-                                    if not dtValue.isDateOnly():
-                                        rrule.getUntil().setHHMMSS(dtutc.getHours(), dtutc.getMinutes(), dtutc.getSeconds())
-                                        rrule.getUntil().setTimezone(PyCalendarTimezone(utc=True))
-                                    rrules.changed()
-                                else:
-                                    raise InvalidICalendarDataError(msg)
-
-                # Check for VEVENT - DTEND and DURATION cannot appear together
-                if (subcomponent.name() == "VEVENT" and
-                    subcomponent.hasProperty("DTEND") and
-                    subcomponent.hasProperty("DURATION")):
-                    if fix:
-                        # Remove the DTEND
-                        subcomponent.removeProperty("DTEND")
-                    else:
-                        raise InvalidICalendarDataError(msg)
-                    
                 timezone_refs.update(subcomponent.timezoneIDs())
         
         #
@@ -1508,7 +1478,7 @@
                 return False
             
             # First make sure components are all of the same time (excluding VTIMEZONE)
-            self.validateComponentsForCalDAV(True)
+            self.validCalendarForCalDAV(methodAllowed=True)
             
             # Next we could check the iTIP status for each type of method/component pair, however
             # we can also leave that up to the server except for the REQUEST/VFREEBUSY case which

Modified: CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -198,12 +198,22 @@
                             "Could not parse vCard",
                         ))
                         
-                # Valid vcard data for CalDAV check
+                # Valid vcard data check
                 result, message = self.validAddressDataCheck()
                 if not result:
                     log.err(message)
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
+                        (carddav_namespace, "valid-address-data"),
+                        description=message
+                    ))
+                    
+                # Valid vcard data for CalDAV check
+                result, message = self.validCardDAVDataCheck()
+                if not result:
+                    log.err(message)
+                    raise HTTPError(ErrorResponse(
+                        responsecode.FORBIDDEN,
                         (carddav_namespace, "valid-addressbook-object-resource"),
                         "Invalid vCard data",
                     ))
@@ -283,8 +293,8 @@
         
     def validAddressDataCheck(self):
         """
-        Check that the vcard data is valid vCard.
-        @return:         tuple: (True/False if the vcard data is valid,
+        Check that the calendar data is valid iCalendar.
+        @return:         tuple: (True/False if the calendar data is valid,
                                  log message string).
         """
         result = True
@@ -294,13 +304,29 @@
             message = "Empty resource not allowed in vcard collection"
         else:
             try:
-                self.vcard.validForCardDAV()
+                self.vcard.validVCardData()
             except ValueError, e:
                 result = False
                 message = "Invalid vcard data: %s" % (e,)
         
         return result, message
     
+    def validCardDAVDataCheck(self):
+        """
+        Check that the vcard data is valid vCard.
+        @return:         tuple: (True/False if the vcard data is valid,
+                                 log message string).
+        """
+        result = True
+        message = ""
+        try:
+            self.vcard.validForCardDAV()
+        except ValueError, e:
+            result = False
+            message = "vCard data does not conform to CardDAV requirements: %s" % (e,)
+        
+        return result, message
+    
     def validSizeCheck(self):
         """
         Make sure that the content-type of the source resource is text/vcard.

Modified: CalendarServer/trunk/twistedcaldav/method/put_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_common.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/method/put_common.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -463,7 +463,7 @@
             message = "Empty resource not allowed in calendar collection"
         else:
             try:
-                self.calendar.validCalendarForCalDAV()
+                self.calendar.validCalendarData()
             except ValueError, e:
                 result = False
                 message = "Invalid calendar data: %s" % (e,)
@@ -479,10 +479,7 @@
         result = True
         message = ""
         try:
-            if self.isiTIP:
-                self.calendar.validateComponentsForCalDAV(True)
-            else:
-                self.calendar.validateForCalDAV()
+            self.calendar.validCalendarForCalDAV(methodAllowed=self.isiTIP)
         except ValueError, e:
             result = False
             message = "Calendar data does not conform to CalDAV requirements: %s" % (e,)

Modified: CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -300,7 +300,7 @@
     def checkCalendarData(self):
         # Must be a valid calendar
         try:
-            self.calendar.validCalendarForCalDAV()
+            self.calendar.validCalendarData()
         except ValueError, e:
             log.err("%s request calendar component is not valid:%s %s" % (self.method, e, self.calendar,))
             raise HTTPError(ErrorResponse(

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3184A66-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020101
 DTEND;VALUE=DATE:20020102
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20031231;BYMONTH=1

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3184D26-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020121
 DTEND;VALUE=DATE:20020122
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040118;BYMONTH=1;BYDAY=3MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3185326-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020212
 DTEND;VALUE=DATE:20020213
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C31854DA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020214
 DTEND;VALUE=DATE:20020215
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C31856AC-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020218
 DTEND;VALUE=DATE:20020219
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040215;BYMONTH=2;BYDAY=3MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318585A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020222
 DTEND;VALUE=DATE:20020223
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040221;BYMONTH=2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3185A14-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020317
 DTEND;VALUE=DATE:20020318
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3185BBD-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020331
 DTEND;VALUE=DATE:20020401
 SUMMARY:Easter

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3185D63-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020415
 DTEND;VALUE=DATE:20020416
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3185F20-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020512
 DTEND;VALUE=DATE:20020513
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=2SU

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C31860C8-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020527
 DTEND;VALUE=DATE:20020528
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040530;BYMONTH=5;BYDAY=-1MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318627C-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020529
 DTEND;VALUE=DATE:20020530
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3186426-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020616
 DTEND;VALUE=DATE:20020617
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=6;BYDAY=3SU

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C31865E4-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020704
 DTEND;VALUE=DATE:20020705
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040703;BYMONTH=7

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3186792-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020902
 DTEND;VALUE=DATE:20020903
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040905;BYMONTH=9;BYDAY=1MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3186938-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20021014
 DTEND;VALUE=DATE:20021015
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041010;BYMONTH=10;BYDAY=2MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3186ADE-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20021027
 DTEND;VALUE=DATE:20021028
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYDAY=-1SU

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3186C96-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20021031
 DTEND;VALUE=DATE:20021101
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3186E3A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20021111
 DTEND;VALUE=DATE:20021112
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041110;BYMONTH=11

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3186FE7-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20021128
 DTEND;VALUE=DATE:20021129
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041124;BYMONTH=11;BYDAY=4TH

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318719A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20021225
 DTEND;VALUE=DATE:20021226
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041224;BYMONTH=12

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3187343-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20030420
 DTEND;VALUE=DATE:20030421
 SUMMARY:Easter

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3188906-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020407
 DTEND;VALUE=DATE:20020408
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4;BYDAY=1SU

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3188B3A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020202
 DURATION:P1D
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3188CFF-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020401
 DURATION:P1D
 SEQUENCE:2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3188EAA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020506
 DURATION:P1D
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040502;BYMONTH=5;BYDAY=1MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189058-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020505
 DURATION:P1D
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189203-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20020614
 DURATION:P1D
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=6

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C31893C2-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20050327
 DTEND;VALUE=DATE:20050328
 SEQUENCE:3

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189572-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040401
 DTEND;VALUE=DATE:20040402
 RRULE:FREQ=YEARLY;INTERVAL=1

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189716-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040101
 DTEND;VALUE=DATE:20040102
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=1

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C31898D4-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040119
 DTEND;VALUE=DATE:20040120
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=1;BYDAY=3MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189A88-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040216
 DTEND;VALUE=DATE:20040217
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2;BYDAY=3MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189C32-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040222
 DTEND;VALUE=DATE:20040223
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189DEC-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040411
 DTEND;VALUE=DATE:20040412
 SEQUENCE:2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C3189F94-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20060416
 DTEND;VALUE=DATE:20060417
 SEQUENCE:2

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318A148-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040531
 DTEND;VALUE=DATE:20040601
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=-1MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318A2F3-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040503
 DURATION:P1D
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=1MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318A4BA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040704
 DTEND;VALUE=DATE:20040705
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=7

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318A6E1-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040906
 DTEND;VALUE=DATE:20040907
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=9;BYDAY=1MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318A898-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20041011
 DTEND;VALUE=DATE:20041012
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYDAY=2MO

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318AA54-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20041111
 DTEND;VALUE=DATE:20041112
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318ABFE-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20041125
 DTEND;VALUE=DATE:20041127
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=4TH

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318ADAA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20041225
 DTEND;VALUE=DATE:20041226
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318AF53-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20041231
 DTEND;VALUE=DATE:20050101
 RRULE:FREQ=YEARLY;INTERVAL=1

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318B108-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20040912
 DTEND;VALUE=DATE:20040913
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=9;BYDAY=2SU

Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics	2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
 VERSION:2.0
 BEGIN:VEVENT
 UID:C318B2D2-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
 DTSTART;VALUE=DATE:20041102
 DTEND;VALUE=DATE:20041103
 DESCRIPTION:Every four years on the first Tuesday after the first Monday in

Modified: CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_icalendar.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_icalendar.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -87,6 +87,7 @@
 UID:12345-67890
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -104,6 +105,7 @@
 UID:12345-67890
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -125,6 +127,7 @@
 UID:12345-67890
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -138,6 +141,7 @@
 RECURRENCE-ID:20080602T120000Z
 DTSTART:20080602T130000Z
 DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -153,6 +157,7 @@
 RECURRENCE-ID:20080602T120000Z
 DTSTART:20080602T130000Z
 DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -162,6 +167,7 @@
 UID:12345-67890
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -183,6 +189,7 @@
 UID:12345-67890
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -210,6 +217,7 @@
 UID:12345-67890
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:Test
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
@@ -248,9 +256,13 @@
         CalDAV resource validation.
         """
         calendar = Component.fromStream(file(os.path.join(self.data_dir, "Holidays.ics")))
-        try: calendar.validateForCalDAV()
-        except ValueError: pass
-        else: self.fail("Monolithic iCalendar shouldn't validate for CalDAV")
+        try:
+            calendar.validCalendarData()
+            calendar.validCalendarForCalDAV(methodAllowed=False)
+        except ValueError:
+            pass
+        else:
+            self.fail("Monolithic iCalendar shouldn't validate for CalDAV")
 
         resource_dir = os.path.join(self.data_dir, "Holidays")
         for filename in resource_dir:
@@ -258,8 +270,11 @@
             filename = os.path.join(resource_dir, filename)
 
             calendar = Component.fromStream(file(filename))
-            try: calendar.validateForCalDAV()
-            except ValueError: self.fail("Resource iCalendar %s didn't validate for CalDAV" % (filename,))
+            try:
+                calendar.validCalendarData()
+                calendar.validCalendarForCalDAV(methodAllowed=False)
+            except ValueError:
+                self.fail("Resource iCalendar %s didn't validate for CalDAV" % (filename,))
 
     def test_component_validate_and_fix(self):
         """
@@ -267,6 +282,7 @@
         """
         data = """BEGIN:VCALENDAR
 VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
 BEGIN:VTIMEZONE
 TZID:America/Los_Angeles
 BEGIN:DAYLIGHT
@@ -298,20 +314,24 @@
 """
         # Ensure it starts off invalid
         calendar = Component.fromString(data)
-        try: calendar.validateComponentsForCalDAV(False)
-        except InvalidICalendarDataError: pass
-        else: self.fail("Shouldn't validate for CalDAV")
+        try:
+            calendar.validCalendarData(doFix=False)
+        except InvalidICalendarDataError:
+            pass
+        else:
+            self.fail("Shouldn't validate for CalDAV")
 
         # Fix it
-        calendar.validateComponentsForCalDAV(False, fix=True)
+        calendar.validCalendarData(doFix=True)
         self.assertTrue("RRULE:FREQ=DAILY;UNTIL=20110121T203000Z\r\n"
             in str(calendar))
 
         # Now it should pass without fixing
-        calendar.validateComponentsForCalDAV(False, fix=False)
+        calendar.validCalendarData(doFix=False)
 
         data = """BEGIN:VCALENDAR
 VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
 BEGIN:VTIMEZONE
 TZID:America/Los_Angeles
 BEGIN:DAYLIGHT
@@ -343,16 +363,19 @@
 """
         # Ensure it starts off invalid
         calendar = Component.fromString(data)
-        try: calendar.validateComponentsForCalDAV(False)
-        except InvalidICalendarDataError: pass
-        else: self.fail("Shouldn't validate for CalDAV")
+        try:
+            calendar.validCalendarData(doFix=False)
+        except InvalidICalendarDataError:
+            pass
+        else:
+            self.fail("Shouldn't validate for CalDAV")
 
         # Fix it
-        calendar.validateComponentsForCalDAV(False, fix=True)
+        calendar.validCalendarData(doFix=True)
         self.assertTrue("RRULE:FREQ=DAILY;UNTIL=20110131\r\n" in str(calendar))
 
         # Now it should pass without fixing
-        calendar.validateComponentsForCalDAV(False, fix=False)
+        calendar.validCalendarData(doFix=False)
 
 
     def test_component_timeranges(self):
@@ -491,11 +514,13 @@
         
         data = """BEGIN:VCALENDAR
 VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20071114T000000Z
 END:VEVENT
 END:VCALENDAR
 """
@@ -507,11 +532,13 @@
         
         data = """BEGIN:VCALENDAR
 VERSION:2.0
+DTSTART:20071114T000000Z
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20071114T000000Z
 END:VEVENT
 END:VCALENDAR
 """
@@ -528,6 +555,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -541,6 +569,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 END:VEVENT
@@ -556,6 +585,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ORGANIZER:mailto:user2 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -570,6 +600,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 RRULE:FREQ=YEARLY
@@ -578,6 +609,7 @@
 UID:12345-67890
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 END:VEVENT
@@ -594,6 +626,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 RRULE:FREQ=YEARLY
@@ -602,6 +635,7 @@
 UID:12345-67890
 RECURRENCE-ID:20091114T000000Z
 DTSTART:20071114T020000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user3 at example.com
 ATTENDEE:mailto:user2 at example.com
 END:VEVENT
@@ -618,6 +652,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 RRULE:FREQ=YEARLY
@@ -626,6 +661,7 @@
 UID:12345-67890
 RECURRENCE-ID:20091114T000000Z
 DTSTART:20071114T020000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user3 at example.com
 ORGANIZER:mailto:user4 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -651,6 +687,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -663,6 +700,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 END:VEVENT
@@ -679,6 +717,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 ATTENDEE:mailto:user3 at example.com
@@ -697,6 +736,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
 RRULE:FREQ=YEARLY
@@ -705,6 +745,7 @@
 UID:12345-67890
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
 ATTENDEE;SCHEDULE-AGENT=CLIENT:mailto:user3 at example.com
@@ -724,6 +765,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
 ATTENDEE:mailto:user3 at example.com
@@ -741,6 +783,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE;SCHEDULE-AGENT=SERVER:mailto:user2 at example.com
 RRULE:FREQ=YEARLY
@@ -749,6 +792,7 @@
 UID:12345-67890
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
 ATTENDEE;SCHEDULE-AGENT=CLIENT:mailto:user3 at example.com
@@ -778,6 +822,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -790,6 +835,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE;SCHEDULE-STATUS=2.0:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -811,6 +857,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE;SCHEDULE-STATUS=5.0:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -823,6 +870,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE;SCHEDULE-STATUS=2.0:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -844,6 +892,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -856,6 +905,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;SCHEDULE-STATUS=2.0:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -877,6 +927,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;SCHEDULE-STATUS=5.0:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -889,6 +940,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user01 at example.com
 ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER;SCHEDULE-STATUS=2.0:mailto:user01 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -917,6 +969,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -926,6 +979,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 REQUEST-STATUS:2.0;Success
 END:VEVENT
 END:VCALENDAR
@@ -939,12 +993,14 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
 UID:12345-67890-1
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T020000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -954,6 +1010,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 REQUEST-STATUS:2.0;Success
 RRULE:FREQ=DAILY
 END:VEVENT
@@ -961,6 +1018,7 @@
 UID:12345-67890-1
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T020000Z
+DTSTAMP:20080601T120000Z
 REQUEST-STATUS:2.0;Success
 END:VEVENT
 END:VCALENDAR
@@ -984,6 +1042,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -994,6 +1053,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1008,6 +1068,7 @@
 BEGIN:VEVENT
 UID:12345-67890-2
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1029,6 +1090,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1041,6 +1103,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1057,6 +1120,7 @@
 UID:12345-67890-4
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1079,6 +1143,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1087,6 +1152,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1099,6 +1165,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1107,6 +1174,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1123,6 +1191,7 @@
 UID:12345-67890-4
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1131,6 +1200,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1153,6 +1223,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1160,6 +1231,7 @@
 UID:12345-67890
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1172,6 +1244,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 EXDATE:20081114T000000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
@@ -1190,6 +1263,7 @@
 UID:12345-67890-4
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1197,6 +1271,7 @@
 UID:12345-67890
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1218,6 +1293,7 @@
 BEGIN:VEVENT
 UID:12345-67890-3
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1226,6 +1302,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1239,6 +1316,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1254,6 +1332,7 @@
 BEGIN:VEVENT
 UID:12345-67890-4
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1262,6 +1341,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1283,6 +1363,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1293,6 +1374,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1307,6 +1389,7 @@
 BEGIN:VEVENT
 UID:12345-67890-2
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1328,6 +1411,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1340,6 +1424,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1356,6 +1441,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE;SCHEDULE-AGENT=SERVER:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1368,6 +1454,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE;SCHEDULE-AGENT=SERVER:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1384,6 +1471,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE;SCHEDULE-AGENT=CLIENT:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1406,6 +1494,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1437,6 +1526,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1446,6 +1536,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1461,6 +1552,7 @@
 UID:12345-67890-2
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1471,6 +1563,7 @@
 BEGIN:VEVENT
 UID:12345-67890-2
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1487,6 +1580,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1498,6 +1592,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1515,6 +1610,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
 ATTENDEE:mailto:user3 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1525,6 +1621,7 @@
 BEGIN:VEVENT
 UID:12345-67890-4
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1542,6 +1639,7 @@
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
 ATTENDEE:mailto:user3 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1553,6 +1651,7 @@
 UID:12345-67890-5
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1579,6 +1678,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
 ORGANIZER:mailto:user1 at example.com
@@ -1592,6 +1692,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1609,6 +1710,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 BEGIN:VALARM
@@ -1622,6 +1724,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1633,6 +1736,7 @@
 BEGIN:VEVENT
 UID:12345-67890-3
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 BEGIN:VALARM
 ACTION:DISPLAY
@@ -1644,6 +1748,7 @@
 UID:12345-67890
 RECURRENCE-ID:20081114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1670,6 +1775,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 SUMMARY:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
 ORGANIZER:mailto:user1 at example.com
@@ -1683,6 +1789,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1700,6 +1807,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 BEGIN:VALARM
@@ -1713,6 +1821,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1724,6 +1833,7 @@
 BEGIN:VEVENT
 UID:12345-67890-3
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 BEGIN:VALARM
@@ -1736,6 +1846,7 @@
 UID:12345-67890
 RECURRENCE-ID:20081114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1761,6 +1872,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1770,6 +1882,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1783,6 +1896,7 @@
 BEGIN:VEVENT
 UID:12345-67890-2
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 BEGIN:VALARM
 ACTION:DISPLAY
 DESCRIPTION:Test
@@ -1797,6 +1911,7 @@
 BEGIN:VEVENT
 UID:12345-67890-2
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -1811,6 +1926,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 BEGIN:VALARM
@@ -1824,6 +1940,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1835,6 +1952,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1843,6 +1961,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1858,6 +1977,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 BEGIN:VALARM
@@ -1871,6 +1991,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 BEGIN:VALARM
 ACTION:DISPLAY
@@ -1887,6 +2008,7 @@
 UID:12345-67890-3
 DTSTART:20071114T000000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 RRULE:FREQ=YEARLY
 END:VEVENT
@@ -1895,6 +2017,7 @@
 RECURRENCE-ID:20081114T000000Z
 DTSTART:20071114T010000Z
 ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user1 at example.com
 END:VEVENT
 END:VCALENDAR
@@ -1918,6 +2041,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 END:VEVENT
 END:VCALENDAR
@@ -1933,6 +2057,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 RRULE:FREQ=DAILY;COUNT=2
 END:VEVENT
@@ -1952,6 +2077,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 RRULE:FREQ=DAILY;COUNT=2
 RDATE:20071116T010000Z
@@ -1973,6 +2099,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 RRULE:FREQ=DAILY;COUNT=3
 EXDATE:20071115T000000Z
@@ -1993,6 +2120,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 RRULE:FREQ=DAILY;COUNT=3
 EXDATE:20071114T000000Z
@@ -2013,6 +2141,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 RRULE:FREQ=DAILY;COUNT=2
 END:VEVENT
@@ -2020,6 +2149,7 @@
 UID:12345-67890-1
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 END:VEVENT
 END:VCALENDAR
@@ -2039,6 +2169,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY;COUNT=2
 END:VEVENT
 BEGIN:VEVENT
@@ -2046,6 +2177,7 @@
 RECURRENCE-ID:20071115T010000Z
 DTSTART:20071115T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2061,6 +2193,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY;COUNT=2
 END:VEVENT
 BEGIN:VEVENT
@@ -2068,6 +2201,7 @@
 RECURRENCE-ID:20071115T010000Z
 DTSTART:20071115T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2101,6 +2235,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2116,6 +2251,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2131,6 +2267,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
@@ -2138,6 +2275,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2153,6 +2291,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
@@ -2160,6 +2299,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2175,6 +2315,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
@@ -2182,6 +2323,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2197,6 +2339,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
@@ -2204,6 +2347,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2219,6 +2363,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
@@ -2226,6 +2371,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2241,12 +2387,14 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
 UID:12345-67890-1
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
+DTSTAMP:20080601T120000Z
 DURATION:PT1H
 END:VEVENT
 END:VCALENDAR
@@ -2272,6 +2420,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:True
 END:VEVENT
 END:VCALENDAR
@@ -2283,6 +2432,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM2:True
 END:VEVENT
 END:VCALENDAR
@@ -2294,6 +2444,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:True
 X-ITEM2:True
 END:VEVENT
@@ -2310,6 +2461,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:True
 END:VEVENT
 END:VCALENDAR
@@ -2321,6 +2473,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM2:True
 X-ITEM3:True
 END:VEVENT
@@ -2333,6 +2486,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:True
 X-ITEM2:True
 X-ITEM3:True
@@ -2350,6 +2504,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:True
 END:VEVENT
 END:VCALENDAR
@@ -2361,6 +2516,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM2:True
 X-ITEM1:False
 END:VEVENT
@@ -2373,6 +2529,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:True
 X-ITEM2:True
 X-ITEM1:False
@@ -2390,6 +2547,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 X-ITEM1:True
 END:VEVENT
@@ -2398,6 +2556,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:False
 END:VEVENT
 END:VCALENDAR
@@ -2409,6 +2568,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 X-ITEM2:True
 END:VEVENT
@@ -2417,6 +2577,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM2:False
 END:VEVENT
 END:VCALENDAR
@@ -2428,6 +2589,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 X-ITEM1:True
 X-ITEM2:True
@@ -2437,6 +2599,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:False
 X-ITEM2:False
 END:VEVENT
@@ -2453,6 +2616,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 X-ITEM1:True
 END:VEVENT
@@ -2461,6 +2625,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:False
 END:VEVENT
 END:VCALENDAR
@@ -2472,6 +2637,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 X-ITEM2:True
 END:VEVENT
@@ -2484,6 +2650,7 @@
 UID:12345-67890-1
 DTSTART:20071114T000000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 X-ITEM1:True
 X-ITEM2:True
@@ -2493,6 +2660,7 @@
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
 DURATION:PT1H
+DTSTAMP:20080601T120000Z
 X-ITEM1:False
 X-ITEM2:True
 END:VEVENT
@@ -2520,6 +2688,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114T000000Z
+DTSTAMP:20080601T120000Z
 SEQUENCE:0
 END:VEVENT
 END:VCALENDAR
@@ -2530,6 +2699,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2542,6 +2712,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114T000000Z
+DTSTAMP:20080601T120000Z
 TRANSP:OPAQUE
 ORGANIZER:mailto:user01 at example.com
 ATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION:mailto:user02 at example.com
@@ -2557,6 +2728,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 ATTENDEE;RSVP=TRUE:mailto:user02 at example.com
 ATTENDEE:mailto:user03 at example.com
@@ -2574,6 +2746,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=MO,WE,FR
 TRANSP:OPAQUE
 ORGANIZER:mailto:user01 at example.com
@@ -2590,6 +2763,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 ATTENDEE;RSVP=TRUE:mailto:user02 at example.com
 ATTENDEE:mailto:user03 at example.com
@@ -2625,6 +2799,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;TZID=US/Pacific:20071114T000000
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=MO,WE,FR
 TRANSP:OPAQUE
 ORGANIZER:mailto:user01 at example.com
@@ -2658,6 +2833,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;_TZID=US/Pacific:20071114T080000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER:mailto:user01 at example.com
 ATTENDEE;RSVP=TRUE:mailto:user02 at example.com
 ATTENDEE:mailto:user03 at example.com
@@ -2690,6 +2866,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2699,6 +2876,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2712,6 +2890,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
 ATTACH:http://example.com/file.txt
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2722,6 +2901,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
 ATTACH:http://example.com/file.txt
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2735,6 +2915,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
 ATTACH:http://example.com/calendars/user.dropbox/file.txt
+DTSTAMP:20080601T120000Z
 X-APPLE-DROPBOX:/calendars/user.dropbox
 END:VEVENT
 END:VCALENDAR
@@ -2745,6 +2926,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
+DTSTAMP:20080601T120000Z
 X-APPLE-DROPBOX:/calendars/user.dropbox
 END:VEVENT
 END:VCALENDAR
@@ -2759,6 +2941,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
 ATTACH:http://example.com/calendars/user.dropbox/file.txt
+DTSTAMP:20080601T120000Z
 X-APPLE-DROPBOX:/calendars/user1.dropbox
 END:VEVENT
 END:VCALENDAR
@@ -2770,6 +2953,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE-TIME:20071114
 ATTACH:http://example.com/calendars/user.dropbox/file.txt
+DTSTAMP:20080601T120000Z
 X-APPLE-DROPBOX:/calendars/user1.dropbox
 END:VEVENT
 END:VCALENDAR
@@ -2798,6 +2982,7 @@
 UID:12345-67890-1
 DTSTART:20090101T000000Z
 DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -2812,6 +2997,7 @@
 UID:12345-67890-1
 DTSTART:20090101T000000Z
 DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY;COUNT=2
 END:VEVENT
 END:VCALENDAR
@@ -2827,6 +3013,7 @@
 UID:12345-67890-1
 DTSTART:20090101T000000Z
 DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY;UNTIL=20090108T000000Z
 END:VEVENT
 END:VCALENDAR
@@ -2842,6 +3029,7 @@
 UID:12345-67890-1
 DTSTART:20090101T000000Z
 DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -2867,6 +3055,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -2877,6 +3066,7 @@
 RECURRENCE-ID:20090102T080000Z
 DTSTART:20090102T080000Z
 DTEND:20090102T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
             ),
@@ -2889,6 +3079,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z
 END:VEVENT
@@ -2900,6 +3091,7 @@
 RECURRENCE-ID:20090102T180000Z
 DTSTART:20090102T180000Z
 DTEND:20090102T190000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
             ),
@@ -2912,6 +3104,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z,20090103T180000Z
 RDATE:20090104T180000Z
@@ -2924,6 +3117,7 @@
 RECURRENCE-ID:20090103T180000Z
 DTSTART:20090103T180000Z
 DTEND:20090103T190000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
             ),
@@ -2936,6 +3130,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -2952,6 +3147,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z
 END:VEVENT
@@ -2969,6 +3165,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z,20090103T180000Z
 RDATE:20090104T180000Z
@@ -2987,6 +3184,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE:20090101
 DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY
 END:VEVENT
 END:VCALENDAR
@@ -2997,6 +3195,7 @@
 RECURRENCE-ID;VALUE=DATE:20090108
 DTSTART;VALUE=DATE:20090108
 DTEND;VALUE=DATE:20090109
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
             ),
@@ -3009,6 +3208,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE:20090101
 DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY
 RDATE;VALUE=DATE:20090103
 END:VEVENT
@@ -3020,6 +3220,7 @@
 RECURRENCE-ID;VALUE=DATE:20090103
 DTSTART;VALUE=DATE:20090103
 DTEND;VALUE=DATE:20090104
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
             ),
@@ -3032,6 +3233,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE:20090101
 DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY
 RDATE;VALUE=DATE:20090103,20090110
 RDATE;VALUE=DATE:20090118
@@ -3044,6 +3246,7 @@
 RECURRENCE-ID;VALUE=DATE:20090110
 DTSTART;VALUE=DATE:20090110
 DTEND;VALUE=DATE:20090111
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
             ),
@@ -3056,6 +3259,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE:20090101
 DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY
 END:VEVENT
 END:VCALENDAR
@@ -3072,6 +3276,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE:20090101
 DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY
 RDATE;VALUE=DATE:20090104
 END:VEVENT
@@ -3089,6 +3294,7 @@
 UID:12345-67890-1
 DTSTART;VALUE=DATE:20090101
 DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY
 RDATE;VALUE=DATE:20090104,20090111
 RDATE;VALUE=DATE:20090118
@@ -3118,6 +3324,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -3132,6 +3339,7 @@
 RECURRENCE-ID:20090102T080000Z
 DTSTART:20090102T080000Z
 DTEND:20090102T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                     """BEGIN:VEVENT
@@ -3139,6 +3347,7 @@
 RECURRENCE-ID:20090104T080000Z
 DTSTART:20090104T080000Z
 DTEND:20090104T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                 ),
@@ -3152,6 +3361,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z
 END:VEVENT
@@ -3167,6 +3377,7 @@
 RECURRENCE-ID:20090102T180000Z
 DTSTART:20090102T180000Z
 DTEND:20090102T190000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                     """BEGIN:VEVENT
@@ -3174,6 +3385,7 @@
 RECURRENCE-ID:20090104T080000Z
 DTSTART:20090104T080000Z
 DTEND:20090104T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                 ),
@@ -3187,6 +3399,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z,20090103T180000Z
 RDATE:20090104T180000Z
@@ -3203,6 +3416,7 @@
 RECURRENCE-ID:20090103T180000Z
 DTSTART:20090103T180000Z
 DTEND:20090103T190000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                     """BEGIN:VEVENT
@@ -3210,6 +3424,7 @@
 RECURRENCE-ID:20090105T080000Z
 DTSTART:20090105T080000Z
 DTEND:20090105T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                 ),
@@ -3223,6 +3438,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -3238,6 +3454,7 @@
 RECURRENCE-ID:20090103T080000Z
 DTSTART:20090103T080000Z
 DTEND:20090103T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                 ),
@@ -3251,6 +3468,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z
 END:VEVENT
@@ -3267,6 +3485,7 @@
 RECURRENCE-ID:20090103T080000Z
 DTSTART:20090103T080000Z
 DTEND:20090103T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                 ),
@@ -3280,6 +3499,7 @@
 UID:12345-67890-1
 DTSTART:20090101T080000Z
 DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20090102T180000Z,20090103T180000Z
 RDATE:20090104T180000Z
@@ -3297,6 +3517,7 @@
 RECURRENCE-ID:20090103T080000Z
 DTSTART:20090103T080000Z
 DTEND:20090103T090000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 """,
                 ),
@@ -3321,6 +3542,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -3334,6 +3556,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY;COUNT=2
 END:VEVENT
 END:VCALENDAR
@@ -3348,6 +3571,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY;UNTIL=20071128T000000Z
 END:VEVENT
 END:VCALENDAR
@@ -3362,6 +3586,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY;COUNT=2000
 END:VEVENT
 END:VCALENDAR
@@ -3372,6 +3597,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:COUNT=400;FREQ=WEEKLY
 END:VEVENT
 END:VCALENDAR
@@ -3385,6 +3611,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY;UNTIL=20471128T000000Z
 END:VEVENT
 END:VCALENDAR
@@ -3395,6 +3622,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:COUNT=400;FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -3408,6 +3636,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=WEEKLY;UNTIL=20071128T000000Z
 END:VEVENT
 END:VCALENDAR
@@ -3422,6 +3651,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -3432,6 +3662,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:COUNT=400;FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -3467,6 +3698,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -3484,6 +3716,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RDATE:20091004T000000Z
 END:VEVENT
 END:VCALENDAR
@@ -3503,6 +3736,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 END:VCALENDAR
@@ -3523,6 +3757,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20091004T010000Z
 END:VEVENT
@@ -3545,6 +3780,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20091004T010000Z
 EXDATE:20091003T000000Z
@@ -3569,6 +3805,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 END:VEVENT
 BEGIN:VEVENT
@@ -3595,6 +3832,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 RRULE:FREQ=DAILY
 RDATE:20071115T010000Z
 END:VEVENT
@@ -3602,6 +3840,7 @@
 UID:12345-67890-1
 RECURRENCE-ID:20071115T010000Z
 DTSTART:20071115T020000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -3624,6 +3863,7 @@
 UID:12345-67890-1
 RECURRENCE-ID:20071115T000000Z
 DTSTART:20071115T010000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -3642,6 +3882,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -3657,6 +3898,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -3672,6 +3914,7 @@
 BEGIN:VEVENT
 UID:12345-67890-1
 DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
 END:VEVENT
 END:VCALENDAR
 """,
@@ -3784,11 +4027,12 @@
 
         for text in invalid:
             calendar = Component.fromString(text)
-            self.assertRaises(InvalidICalendarDataError, calendar.validateForCalDAV)
+            self.assertRaises(InvalidICalendarDataError, calendar.validCalendarData, doFix=False)
         for text in valid:
             calendar = Component.fromString(text)
             try:
-                calendar.validateForCalDAV()
+                calendar.validCalendarData()
+                calendar.validCalendarForCalDAV(methodAllowed=False)
             except:
                 self.fail("Valid calendar should validate")
 
@@ -3798,6 +4042,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -3841,6 +4086,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -3866,6 +4112,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -3903,6 +4150,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -3948,6 +4196,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -3979,6 +4228,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -4024,6 +4274,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -4078,6 +4329,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -4089,6 +4341,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 RECURRENCE-ID:20080602T120000Z
+DTSTAMP:20080601T120000Z
 DTSTART:20080602T130000Z
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
@@ -4132,6 +4385,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -4142,6 +4396,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 RECURRENCE-ID:20080602T120000Z
+DTSTAMP:20080601T120000Z
 DTSTART:20080602T130000Z
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com
@@ -4208,6 +4463,7 @@
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
 ATTENDEE:mailto:user1 at example.com
@@ -4218,6 +4474,7 @@
 BEGIN:VEVENT
 UID:12345-67890
 RECURRENCE-ID:20080602T120000Z
+DTSTAMP:20080601T120000Z
 DTSTART:20080602T130000Z
 DTEND:20080602T140000Z
 ATTENDEE:mailto:user1 at example.com

Modified: CalendarServer/trunk/twistedcaldav/test/test_multiget.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_multiget.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_multiget.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -121,6 +121,7 @@
 UID:good
 DTSTART;VALUE=DATE:20020101
 DTEND;VALUE=DATE:20020102
+DTSTAMP:20020101T121212Z
 RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20031231;BYMONTH=1
 SUMMARY:New Year's Day
 END:VEVENT
@@ -134,6 +135,7 @@
 UID:bad
 DTSTART;VALUE=DATE:20020214
 DTEND;VALUE=DATE:20020215
+DTSTAMP:20020101T121212Z
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2
 SUMMARY:Valentine's Day
 END:VEVENT
@@ -154,6 +156,7 @@
 UID:bad
 DTSTART;VALUE=DATE:20020214
 DTEND;VALUE=DATE:20020
+DTSTAMP:20020101T121212Z
 END:VCALENDAR
 """.replace("\n", "\r\n"))
         f.close

Modified: CalendarServer/trunk/twistedcaldav/test/test_validation.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_validation.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_validation.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -48,8 +48,10 @@
     def _getSampleCalendar(self):
         return Component.fromString("""BEGIN:VCALENDAR
 VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
 BEGIN:VEVENT
 UID:12345-67890
+DTSTAMP:20071114T000000Z
 DTSTART:20071114T000000Z
 ORGANIZER:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com

Modified: CalendarServer/trunk/twistedcaldav/test/test_xml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_xml.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_xml.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -30,7 +30,8 @@
     calendar_file = os.path.join(os.path.dirname(__file__), "data", "Holidays",
                                  "C3184A66-1ED0-11D9-A5E0-000A958A3252.ics")
     calendar = Component.fromStream(file(calendar_file))
-    calendar.validateForCalDAV()
+    calendar.validCalendarData()
+    calendar.validCalendarForCalDAV(methodAllowed=False)
 
     def test_ComponentFilter(self):
         """

Modified: CalendarServer/trunk/twistedcaldav/vcard.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/vcard.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/vcard.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -27,15 +27,18 @@
 import cStringIO as StringIO
 import codecs
 
+from twext.python.log import Logger
 from twext.web2.stream import IStream
 from twext.web2.dav.util import allDataFromStream
 
 from pycalendar.attribute import PyCalendarAttribute
 from pycalendar.componentbase import PyCalendarComponentBase
-from pycalendar.exceptions import PyCalendarInvalidData
+from pycalendar.exceptions import PyCalendarError
 from pycalendar.vcard.card import Card
 from pycalendar.vcard.property import Property as pyProperty
 
+log = Logger()
+
 vCardProductID = "-//CALENDARSERVER.ORG//NONSGML Version 1//EN"
 
 class InvalidVCardDataError(ValueError):
@@ -197,7 +200,7 @@
         """
         try:
             results = Card.parseMultiple(stream)
-        except PyCalendarInvalidData:
+        except PyCalendarError:
             results = None
         if not results:
             stream.seek(0)
@@ -235,7 +238,7 @@
         cal = Card()
         try:
             result = cal.parse(stream)
-        except PyCalendarInvalidData:
+        except PyCalendarError:
             result = None
         if not result:
             stream.seek(0)
@@ -409,6 +412,26 @@
 
         return self._resource_uid
 
+    def validVCardData(self, doFix=True, doRaise=True):
+        """
+        @return: tuple of fixed, unfixed issues
+        @raise InvalidVCardDataError: if the given vcard data is not valid.
+        """
+        if self.name() != "VCARD":
+            log.debug("Not a vcard: %s" % (self,))
+            raise InvalidVCardDataError("Not a vcard")
+
+        # Do underlying vCard library validation with data fix
+        fixed, unfixed = self._pycard.validate(doFix=doFix)
+        if unfixed:
+            log.debug("vCard data had unfixable problems:\n  %s" % ("\n  ".join(unfixed),))
+            if doRaise:
+                raise InvalidVCardDataError("Calendar data had unfixable problems:\n  %s" % ("\n  ".join(unfixed),))
+        if fixed:
+            log.debug("vCard data had fixable problems:\n  %s" % ("\n  ".join(fixed),))
+        
+        return fixed, unfixed
+
     def validForCardDAV(self):
         """
         @raise ValueError: if the given vcard data is not valid.

Modified: CalendarServer/trunk/txdav/caldav/datastore/file.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/file.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/file.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -14,6 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
+from twistedcaldav.ical import InvalidICalendarDataError
 
 """
 File calendar store.
@@ -37,7 +38,6 @@
 
 from txdav.base.propertystore.xattr import PropertyStore
 
-from twext.python.vcomponent import InvalidICalendarDataError
 from twext.python.vcomponent import VComponent
 from twext.web2.dav import davxml
 from twext.web2.dav.element.rfc2518 import ResourceType, GETContentType
@@ -302,8 +302,8 @@
             self.name(), component
         )
 
-        self._component = component
-        # FIXME: needs to clear text cache
+        componentText = str(component)
+        self._objectText = componentText
 
         def do():
             # Mark all properties as dirty, so they can be added back
@@ -315,7 +315,6 @@
                 backup = hidden(self._path.temporarySibling())
                 self._path.moveTo(backup)
             
-            componentText = str(component)
             fh = self._path.open("w")
             try:
                 # FIXME: concurrency problem; if this write is interrupted
@@ -342,23 +341,38 @@
 
 
     def component(self):
+        """
+        Read calendar data and validate/fix it. Do not raise a store error here if there are unfixable
+        errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+        the caller - that is not ideal but in theory we should have checked everything on the way in and
+        only allowed in good data.
+        """
         text = self._text()
-
         try:
             component = VComponent.fromString(text)
-            # Fix any bogus data we can
-            component.validateComponentsForCalDAV(False, fix=True)
         except InvalidICalendarDataError, e:
+            # This is a really bad situation, so do raise
             raise InternalDataStoreError(
                 "File corruption detected (%s) in file: %s"
                 % (e, self._path.path)
             )
+
+        # Fix any bogus data we can
+        fixed, unfixed = component.validCalendarData(doFix=True, doRaise=False)
+
+        if unfixed:
+            self.log_error("Calendar data at %s had unfixable problems:\n  %s" % (self._path.path, "\n  ".join(unfixed),))
+        
+        if fixed:
+            self.log_error("Calendar data at %s had fixable problems:\n  %s" % (self._path.path, "\n  ".join(fixed),))
+
         return component
 
 
     def _text(self):
-        if self._component is not None:
-            return str(self._component)
+        if self._objectText is not None:
+            return self._objectText
+
         try:
             fh = self._path.open()
         except IOError, e:
@@ -388,6 +402,8 @@
                     "File corruption detected (improper start) in file: %s"
                     % (self._path.path,)
                 )
+        
+        self._objectText = text
         return text
 
     def uid(self):

Modified: CalendarServer/trunk/txdav/caldav/datastore/index_file.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/index_file.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/index_file.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -1046,7 +1046,8 @@
             # FIXME: This is blocking I/O
             try:
                 calendar = Component.fromStream(stream)
-                calendar.validateForCalDAV()
+                calendar.validCalendarData()
+                calendar.validCalendarForCalDAV(methodAllowed=False)
             except ValueError:
                 log.err("Non-calendar resource: %s" % (name,))
             else:
@@ -1149,8 +1150,8 @@
             # FIXME: This is blocking I/O
             try:
                 calendar = Component.fromStream(stream)
-                calendar.validCalendarForCalDAV()
-                calendar.validateComponentsForCalDAV(True)
+                calendar.validCalendarData()
+                calendar.validCalendarForCalDAV(methodAllowed=True)
             except ValueError:
                 log.err("Non-calendar resource: %s" % (name,))
             else:

Modified: CalendarServer/trunk/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/sql.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/sql.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -39,7 +39,7 @@
 from twistedcaldav.config import config
 from twistedcaldav.dateops import normalizeForIndex, datetimeMktime,\
     parseSQLTimestamp, pyCalendarTodatetime
-from twistedcaldav.ical import Component
+from twistedcaldav.ical import Component, InvalidICalendarDataError
 from twistedcaldav.instance import InvalidOverriddenInstanceError
 from twistedcaldav.memcacher import Memcacher
 
@@ -71,7 +71,8 @@
 from txdav.caldav.icalendarstore import QuotaExceeded
 
 from txdav.caldav.datastore.util import StorageTransportBase
-from txdav.common.icommondatastore import IndexedSearchException
+from txdav.common.icommondatastore import IndexedSearchException,\
+    InternalDataStoreError
 
 from pycalendar.datetime import PyCalendarDateTime
 from pycalendar.duration import PyCalendarDuration
@@ -614,9 +615,35 @@
 
     @inlineCallbacks
     def component(self):
-        returnValue(VComponent.fromString((yield self._text())))
+        """
+        Read calendar data and validate/fix it. Do not raise a store error here if there are unfixable
+        errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+        the caller - that is not ideal but in theory we should have checked everything on the way in and
+        only allowed in good data.
+        """
+        text = yield self._text()
 
+        try:
+            component = VComponent.fromString(text)
+        except InvalidICalendarDataError, e:
+            # This is a really bad situation, so do raise
+            raise InternalDataStoreError(
+                "Data corruption detected (%s) in id: %s"
+                % (e, self._resourceID)
+            )
 
+        # Fix any bogus data we can
+        fixed, unfixed = component.validCalendarData(doFix=True, doRaise=False)
+
+        if unfixed:
+            self.log_error("Calendar data id=%s had unfixable problems:\n  %s" % (self._resourceID, "\n  ".join(unfixed),))
+        
+        if fixed:
+            self.log_error("Calendar data id=%s had fixable problems:\n  %s" % (self._resourceID, "\n  ".join(fixed),))
+
+        returnValue(component)
+
+
     @inlineCallbacks
     def organizer(self):
         returnValue((yield self.component()).getOrganizer())

Modified: CalendarServer/trunk/txdav/caldav/datastore/test/common.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/common.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/common.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -927,6 +927,7 @@
 BEGIN:VEVENT
 DTSTART:20110101T120000Z
 DTEND:20110101T120100Z
+DTSTAMP:20080601T120000Z
 UID:event-with-some-per-user-data
 ATTENDEE:urn:uuid:home1
 ORGANIZER:urn:uuid:home1
@@ -937,6 +938,7 @@
 BEGIN:VALARM
 ACTION:DISPLAY
 DESCRIPTION:somebody else
+TRIGGER:-PT20M
 END:VALARM
 END:X-CALENDARSERVER-PERINSTANCE
 END:X-CALENDARSERVER-PERUSER
@@ -946,6 +948,7 @@
 BEGIN:VALARM
 ACTION:DISPLAY
 DESCRIPTION:the owner
+TRIGGER:-PT20M
 END:VALARM
 END:X-CALENDARSERVER-PERINSTANCE
 END:X-CALENDARSERVER-PERUSER
@@ -959,12 +962,14 @@
 BEGIN:VEVENT
 DTSTART:20110101T120000Z
 DTEND:20110101T120100Z
+DTSTAMP:20080601T120000Z
 UID:event-with-some-per-user-data
 ATTENDEE:urn:uuid:home1
 ORGANIZER:urn:uuid:home1
 BEGIN:VALARM
 ACTION:DISPLAY
 DESCRIPTION:the owner
+TRIGGER:-PT20M
 END:VALARM
 END:VEVENT
 END:VCALENDAR
@@ -977,12 +982,14 @@
 BEGIN:VEVENT
 DTSTART:20110101T120000Z
 DTEND:20110101T120100Z
+DTSTAMP:20080601T120000Z
 UID:event-with-some-per-user-data
 ATTENDEE:urn:uuid:home1
 ORGANIZER:urn:uuid:home1
 BEGIN:VALARM
 ACTION:DISPLAY
 DESCRIPTION:somebody else
+TRIGGER:-PT20M
 END:VALARM
 END:VEVENT
 END:VCALENDAR
@@ -1008,8 +1015,11 @@
         filtered per-user data.
         """
         obj = yield self.setUpPerUser()
+        temp = yield obj.component()
+        obj._component = temp.duplicate()
         otherComp = (yield obj.filteredComponent("some-other-user"))
         self.assertEquals(otherComp, self.asSeenByOther())
+        obj._component = temp.duplicate()
         ownerComp = (yield obj.filteredComponent("home1"))
         self.assertEquals(ownerComp, self.asSeenByOwner())
 
@@ -1431,7 +1441,7 @@
         now that logic lives in the protocol layer, so this testing method
         replicates it.
         """
-        uuid, rev = token.split("_", 1)
+        _ignore_uuid, rev = token.split("_", 1)
         rev = int(rev)
         return rev
 

Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -49,7 +49,8 @@
         try:
             component = Component.fromString(text)
             # Fix any bogus data we can
-            component.validateComponentsForCalDAV(False, fix=True)
+            component.validCalendarData()
+            component.validCalendarForCalDAV(methodAllowed=False)
         except InvalidICalendarDataError, e:
             raise InternalDataStoreError(
                 "File corruption detected (%s) in file: %s"
@@ -163,6 +164,7 @@
 UID:12345-67890-1.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -182,6 +184,7 @@
 UID:12345-67890-2.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -202,6 +205,7 @@
 UID:12345-67890-2.2
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -212,6 +216,7 @@
 RECURRENCE-ID:20080608T120000Z
 DTSTART:20080608T120000Z
 DTEND:20080608T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -231,6 +236,7 @@
 UID:12345-67890-2.3
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -241,6 +247,7 @@
 RECURRENCE-ID:20080609T120000Z
 DTSTART:20080608T120000Z
 DTEND:20080608T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -260,6 +267,7 @@
 UID:12345-67890-2.4
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -270,6 +278,7 @@
 RECURRENCE-ID:20080609T120000Z
 DTSTART:20080608T120000Z
 DTEND:20080608T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -322,6 +331,7 @@
 UID:12345-67890-1.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -342,6 +352,7 @@
 UID:12345-67890-1.2
 DTSTART:20080602T120000Z
 DTEND:20080602T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -363,6 +374,7 @@
 UID:12345-67890-1.3
 DTSTART:20080603T120000Z
 DTEND:20080603T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -384,6 +396,7 @@
 UID:12345-67890-1.4
 DTSTART:20080604T120000Z
 DTEND:20080604T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -405,6 +418,7 @@
 UID:12345-67890-2.1
 DTSTART:20080605T120000Z
 DTEND:20080605T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -429,6 +443,7 @@
 UID:12345-67890-2.2
 DTSTART:20080607T120000Z
 DTEND:20080607T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -439,6 +454,7 @@
 RECURRENCE-ID:20080608T120000Z
 DTSTART:20080608T140000Z
 DTEND:20080608T150000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -502,6 +518,7 @@
 UID:12345-67890-1.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -543,6 +560,7 @@
 UID:12345-67890-1.2
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -599,6 +617,7 @@
 UID:12345-67890-1.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -647,6 +666,7 @@
 UID:12345-67890-1.2
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -713,6 +733,7 @@
 UID:12345-67890-1.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -723,6 +744,7 @@
 RECURRENCE-ID:20080602T120000Z
 DTSTART:20080602T130000Z
 DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -776,6 +798,7 @@
 UID:12345-67890-1.2
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -786,6 +809,7 @@
 RECURRENCE-ID:20080602T120000Z
 DTSTART:20080602T130000Z
 DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -899,6 +923,7 @@
 UID:12345-67890-1.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -912,6 +937,7 @@
 UID:12345-67890-2.1
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com
@@ -926,6 +952,7 @@
 UID:12345-67890-2.3
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
 ORGANIZER;CN="User 01":mailto:user1 at example.com
 ATTENDEE:mailto:user1 at example.com
 ATTENDEE:mailto:user2 at example.com

Modified: CalendarServer/trunk/txdav/caldav/datastore/util.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/util.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/util.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -64,12 +64,10 @@
         pass
 
     try:
-        # FIXME: This is a bad way to do this test, there should be a
+        # FIXME: This is a bad way to do this test (== 'inbox'), there should be a
         # Calendar-level API for it.
-        if calendar.name() == 'inbox':
-            component.validateComponentsForCalDAV(True)
-        else:
-            component.validateForCalDAV()
+        component.validCalendarData()
+        component.validCalendarForCalDAV(methodAllowed=calendar.name() == 'inbox')
     except InvalidICalendarDataError, e:
         raise InvalidObjectResourceError(e)
 

Modified: CalendarServer/trunk/txdav/carddav/datastore/file.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/file.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/file.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -144,9 +144,6 @@
             ),
         )
 
-    def _doValidate(self, component):
-        component.validForCardDAV()
-
     def contentType(self):
         """
         The content type of Addresbook objects is text/vcard.
@@ -181,8 +178,8 @@
             self.name(), component
         )
 
-        self._component = component
-        # FIXME: needs to clear text cache
+        componentText = str(component)
+        self._objectText = componentText
 
         def do():
             # Mark all properties as dirty, so they can be added back
@@ -194,7 +191,6 @@
                 backup = hidden(self._path.temporarySibling())
                 self._path.moveTo(backup)
 
-            componentText = str(component)
             fh = self._path.open("w")
             try:
                 # FIXME: concurrency problem; if this write is interrupted
@@ -221,23 +217,38 @@
 
 
     def component(self):
-        if self._component is not None:
-            return self._component
+        """
+        Read address data and validate/fix it. Do not raise a store error here if there are unfixable
+        errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+        the caller - that is not ideal but in theory we should have checked everything on the way in and
+        only allowed in good data.
+        """
         text = self._text()
-
         try:
             component = VComponent.fromString(text)
         except InvalidVCardDataError, e:
+            # This is a really bad situation, so do raise
             raise InternalDataStoreError(
                 "File corruption detected (%s) in file: %s"
                 % (e, self._path.path)
             )
+
+        # Fix any bogus data we can
+        fixed, unfixed = component.validVCardData(doFix=True, doRaise=False)
+
+        if unfixed:
+            self.log_error("Address data at %s had unfixable problems:\n  %s" % (self._path.path, "\n  ".join(unfixed),))
+        
+        if fixed:
+            self.log_error("Address data at %s had fixable problems:\n  %s" % (self._path.path, "\n  ".join(fixed),))
+
         return component
 
 
     def _text(self):
-        if self._component is not None:
-            return str(self._component)
+        if self._objectText is not None:
+            return self._objectText
+
         try:
             fh = self._path.open()
         except IOError, e:
@@ -259,6 +270,8 @@
                 "File corruption detected (improper start) in file: %s"
                 % (self._path.path,)
             )
+        
+        self._objectText = text
         return text
 
     def uid(self):

Modified: CalendarServer/trunk/txdav/carddav/datastore/index_file.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/index_file.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/index_file.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -589,6 +589,7 @@
                 # FIXME: This is blocking I/O
                 try:
                     vcard = Component.fromStream(stream)
+                    vcard.validVCardData()
                     vcard.validForCardDAV()
                 except ValueError:
                     log.err("Non-addressbook resource: %s" % (name,))

Modified: CalendarServer/trunk/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/sql.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/sql.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -14,6 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
+from txdav.common.icommondatastore import InternalDataStoreError
 
 """
 SQL backend for CardDAV storage.
@@ -35,7 +36,7 @@
 
 from twistedcaldav import carddavxml, customxml
 from twistedcaldav.memcacher import Memcacher
-from twistedcaldav.vcard import Component as VCard
+from twistedcaldav.vcard import Component as VCard, InvalidVCardDataError
 
 from txdav.common.datastore.sql_legacy import \
     PostgresLegacyABIndexEmulator, SQLLegacyAddressBookInvites,\
@@ -177,10 +178,6 @@
         )
 
 
-    def _doValidate(self, component):
-        component.validForCardDAV()
-
-
     def contentType(self):
         """
         The content type of Addresbook objects is text/vcard.
@@ -271,13 +268,39 @@
 
     @inlineCallbacks
     def component(self):
-        returnValue(VCard.fromString((yield self._text())))
+        """
+        Read address data and validate/fix it. Do not raise a store error here if there are unfixable
+        errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+        the caller - that is not ideal but in theory we should have checked everything on the way in and
+        only allowed in good data.
+        """
+        text = yield self._text()
 
+        try:
+            component = VCard.fromString(text)
+        except InvalidVCardDataError, e:
+            # This is a really bad situation, so do raise
+            raise InternalDataStoreError(
+                "Data corruption detected (%s) in id: %s"
+                % (e, self._resourceID)
+            )
 
+        # Fix any bogus data we can
+        fixed, unfixed = component.validVCardData(doFix=True, doRaise=False)
+
+        if unfixed:
+            self.log_error("Address data id=%s had unfixable problems:\n  %s" % (self._resourceID, "\n  ".join(unfixed),))
+        
+        if fixed:
+            self.log_error("Address data id=%s had fixable problems:\n  %s" % (self._resourceID, "\n  ".join(fixed),))
+
+        returnValue(component)
+
+
     # IDataStoreObject
     def contentType(self):
         """
-        The content type of Addressbook objects is text/x-vcard.
+        The content type of Addressbook objects is text/vcard.
         """
         return MimeType.fromString("text/vcard; charset=utf-8")
 

Modified: CalendarServer/trunk/txdav/carddav/datastore/util.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/util.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/util.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -58,6 +58,7 @@
         pass
 
     try:
+        component.validVCardData()
         component.validForCardDAV()
     except InvalidVCardDataError, e:
         raise InvalidObjectResourceError(e)

Modified: CalendarServer/trunk/txdav/common/datastore/file.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/file.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/common/datastore/file.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -857,9 +857,6 @@
         """
         pass
 
-    def _doValidate(self, component):
-        raise NotImplementedError
-
     def addNotifier(self, notifier):
         if self._notifiers is None:
             self._notifiers = ()
@@ -906,7 +903,7 @@
         self._name = name
         self._parentCollection = parent
         self._transaction = parent._transaction
-        self._component = None
+        self._objectText = None
 
 
     @property
@@ -1088,12 +1085,7 @@
         name = uid + ".xml"
         self.removeNotificationObjectWithName(name)
 
-    def _doValidate(self, component):
-        # Nothing to do - notifications are always generated internally by the server
-        # so they better be valid all the time!
-        pass
 
-
 class NotificationObject(CommonObjectResource):
     """
     """

Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py	2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py	2011-06-30 16:29:37 UTC (rev 7694)
@@ -2037,10 +2037,6 @@
         """
 
 
-    def _doValidate(self, component):
-        raise NotImplementedError
-
-
     # IDataStoreObject
     def contentType(self):
         raise NotImplementedError()
@@ -2095,9 +2091,7 @@
 
 class CommonObjectResource(LoggingMixIn, FancyEqMixin):
     """
-    @ivar _path: The path of the file on disk
-
-    @type _path: L{FilePath}
+    Base class for object resources.
     """
 
     compareAttributes = (
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110630/c2139159/attachment-0001.html>


More information about the calendarserver-changes mailing list