Read holidays from an iCalendar-format file.

def _read_holidays(self, filename):
		"""
		Read holidays from an iCalendar-format file.
		"""
		cal = Calendar.from_ical(open(filename, 'rb').read())
		holidays = []

		for component in cal.walk('VEVENT'):
			start = component.decoded('DTSTART')
			try:
				end = component.decoded('DTEND')
			except KeyError:
				# RFC allows DTEND to be missing
				if isinstance(start, datetime):
					# For DATETIME instances, the event ends immediately.
					end = start
				elif isinstance(start, date):
					# For DATE instances, the event ends tomorrow
					end = start + timedelta(days=1)
				else:
					raise KeyError, 'DTEND is missing and DTSTART is not of DATE or DATETIME type'

			if isinstance(start, date) and not isinstance(start, datetime):
				assert (isinstance(end, date) and not isinstance(end, datetime)), \
					'DTSTART is of DATE type but DTEND is not of DATE type (got %r instead)' % type(end)
				# All-day event, set times to midnight local time
				start = datetime.combine(start, time.min)
				end = datetime.combine(end, time.min)

			# check for TZ data
			if start.tzinfo is None or end.tzinfo is None:
				# One of them is missing tzinfo, replace both with this office's
				# local time.  Assume standard time if ambiguous.
				start = self.tz.localize(start, is_dst=False)
				end = self.tz.localize(end, is_dst=False)

			yield (start, end)