<?xml version="1.0" encoding="UTF-8"?>

<!-- ******************* -->
<!-- Entity declarations -->
<!-- ******************* -->

<!ENTITY % attr.altrep "
altrep ENTITY #IMPLIED
">

<!ENTITY % attr.cn "
cn CDATA ''
">

<!ENTITY % attr.cutype "
cutype NMTOKEN 'INDIVIDUAL'
">
<!-- Valid name tokens are "INDIVIDUAL", "GROUP", "RESOURCE" -->
<!-- "ROOM", "UNKNOWN", a non-standard "X-" name or another -->
<!-- IANA registered name. -->

<!ENTITY % attr.delegated-from "
delegated-from CDATA #IMPLIED
">
<!-- delegated-from value is a calendar user address -->

<!ENTITY % attr.delegated-to "
delegated-to CDATA #IMPLIED
">
<!-- delegated-to value is one or more calendar user addresses -->

<!ENTITY % attr.dir "
dir ENTITY #IMPLIED
">
<!-- dir value is a URI to a directory entry -->

<!ENTITY % attr.fmttype "
fmttype CDATA #REQUIRED
">
<!-- fmttype value is any IANA registered content type -->

<!ENTITY % attr.fbtype "
fbtype NMTOKEN 'BUSY'
">


<!-- Valid token values are "FREE", "BUSY", "BUSY-UNAVAILABLE", -->
<!-- "BUSY-TENTATIVE", a non-standard "X-" name or another -->
<!-- IANA registered name. -->

<!ENTITY % attr.language "
language CDATA #IMPLIED
">
<!-- language value is a valid RFC 1766 language string -->

<!ENTITY % attr.member "
member CDATA #IMPLIED
">
<!-- member value is one or more calendar user addresses -->

<!ENTITY % attr.partstat "
partstat NMTOKEN 'NEEDS-ACTION'
">
<!-- Valid token value for VEVENT: "NEEDS-ACTION", "ACCEPTED", -->
<!-- "DECLINED", "TENTATIVE", "DELEGATED", a non-standard "X- -->
<!-- name or another IANA registered name. -->

<!-- Valid token value for VTODO: "NEEDS-ACTION", "ACCEPTED", -->
<!-- "DECLINED", "TENTATIVE", "DELEGATED", "COMPLETED", -->
<!-- "IN-PROGRESS, a non-standard "X- name or another IANA -->
<!-- registered name. -->
<!-- Valid token value for VJOURNAL: "NEEDS-ACTION", "ACCEPTED", -->
<!-- "DECLINED", a non-standard "X- name or another IANA -->
<!-- registered name. -->

<!ENTITY % attr.range "
range NMTOKEN 'THISONLY'
">
<!-- Valid token values are "THISONLY" or "THISANDPRIOR" or -->
<!-- "THISANDFUTURE" -->

<!ENTITY % attr.related "
related NMTOKEN 'START'
">
<!-- Valid token values are "START" or "END" -->

<!ENTITY % attr.reltype "
reltype NMTOKEN 'PARENT'
">
<!-- Valid token values are "PARENT", "CHILD", SIBLING", -->
<!-- a non-standard "X-" name or any IANA registered name. -->

<!ENTITY % attr.role "
role NMTOKEN 'REQ-PARTICIPANT'
">


<!-- Valid token values are "CHAIR", "REQ-PARTICIPANT", -->
<!-- "OPT-PARTICIPANT", "NON-PARTICIPANT", a non-standard "X-" -->
<!-- name or any IANA registered name. -->

<!ENTITY % attr.rsvp "
rsvp NMTOKEN 'FALSE'
">
<!-- Valid token values are "TRUE" or "FALSE", -->

<!ENTITY % attr.sent-by "
sent-by CDATA #IMPLIED
">
<!-- sent-by value is a calendar user address -->

<!ENTITY % attr.tzid "
tzid CDATA #IMPLIED
">
<!-- tzid value is a time zone identifier -->

<!ENTITY % cal.comp "
vevent | vtodo | vjournal | vfreebusy | vtimezone
">

<!ENTITY % vevent.opt1 "
class | created | description | dtstamp | dtstart | geo |
last-modified | location | organizer | priority | recurrence-id |
sequence | status | summary | transp | uid | url |
(dtend | duration)
">
<!-- These properties may only appear once in a VEVENT -->
<!ENTITY % vevent.optm "
attach | attendee | categories | comment | contact |
exdate | exrule | rdate | related-to | resources | request-status |
rrule
">
<!-- These properties may appear one or more times in a VEVENT -->

<!ENTITY % vtodo.opt1 "
class | completed | created | description | dtstamp | dtstart |
geo | last-modified | location | organizer | percent | priority |
recurrence-id | sequence | status | summary | uid | url |
(due | duration)
">
<!-- These properties may only appear once in a VTODO -->

<!ENTITY % vtodo.optm "
attach | attendee | categories | comment | contact |
exdate | exrule | request-status | related-to | resources |
rdate | rrule


">
<!-- These properties may appear one or more times in a VTODO -->

<!ENTITY % vjournal.opt1 "
class | created | description | dtstart | dtstamp | last-modified |
organizer | recurrence-id | sequence | status | summary | uid | url
">
<!-- These properties may only appear once in a VJOURNAL -->

<!ENTITY % vjournal.optm "
attach | attendee | categories | comment | contact |
exdate | exrule | related-to | rdate | rrule | request-status
">
<!-- These properties may appear one or more times in a VJOURNAL -->

<!ENTITY % vfreebusy.opt1 "
contact | dtstamp | dtstart | dtend | duration |
organizer | uid | url
">
<!-- These properties may only appear once in a VFREEBUSY -->

<!ENTITY % vfreebusy.optm "
attendee | comment | freebusy | request-status
">
<!-- These properties may appear one or more times in a -->
<!-- VFREEBUSY -->

<!ENTITY % vtimezone.man "
tzid
">
<!-- These properties must appear in a VTIMEZONE -->

<!ENTITY % vtimezone.opt1 "
last-modified | tzurl
">
<!-- These properties may only appear once in a VTIMEZONE -->

<!ENTITY % vtimezone.mann "
(standard | daylight), (standard | daylight)*
">
<!-- These properties must appear in a VTIMEZONE and may -->
<!-- appear multiple times -->

<!ENTITY % standard.man "
dtstart | tzoffsetto | tzoffsetfrom
">
<!-- These properties must appear in a STANDARD, but only once -->

<!ENTITY % standard.optm "


comment | rdate | rrule | tzname
">
<!-- These properties may appear one or more times in a STANDARD -->

<!ENTITY % daylight.man "
dtstart | tzoffsetto | tzoffsetfrom
">
<!-- These properties must appear in a DAYLIGHT, but only once -->

<!ENTITY % daylight.optm "
comment | rdate | rrule | tzname
">
<!-- These properties may appear one or more times in a DAYLIGHT -->

<!ENTITY % audio.man "
action, trigger
">
<!-- These properties must appear in an audio VALARM. -->

<!ENTITY % audio.optx "
duration | repeat
">
<!-- These properties may appear once in an audio VALARM. If one -->
<!-- appears, then both must appear. -->

<!ENTITY % audio.opt1 "
attach
">
<!-- These properties may appear once in an audio VALARM. -->

<!ENTITY % valarm.audio "
(%audio.man;), (%audio.optx;)*, (%audio.opt1;)
">

<!ENTITY % display.man "
action, description, trigger
">
<!-- These properties must appear in a display VALARM. -->
<!ENTITY % display.optx "
duration | repeat
">
<!-- These properties may appear once in a display VALARM. If -->
<!-- one appears, then both must appear. -->

<!ENTITY % valarm.display "
(%display.man;), (%display.optx;)*
">

<!ENTITY % email.man "
action, description, summary, trigger
">
<!-- These properties must appear in an email VALARM. -->

<!ENTITY % email.optx "
duration | repeat
">
<!-- These properties may appear once in an email VALARM. If one -->
<!-- appears, then both must appear. -->

<!ENTITY % email.optm "
attach
">
<!-- These properties may appear one or more times in an email -->
<!-- VALARM. -->

<!ENTITY % email.mann "
attendee
">
<!-- These properties must appear in an email VALARM. The may -->
<!-- appear more than once. -->

<!ENTITY % valarm.email "
(%email.man;), (%email.optx;)*, (%email.optm;)*,
(%email.mann;)*
">

<!ENTITY % procedure.man "
action, attach, trigger
">
<!-- These properties must appear in an audio VALARM. -->

<!ENTITY % procedure.optx "
duration | repeat
">
<!-- These properties may appear once in an procedure VALARM. -->
<!-- If one appears, then both must appear. -->

<!ENTITY % procedure.opt1 "
description
">
<!-- These properties may appear once in a procedure VALARM -->
<!ENTITY % valarm.procedure "
(%procedure.man;), (%procedure.optx;)*, (%procedure.opt1;)?
">

<!-- ******************************************** -->
<!-- iCalendar value type notation declarations   -->
<!-- ******************************************** -->


<!-- NOTE: The "XCAL" text in the following NOTATION values
will be replaced with the text "RFC xxxx", where "xxxx" is the RFC
number, when this memo is published as a RFC. -->

<!NOTATION BINARY PUBLIC "-//IETF//NOTATION XCAL/Value Type/Binary//EN">

<!NOTATION BOOLEAN PUBLIC "-//IETF//NOTATION XCAL/Value Type/Boolean//EN">

<!NOTATION CALADR PUBLIC "-//IETF//NOTATION XCAL/Value Type/Calendar
User Address//EN">

<!NOTATION DATE PUBLIC "-//IETF//NOTATION XCAL/Value Type/Date//EN">

<!NOTATION DATE-TIME PUBLIC "-//IETF//NOTATION XCAL/Value
Type/Date-Time//EN">

<!NOTATION DURATION PUBLIC "-//IETF//NOTATION XCAL/Value
Type/Duration//EN">

<!NOTATION FLOAT PUBLIC "-//IETF//NOTATION XCAL/Value Type/Float//EN">

<!NOTATION INTEGER PUBLIC "-//IETF//NOTATION XCAL/Value Type/Integer//EN">

<!NOTATION PERIOD PUBLIC "-//IETF//NOTATION XCAL/Value
Type/Period of Time//EN">

<!NOTATION RECUR PUBLIC "-//IETF//NOTATION XCAL/Value
Type/Recurrence Rule//EN">

<!NOTATION TEXT PUBLIC "-//IETF//NOTATION XCAL/Value Type/Text//EN">

<!NOTATION TIME PUBLIC "-//IETF//NOTATION XCAL/Value Type/Time//EN">

<!NOTATION URI PUBLIC "-//IETF//NOTATION XCAL/Value Type/URI//EN">

<!NOTATION UTC-OFFSET PUBLIC "-//IETF//NOTATION XCAL/Value
Type/UTC-Offset//EN">

<!NOTATION X-NAME PUBLIC "-//IETF//NOTATION XCAL/Value Type/X-Name//EN">

<!-- ************************************************* -->
<!-- iCalendar property element/attribute declarations -->
<!-- ************************************************* -->

<!ELEMENT br EMPTY>
<!-- Signifies a new line in the TEXT value content information -->

<!-- Description component properties element type declarations -->


   <!ELEMENT attach (extref | b64bin)>
   <!-- extref holds a reference to an external entity that -->
   <!-- has the attachment. b64bin holds the inline BASE64 encoded -->
   <!-- binary data for the attachment as defined in RFC 2045. -->

   <!ELEMENT extref EMPTY>
   <!ATTLIST extref
   uri ENTITY #REQUIRED>

   <!ELEMENT b64bin (#PCDATA)>
   <!ATTLIST b64bin
   %attr.fmttype;
   value NOTATION (BINARY) #IMPLIED>

   <!ELEMENT categories (item)*>

   <!ELEMENT item (#PCDATA)>
   <!ATTLIST item
   %attr.language;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT class (#PCDATA)>
   <!ATTLIST class
   %attr.language;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT comment (#PCDATA)*>
   <!ATTLIST comment
   %attr.language;
   %attr.altrep;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT description (#PCDATA)*>
   <!ATTLIST description
   %attr.language;
   %attr.altrep;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT geo (lat, lon)>

   <!ELEMENT lat (#PCDATA)>
   <!ATTLIST lat value NOTATION (FLOAT) #IMPLIED>
   <!-- A decimal degree float number to 6 decimal places -->

   <!ELEMENT lon (#PCDATA)>
   <!ATTLIST lon value NOTATION (FLOAT) #IMPLIED>
   <!-- A decimal degree float number to 6 decimal places -->

   <!ELEMENT location (#PCDATA)>

   <!ATTLIST location
   %attr.language;
   %attr.altrep;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT percent (#PCDATA)>
   <!ATTLIST percent
   value NOTATION (INTEGER) #IMPLIED>

   <!ELEMENT priority (#PCDATA)>
   <!ATTLIST priority
   value NOTATION (INTEGER) #IMPLIED>

   <!ELEMENT resources (#PCDATA)>
   <!ATTLIST resources
   %attr.language;
   %attr.altrep;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT status (#PCDATA)>
   <!ATTLIST status
   %attr.language;
   %attr.altrep;
   value NOTATION (TEXT) #IMPLIED>
   <!-- Text value must match the valid values for the particular -->
   <!-- calendar component. -->

   <!ELEMENT summary (#PCDATA)>
   <!ATTLIST summary
   %attr.language;
   %attr.altrep;
   value NOTATION (TEXT) #IMPLIED >

   <!-- Data and time component property element type declarations -->

   <!ELEMENT dtstart (#PCDATA)>
   <!ATTLIST dtstart
   %attr.tzid;
   value NOTATION (DATE-TIME | DATE) "DATE-TIME">

   <!ELEMENT dtend (#PCDATA)>
   <!ATTLIST dtend
   %attr.tzid;
   value NOTATION (DATE-TIME | DATE) "DATE-TIME">

   <!ELEMENT due (#PCDATA)>
   <!ATTLIST due
   %attr.tzid;
   value NOTATION (DATE-TIME | DATE) "DATE-TIME">

   <!ELEMENT completed (#PCDATA)>
   <!ATTLIST completed
   value NOTATION (DATE-TIME) #IMPLIED>

   <!ELEMENT duration (#PCDATA)>
   <!ATTLIST duration
   value NOTATION (DURATION) #IMPLIED>

   <!ELEMENT freebusy (#PCDATA)>
   <!ATTLIST freebusy
   %attr.fbtype;
   value NOTATION (PERIOD) #IMPLIED>

   <!ELEMENT transp (#PCDATA)>
   <!ATTLIST transp
   value NOTATION (TEXT) #IMPLIED>
   <!-- Text value must be one of the valid enumerations. -->

   <!-- Time zone component property element type declarations -->

   <!ELEMENT tzid (#PCDATA)>
   <!ATTLIST tzid
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT tzname (#PCDATA)>
   <!ATTLIST tzname
   %attr.language;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT tzoffsetfrom (#PCDATA)>
   <!ATTLIST tzoffsetfrom
   value NOTATION (UTC-OFFSET) #IMPLIED>

   <!ELEMENT tzoffsetto (#PCDATA)>
   <!ATTLIST tzoffsetto
   value NOTATION (UTC-OFFSET) #IMPLIED>

   <!ELEMENT tzurl EMPTY>
   <!ATTLIST tzurl
   uri ENTITY #REQUIRED>

   <!-- Relationship component property element type declarations -->

   <!ELEMENT attendee (#PCDATA)>
   <!ATTLIST attendee
   %attr.language;
   %attr.cn;
   %attr.role;
   %attr.partstat;
   %attr.rsvp;
   %attr.cutype;
   %attr.member;
   %attr.delegated-to;
   %attr.delegated-from;
   %attr.sent-by;
   %attr.dir;
   value NOTATION (CALADR) #IMPLIED>

   <!ELEMENT contact (#PCDATA)*>
   <!ATTLIST contact
   %attr.language;
   %attr.altrep;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT organizer (#PCDATA)>
   <!ATTLIST organizer
   %attr.language;
   %attr.cn;
   %attr.sent-by;
   %attr.dir;
   value NOTATION (CALADR) #IMPLIED>

   <!ELEMENT recurrence-id (#PCDATA)>
   <!ATTLIST recurrence-id
   %attr.tzid;
   %attr.range;
   value NOTATION (DATE-TIME | DATE) "DATE-TIME">

   <!ELEMENT related-to (#PCDATA)>
   <!ATTLIST related-to
   %attr.reltype;
   value NOTATION (TEXT) #IMPLIED>

   <!ELEMENT url EMPTY>
   <!ATTLIST url
   uri ENTITY #REQUIRED>

   <!ELEMENT uid (#PCDATA)>
   <!ATTLIST uid
   value NOTATION (TEXT) #IMPLIED>

   <!-- Recurrence component property element type declarations -->

   <!ELEMENT exdate (#PCDATA)>
   <!ATTLIST exdate
   %attr.tzid;
   value NOTATION (DATE-TIME | DATE) "DATE-TIME">

   <!ELEMENT exrule (#PCDATA)>
   <!ATTLIST exrule
   value NOTATION (RECUR) #IMPLIED>

   <!ELEMENT rdate (#PCDATA)>
   <!ATTLIST rdate
   %attr.tzid;
   value NOTATION (DATE-TIME | DATE) "DATE-TIME">

   <!ELEMENT rrule (#PCDATA)>
   <!ATTLIST rrule
   value NOTATION (RECUR) #IMPLIED>

   <!-- Alarm component property element type declarations -->

   <!ELEMENT action (#PCDATA)>
   <!ATTLIST action
   value NOTATION (TEXT) #IMPLIED>
   <!-- Text value must be a valid enumeration -->

   <!ELEMENT repeat (#PCDATA)>
   <!ATTLIST repeat
   value NOTATION (INTEGER) #IMPLIED>

   <!ELEMENT trigger (#PCDATA)>
   <!-- <!ATTLIST trigger
   %attr.related-to;
   value NOTATION (DURATION | DATE-TIME) "DURATION"> -->

   <!-- Change management component property element type -->
   <!-- declarations -->

   <!ELEMENT created (#PCDATA)>
   <!ATTLIST created
   value NOTATION (DATE-TIME) #IMPLIED>

   <!ELEMENT dtstamp (#PCDATA)>
   <!ATTLIST dtstamp
   value NOTATION (DATE-TIME) #IMPLIED>

   <!ELEMENT last-modified (#PCDATA)>
   <!ATTLIST last-modified
   value NOTATION (DATE-TIME) #IMPLIED>

   <!ELEMENT sequence (#PCDATA)>
   <!ATTLIST sequence
   value NOTATION (INTEGER) #IMPLIED>

   <!-- Miscellaneous component property element type declarations -->



   <!ELEMENT request-status (#PCDATA)>
   <!ATTLIST request-status
   %attr.language;
   value NOTATION (TEXT) #IMPLIED>

   <!-- iCalendar object element type declarations -->

   <!ELEMENT iCalendar (vcalendar+)>

   <!ELEMENT vcalendar (%cal.comp;)*>
   <!ATTLIST vcalendar
   %attr.language;
   xmlns CDATA #FIXED 'http://www.ietf.org/internet-drafts/draft-ietf-calsch-many-xcal-00.txt'
   calscale CDATA "GREGORIAN"
   method CDATA "PUBLISH"
   version CDATA #REQUIRED
   prodid CDATA #IMPLIED>
   <!-- version - Must be "2.0" if document conforms to this spec. -->
   <!-- calscale - Calendar scale. Default is GREGORIAN. -->
   <!-- method - C&S method. Default is iTIP PUBLISH. -->
   <!-- prodid - ISO 9070 FPI for product that generated iCalendar. -->

   <!-- "vevent" element type declaration -->
   <!ELEMENT vevent ((%vevent.opt1;)*, (%vevent.optm;)*, valarm*)>

   <!-- "vtodo" element type declaration -->
   <!ELEMENT vtodo ((%vtodo.opt1;)*, (%vtodo.optm;)*, valarm*)>

   <!-- "vjournal" element type declaration -->
   <!ELEMENT vjournal ((%vjournal.opt1;)*, (%vjournal.optm;)*)>

   <!-- "vfreebusy" element type declaration -->
   <!ELEMENT vfreebusy ((%vfreebusy.opt1;)*, (%vfreebusy.optm;)*)>

   <!-- "vtimezone" element type declaration -->
   <!ELEMENT vtimezone (%vtimezone.man;, (%vtimezone.opt1;)*,
   (%vtimezone.mann;)*)>

   <!ELEMENT standard (((%standard.man;)*), (%standard.optm;)*)>

   <!ELEMENT daylight (((%daylight.man;)*), (%daylight.optm;)*)>

   <!ELEMENT valarm ((%valarm.audio;) | (%valarm.display;) |
   (%valarm.email;) | (%valarm.procedure;))>


